web-dev-qa-db-fra.com

Erreur: ConnectionResult {statusCode = INTERNAL_ERROR, resolution = null}

Je développe l'application où j'intègre Google Drive dans mon application. Vous trouverez ci-dessous le code que j'ai simplement copié à partir de l'exemple de code, mais je reçois une exception lors de la connexion à Google Drive.

Exception: ConnectionResult{statusCode=INTERNAL_ERROR, resolution=null} dans la méthode onConnectionFailed ().

S'il vous plaît les gars partagent vos points de vue.

public class MainActivity extends Activity implements ConnectionCallbacks,
        OnConnectionFailedListener {

    private static final String TAG = "Android-drive-quickstart";
    private static final int REQUEST_CODE_CAPTURE_IMAGE = 1;
    private static final int REQUEST_CODE_CREATOR = 2;
    private static final int REQUEST_CODE_RESOLUTION = 3;

    private GoogleApiClient mGoogleApiClient;
    private Bitmap mBitmapToSave;

    /**
     * Create a new file and save it to Drive.
     */
    private void saveFileToDrive() {
        // Start by creating a new contents, and setting a callback.
        Log.i(TAG, "Creating new contents.");
        final Bitmap image = mBitmapToSave;
        Drive.DriveApi.newContents(mGoogleApiClient).addResultCallback(new OnNewContentsCallback() {

            @Override
            public void onNewContents(ContentsResult result) {
                // If the operation was not successful, we cannot do anything
                // and must
                // fail.
                if (!result.getStatus().isSuccess()) {
                    Log.i(TAG, "Failed to create new contents.");
                    return;
                }
                // Otherwise, we can write our data to the new contents.
                Log.i(TAG, "New contents created.");
                // Get an output stream for the contents.
                OutputStream outputStream = result.getContents().getOutputStream();
                // Write the bitmap data from it.
                ByteArrayOutputStream bitmapStream = new ByteArrayOutputStream();
                image.compress(Bitmap.CompressFormat.PNG, 100, bitmapStream);
                try {
                    outputStream.write(bitmapStream.toByteArray());
                } catch (IOException e1) {
                    Log.i(TAG, "Unable to write file contents.");
                }
                // Create the initial metadata - MIME type and title.
                // Note that the user will be able to change the title later.
                MetadataChangeSet metadataChangeSet = new MetadataChangeSet.Builder()
                        .setMimeType("image/jpeg").setTitle("Android Photo.png").build();
                // Create an intent for the file chooser, and start it.
                IntentSender intentSender = Drive.DriveApi
                        .newCreateFileActivityBuilder()
                        .setInitialMetadata(metadataChangeSet)
                        .setInitialContents(result.getContents())
                        .build(mGoogleApiClient);
                try {
                    startIntentSenderForResult(
                            intentSender, REQUEST_CODE_CREATOR, null, 0, 0, 0);
                } catch (SendIntentException e) {
                    Log.i(TAG, "Failed to launch file chooser.");
                }
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mGoogleApiClient == null) {
            // Create the API client and bind it to an instance variable.
            // We use this instance as the callback for connection and connection
            // failures.
            // Since no account name is passed, the user is prompted to choose.
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(Drive.API)
                    .addScope(Drive.SCOPE_FILE)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
        }
        // Connect the client. Once connected, the camera is launched.
        mGoogleApiClient.connect();
    }

    @Override
    protected void onPause() {
        if (mGoogleApiClient != null) {
            mGoogleApiClient.disconnect();
        }
        super.onPause();
    }

    @Override
    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        switch (requestCode) {
            case REQUEST_CODE_CAPTURE_IMAGE:
                // Called after a photo has been taken.
                if (resultCode == Activity.RESULT_OK) {
                    // Store the image data as a bitmap for writing later.
                    mBitmapToSave = (Bitmap) data.getExtras().get("data");
                }
                break;
            case REQUEST_CODE_CREATOR:
                // Called after a file is saved to Drive.
                if (resultCode == RESULT_OK) {
                    Log.i(TAG, "Image successfully saved.");
                    mBitmapToSave = null;
                    // Just start the camera again for another photo.
                    startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
                            REQUEST_CODE_CAPTURE_IMAGE);
                }
                break;
        }
    }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // Called whenever the API client fails to connect.
        Log.i(TAG, "GoogleApiClient connection failed: " + result.toString());
        if (!result.hasResolution()) {
            // show the localized error dialog.
            GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 0).show();
            return;
        }
        // The failure has a resolution. Resolve it.
        // Called typically when the app is not yet authorized, and an
        // authorization
        // dialog is displayed to the user.
        try {
            result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);
        } catch (SendIntentException e) {
            Log.e(TAG, "Exception while starting resolution activity", e);
        }
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        Log.i(TAG, "API client connected.");
        if (mBitmapToSave == null) {
            // This activity has no UI of its own. Just start the camera.
            startActivityForResult(new Intent(MediaStore.ACTION_IMAGE_CAPTURE),
                    REQUEST_CODE_CAPTURE_IMAGE);
            return;
        }
        saveFileToDrive();
    }

    @Override
    public void onDisconnected() {
        Log.i(TAG, "API client disconnected.");
    }

}
17
N Sharma

