我和我的朋友正在开发一个 Android 应用程序并实现了 GCM 所需的一切。在我的设备 (Nexus 4) 上,消息的注册和接收可以通过 WiFi 和蜂窝网络正常工作。但是,如果我的朋友尝试注册他的设备(Xperia Z),它会通过蜂窝网络失败,并且他会收到 SERVICE_NOT_AVAILABLE 错误。通过 WiFi,注册和消息接收也可以在他的设备上正常工作。如果他在 WiFi 上注册他的设备,然后切换回蜂窝数据,他将不会收到任何消息!
我们没有足够的设备来测试是他的设备有问题还是我们的应用程序有问题,所以我们希望您能帮助我们。这是我们项目的一些文件,如果您需要更多详细信息,我会在之后添加它们。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.mypackage.vorlesungsplan.app"
android:versionCode="0010201"
android:versionName="1.2.1 (Raw Potato)" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<permission android:name="de.mypackage.vorlesungsplan.app.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="de.mypackage.vorlesungsplan.app.C2D_MESSAGE" />
<supports-screens android:normalScreens="true" android:xlargeScreens="true" android:largeScreens="true" android:smallScreens="false"/>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:allowBackup="false" >
<activity
android:name="MainActivity"
android:label="@string/title_activity_startup" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="SettingsActivity" android:label="Einstellungen" android:screenOrientation="portrait"></activity>
<activity android:name="InfoHelpActivity" android:screenOrientation="portrait"></activity>
<activity android:name="LunchActivity" android:screenOrientation="portrait"></activity>
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
<receiver
android:name=".io.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="de.mypackage.vorlesungsplan.app" />
</intent-filter>
</receiver>
<service android:name=".io.GCMIntentService" />
</application>
</manifest>
register() 方法在后台进程上执行,就像文档所假装的那样。因此我们使用了普通线程而不是 AsyncTask,但我认为这不会导致问题。以下类扩展了 Thread 类:
注册服务器操作.java
public void run() {
...
if(checkPlayServices()) {
Logbook.d("Device is GCM capable");
// Hole die regId des Geräts oder erzeuge eine neue
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(activity);
String regId = Settings.getInstance(activity).getSetting("regId");
if (regId == null || regId.isEmpty()) {
regId = gcm.register(SENDER_ID);
Settings.getInstance(activity).setSetting("regId", regId);
}
Logbook.d("Registration id for this device is: "+regId);
} else {
throw new Exception("REGISTRATION_FAILED");
}
...
}
checkPlayServices() 方法是从 Google 示例中复制的,也应该是正确的,因为“设备支持 GCM”字符串出现在 logcat 中。Settings 类是我们自己的用于保存设置的实现,而 Logbook 类只是 android.util.Log 的包装类。我的朋友还使用 DDMS 捕获了他的网络流量:
第一个峰值是由我们的应用程序在开始时发送的正常 http 请求引起的。这证明他的蜂窝网络连接在这一刻是可行的。在此之后应该有另一个由 gcm.register(...) 方法引起的峰值,但是什么也没有。
我们使用以下版本的 google_play_services_lib 项目构建了该应用程序:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer name="google_play_services_version">4132500</integer>
</resources>
安装在他的设备上的 Google Play 服务是最新的(版本 4.1.32)。他的 Android 版本是 4.3,它是索尼股票 ROM。我的 Nexus 4 运行每晚构建的 CM 11(所以它是 Android 4.4.2)。
请记住,同一个应用程序在 wifi 上正常工作,但在蜂窝网络上却不能正常工作。这让我们俩都感到困惑,我们尝试了许多解决问题的方法,但都没有改善我们的情况。
我希望有人可以帮助我们,谢谢