it-swarm.dev

GooglePlayServicesUtil.getErrorDialog boş

Otomatik hata raporları oluşturmak için ACRA ( arca.ch ) kullanıyorum.

Google Haritalar Android API v2'yi kullanarak uygulamamın yeni bir sürümünü yayımladım. GooglePlayServicesUtil.getErrorDialog tarafından döndürülen iletişim kutusunu göstermeye çalışırken EEEPad ve Transformer Pad kullanıcıları tarafından bildirilen bir hatayla karşılaşıyorum. Bunun neden olabileceğini bilen var mı?

İşte acra tarafından bildirilen ilgili kod ve Logcat:

Bu hattı çağırırken:

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.

Sağlayabileceğiniz her türlü yardım için şimdiden teşekkür ederiz.

Güncelle

Sorun henüz google tarafından çözülmedi ve bir şey duyduğumda bu soruyu güncelleyeceğim (CommonsWare’in Google Bug raporu için verdiği bağlantıya bakın). Bu arada, bu sorunla karşılaşırsanız ve uygulamanızın çökmesini istemiyorsanız, şu an için şu anda ne yapıyorum:

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 sonuç kodu SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED veya SERVICE_DISABLED ise, (ayrıca docs ) içinde getErrorDialog() işlevini çağırmayı önerir. Bu nedenle, mümkün olan son durum kodu (SERVICE_INVALID) sorun yaratan şey olabilir.

Aşağıdaki kodu kullanıyorum ve şimdiye kadar iyi görünüyor (emülatör, platform 2.3.3'de test):

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

İletişim kutusunu görüntülemeye çalışmadan önce isUserRecoverableError ile kontrol etmeniz gerekiyor gibi görünüyor.

  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

Rahim'in koduna dayanarak, kullanıcının Google Play Servisleri iletişim kutusunu kapatmasını (geri düğmesine basarak) engelleme ve Google Play Servisleri kurulu olmadan uygulamayı kullanmaya devam etme özelliğini ekliyorum:

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

@Nevermore tarafından verilen yanıtın GooglePlayServicesUtil yöntemleri GoogleApiAvailability lehine kaldırıldığı için bir güncelleme: 

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();
}

getErrorDialog() içindeki ilk iki parametrenin sırasının, GoogleApiAvailability uygulamasında değiştirildiğine dikkat edin.

0
DaveAlden