Google Play服务致命错误

时间:2016-02-24 06:39:17

标签: android google-cloud-messaging

在我的项目中,我使用GCM从服务器发送推送通知。

我愚蠢的指示https://developers.google.com/android/guides/setup在我的项目中添加Google Play服务。

一切都在我的设备上正常工作(Galaxy NOTE S3),但是当我开始测试另一个模拟器(包括genymotion)时,我得到致命错误:

FATAL EXCEPTION: main
java.lang.NoClassDefFoundError: com.google.android.gms.R$string
at com.google.android.gms.measurement.zza.<init>(Unknown Source)
at com.google.android.gms.measurement.zza.zzaR(Unknown Source)
at com.google.android.gms.measurement.internal.zzn.zziJ(Unknown Source)
at com.google.android.gms.measurement.internal.zzz.zza(Unknown Source)
at com.google.android.gms.measurement.internal.zzw.<init>(Unknown Source)
at com.google.android.gms.measurement.internal.zzaa.zzDj(Unknown Source)
at com.google.android.gms.measurement.internal.zzw.zzaT(Unknown Source)
at com.google.android.gms.measurement.AppMeasurementContentProvider.onCreate(Unknown Source)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1058)
at android.app.ActivityThread.installProvider(ActivityThread.java:4560)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4190)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4132)
at android.app.ActivityThread.access$1300(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

我通过方法检查可用性:

public static boolean checkPlayServices(Activity activity) {

    GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
    int resultCode = apiAvailability.isGooglePlayServicesAvailable(activity);
    if (resultCode != ConnectionResult.SUCCESS) {
        if (apiAvailability.isUserResolvableError(resultCode)) {
            apiAvailability.getErrorDialog(activity, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST)
                    .show();
        }
        return false;
    }
    return true;

}

在MainActitvity.class的onResume中调用此方法:

@Override
protected void onResume() {
    super.onResume();

    if(SMSSenderHelper.checkPlayServices(this)){
        startService(new Intent(this, RegistrationIntentService.class));
    }else{
        finish();
    }
}

解决方案(在我的情况下):

  1. 查看您的build.gradle
  2. 更改应用类:

    @覆盖 protected void attachBaseContext(Context base){     super.attachBaseContext(基峰);     MultiDex.install(本); }

2 个答案:

答案 0 :(得分:0)

您是否在模拟器中看到了任何Google相关应用(例如:Google Play商店,Gmail ...)?如果没有,您的模拟器不会包含Google service,因此会发生Exception。尝试安装Gapps for your genymotion,然后重试。

编辑: 您是否添加了Google guidline之类的Google Play服务库? 来自Google guidline的注释(模拟器4.2.2及更高版本):

  

要在使用Google Play服务SDK时测试您的应用,您必须使用   之一:

     

运行Android 2.3或更高版本的兼容Android设备   包括Google Play商店。

     

运行AVD的Android模拟器   基于Android 4.2.2或更高版本的Google API平台。

答案 1 :(得分:0)

如果要使用GCMListenerService,这是您必须在Manifest文件中定义的一些代码行:

<receiver
            android:name="com.google.android.gms.gcm.GcmReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />

                <category android:name="training.com.chatgcmapplication" />
            </intent-filter>
        </receiver>

        <service
            android:name="training.com.services.MessageListenerService"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="android.intent.action.PHONE_STATE" />
            </intent-filter>
        </service>