wake-up-neo.net

GooglePlayServicesUtil.getErrorDialog ist null

Ich verwende ACRA ( arca.ch ), um automatische Fehlerberichte zu erstellen.

Ich habe gerade eine neue Version meiner App mit Google Maps Android API v2 veröffentlicht. Beim Versuch, das von GooglePlayServicesUtil.getErrorDialog zurückgegebene Dialogfeld anzuzeigen, wird von Benutzern von EEEPad und Transformer Pad ein Fehler gemeldet. Weiß jemand, warum das passieren könnte?

Hier ist der relevante Code und Logcat, wie von acra gemeldet:

Während Sie diese Zeile anrufen:

int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if(resultCode != ConnectionResult.SUCCESS)
{
        //The dialog that comes back is null (probably due to the logcat message)
        Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode, this, 69);
        //So when I call the next line, the app crashes with a NullPointerException
        dialog.show();
}
...

Logcat:

12-18 04:21:04.531 W/GooglePlayServicesUtil( 3977): Google Play Store signature invalid.
12-18 04:21:04.551 E/GooglePlayServicesUtil( 3977): Google Play services is invalid. Cannot recover.

Vielen Dank im Voraus für Ihre Hilfe.

Update

Das Problem wurde von Google noch nicht gelöst, und ich werde diese Frage aktualisieren, sobald ich etwas höre (siehe die Antwort von CommonsWare für den Link zu Google Bug-Berichten). In der Zwischenzeit, wenn Sie auf dieses Problem stoßen und nicht möchten, dass Ihre App abstürzt, tun Sie Folgendes:

public void checkGooglePlayServicesAvailability()
{
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if(resultCode != ConnectionResult.SUCCESS)
    {
        Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode, this, 69);
        if(dialog != null)
        {
            dialog.show();                
        }
        else
        {
            showOkDialogWithText(this, "Something went wrong. Please make sure that you have the Play Store installed and that you are connected to the internet. Contact developer with details if this persists.");
        }
    }

    Log.d("GooglePlayServicesUtil Check", "Result is: " + resultCode);
}

public static void showOkDialogWithText(Context context, String messageText)
{
    Builder builder = new AlertDialog.Builder(context);
    builder.setMessage(messageText);
    builder.setCancelable(true);
    builder.setPositiveButton("OK", null);
    AlertDialog dialog = builder.create();
    dialog.show();
}
36
DiscDev

Google empfiehlt (auch in docs ) den Aufruf von getErrorDialog(), wenn der Ergebniscode SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED oder SERVICE_DISABLED lautet. Möglicherweise verursacht der letzte mögliche Statuscode (SERVICE_INVALID) Probleme.

Ich verwende den folgenden Code und bisher scheint es in Ordnung zu sein (Testen im Emulator, Plattform 2.3.3):

int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(activity.getApplicationContext());
if (resultCode == ConnectionResult.SUCCESS) {
    activity.selectMap();
} else if (resultCode == ConnectionResult.SERVICE_MISSING ||
           resultCode == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED ||
           resultCode == ConnectionResult.SERVICE_DISABLED) {
    Dialog dialog = GooglePlayServicesUtil.getErrorDialog(resultCode, activity, 1);
    dialog.show();
}
37
Nevermore

Anscheinend müssen Sie sich mit isUserRecoverableError erkundigen, bevor Sie versuchen, den Dialog anzuzeigen.

  int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
  if (status != ConnectionResult.SUCCESS) {
    if (GooglePlayServicesUtil.isUserRecoverableError(status)) {
      GooglePlayServicesUtil.getErrorDialog(status, this, 
      REQUEST_CODE_RECOVER_PLAY_SERVICES).show();
    } else {
      Toast.makeText(this, "This device is not supported.", 
          Toast.LENGTH_LONG).show();
      finish();
    }
  }
22
Rahim

Basierend auf Rahims Code füge ich die Möglichkeit hinzu, den Benutzer daran zu hindern, den Google Play Services-Dialog zu schließen (durch Drücken der Zurück-Taste) und die App ohne installierte Google Play Services weiter zu verwenden:

private void checkGooglePlayServicesAvailable() {
    int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (status != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(status)) {
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, 0);
            dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialogInterface) {
                    MainActivity.this.finish();
                }
            });
            dialog.show();
        } else {
            Toast.makeText(this, "This device is not supported.", Toast.LENGTH_LONG).show();
            finish();
        }
    }
}
8
Daniele B

Eine Aktualisierung der Antwort von @Nevermore , da GooglePlayServicesUtil-Methoden zugunsten von GoogleApiAvailability veraltet sind: 

GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance();
int resultCode = googleApiAvailability.isGooglePlayServicesAvailable(activity.getApplicationContext());
if (resultCode == ConnectionResult.SUCCESS) {
    activity.selectMap();
} else if (resultCode == ConnectionResult.SERVICE_MISSING ||
           resultCode == ConnectionResult.SERVICE_VERSION_UPDATE_REQUIRED ||
           resultCode == ConnectionResult.SERVICE_DISABLED) {
    Dialog dialog = googleApiAvailability.getErrorDialog(activity, resultCode, 1);
    dialog.show();
}

Beachten Sie, dass die Reihenfolge der ersten beiden Parameter in getErrorDialog() in der Implementierung von GoogleApiAvailability umgeschaltet wurde.

0
DaveAlden