J'ai résolu le problème en enregistrant l'application et en générant l'empreinte de certificat de signature.

https://developers.google.com/drive/Android/auth#generate_the_signing_certificate_fingerprint_and_register_your_application

J'ai suivi les liens ci-dessus et cela a résolu mon problème.

9
N Sharma

_ {Attention! Il y a un problème dans la console des développeurs.

Si vous rencontrez ce bogue même après 1) en vous assurant que vous avez enregistré le nom du paquet avec son empreinte digitale correspondante certificate, et 2) utilisez (ré )z un projet déjà existant, alors vous devriez vérifier que ce projet a un nom du produit et un adresse email (vérifiez que celui-ci a été spécialement créé) qui lui est associé, les deux se trouvant dans le répertoire. Section "écran de consentement} _".

Les projets très anciens peuvent ne pas avoir ces deux champs remplis. Les nouveaux projets ont ces champs remplis avec des valeurs par défaut.

Il m'a fallu un jour pour trouver ceci ...

enter image description here

25
Daniel F

Je résous ce problème en signant mon application Google Drive sur la console API en procédant comme suit

  1. Accédez à la console Google Developers.
  2. Sélectionnez un projet ou créez-en un nouveau.
  3. Dans la barre latérale à gauche, développez API et authentification. Ensuite, cliquez sur API.
  4. Dans la liste des API, assurez-vous que l'état est activé pour l'API de lecteur.
  5. Dans la barre latérale de gauche, sélectionnez Informations d'identification.

Si votre application doit soumettre des demandes autorisées:

  1. Sous OAuth, cliquez sur Créer un nouvel ID client.
  2. Sélectionnez Application installée et Android.
  3. Dans le champ Nom du package, entrez le nom du package de votre application Android.
  4. Collez l'empreinte SHA1 dans le formulaire à la demande.
  5. Cliquez sur Créer un ID client.
10
yasir shehzad

Pour moi le problème était que quand dans l'exemple il y avait:

.addApi(Drive.API)

Et je n'ai pas ajouté le lecteur api dans la console 

ce message d'erreur m'a aidé à comprendre le problème

com.google.Android.gms.drive.auth.c: échec de l'autorisation: serveur a renvoyé l'erreur: Accès non configuré. L'API n'est pas activé pour votre projet ou une restriction par IP ou par référent est configurée sur votre clé API et la demande ne correspondent pas à ces restrictions. S'il vous plaît utilisez la console Google Developers pour mettre à jour votre configuration. Voir https://developers.google.com/drive/handle-errors pour plus de détails.

4
jpprade

N'oubliez pas les autorisations:

<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
4
alnassre

Avez-vous des messages d'erreur dans logcat? La cause la plus probable d'un échec de la connexion est que vous n'avez pas correctement configuré une application dans la console cloud. 

Voir les instructions ici: https://developers.google.com/drive/Android/auth

3
Cheryl Simon

Dans mon cas, j'ai dû modifier l'ID client pour utiliser le nom exact du package de la classe d'activité générant l'objet GoogleApiClient, et non un package de niveau supérieur.

2
Pablo Carbajal

J'avais aussi la même erreur. Pour mon projet, l’API de lecteur n’était pas activée sous API & auth -> API . Après avoir activé cette API de lecteur, ce problème a été résolu.

2
Robin Singh

J'ai résolu d'ajouter cette ligne à gradle:

compile 'com.google.Android.gms:play-services-identity:8.1.0'
1
csamiro

Dans Android Studio, allez à

Outil-> Gestionnaire de SDK Android -> Service Google Play

Mettre à jour le Service Google Play..Je suis sûr que ça va marcher

0
Prashant Date

Vous devez disposer de deux ID client distincts, l’un pour le débogage et l’autre pour la publication. Parfois nous manquons l'évidence. 

0
goodhyun

J'ai eu le même problème que ci-dessus, quand j'ai déplacé une application existante d'Eclipse vers Android Studio. Mon problème était que j'ai nommé applicationId différent de l'identifiant du paquet. Changer applicationId pour qu'il soit identique au nom du package a résolu le problème.

0
Skywalker