GooglePlayServicesUtil.getErrorDialog为null

我正在使用ACRA( arca.ch )来生成自动错误报告。

我刚刚使用Google Maps Android API v2发布了我的应用程序的新版本。 当试图显示由GooglePlayServicesUtil.getErrorDialog返回的对话框时,EEEPad和Transformer Pad用户报告了错误。 有谁知道为什么会发生这种情况?

以下是acra报告的相关代码和Logcat:

在调用这一行时:

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. 

预先感谢您提供的任何帮助。

更新

谷歌还没有解决这个问题,一旦我听到了什么,我会更新这个问题(请参阅CommonsWare对于Google Bug报告链接的回答)。 与此同时,如果你遇到这个问题,不希望你的应用程序崩溃,这是我正在做的暂时:

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

如果结果代码是SERVICE_MISSINGSERVICE_VERSION_UPDATE_REQUIREDSERVICE_DISABLED ,Google build议 (也在文档中 )调用getErrorDialog() 。 所以可能是最后一个可能的状态码( SERVICE_INVALID )是什么原因造成的。

我正在使用下面的代码,到目前为止似乎工作正常(在模拟器,平台2.3.3testing):

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

好像你必须检查isUserRecoverableError然后才显示对话框。

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

根据Rahim的代码,我添加了阻止用户closuresGoogle Play服务对话框的function(通过点击后退button),并在未安装Google Play服务的情况下继续使用该应用程序:

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

由@Nevermore更新答案,因为GooglePlayServicesUtil方法不赞成使用GoogleApiAvailability

 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()前两个参数的顺序已经在GoogleApiAvailability实现中切换了。