在我的项目中,我使用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();
}
}
解决方案(在我的情况下):
更改应用类:
@覆盖 protected void attachBaseContext(Context base){ super.attachBaseContext(基峰); MultiDex.install(本); }
答案 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>