我使用Xamarin創建了使用GCM的android應用程序。 我跟着this guide from Xamarin team然後this guide from Google teamSERVICE_NOT_AVAILABLE在使用Xamarin for Android註冊Google Cloud Messaging時
在我實現Xamarin版本的Gcm之後,我根本沒有在我的BroadcaseReceiver.OnReceive上收到任何東西。這裏是清單和廣播接收器
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"
package="com.pushtest.droid"
android:versionCode="1"
android:versionName="1">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission android:name="com.pushtest.droid.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
<uses-permission android:name="com.pushtest.droid.permission.C2D_MESSAGE" />
<application android:label="push droid"/>
</manifest>
廣播接收器:
[BroadcastReceiver(Permission = "com.google.android.c2dm.permission.SEND")]
[IntentFilter(new[] {"com.google.android.c2dm.intent.RECEIVE"}, Categories = new[] {"com.pushtest.droid"})]
[IntentFilter(new[] {"com.google.android.c2dm.intent.REGISTRATION"}, Categories = new[] {"com.pushtest.droid"})]
[IntentFilter(new[] {"com.google.android.gcm.intent.RETRY"}, Categories = new[] {"com.pushtest.droid"})]
public class MyGcmBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
System.Diagnostics.Debug.WriteLine("MyGcmBroadcastReceiver.OnReceive");
if (intent.Action == "com.google.android.c2dm.intent.REGISTRATION")
{
var registrationId = intent.GetStringExtra("registration_id");
var error = intent.GetStringExtra("error");
var unregistered = intent.GetStringExtra("unregistered");
System.Diagnostics.Debug.WriteLine("!!!! Registration status |R: {0}|E: {1}|U: {2}", registrationId, error, unregistered);
}
else if (intent.Action == "com.google.android.c2dm.intent.RECEIVE")
{
System.Diagnostics.Debug.WriteLine("!!!! Push Received: |TBD|");
}
}
}
當我開始打算我只是沒有 - 沒有錯誤,沒有調試信息,沒有結果:
private void RegisterForGcm(Context context)
{
const string SenderId = "PROJECT_ID_FROM_GOOGLE_CONSOLE";
var appExtra = PendingIntent.GetBroadcast(context, 0, new Intent(), 0);
var intent = new Intent("com.google.android.c2dm.intent.REGISTER");
intent.PutExtra("app", appExtra);
intent.PutExtra("sender", SenderId);
context.StartService(intent);
}
然後我去認爲谷歌的指導終於得到了註冊響應error =「SERVICE_NOT_AVAILABLE」:
沒有額外的字符串(沒有registraion_id)。調試信息: !!!!註冊狀態| R:| E:SERVICE_NOT_AVAILABLE | U:
這裏是我的清單和廣播接收器(意向開始是相同的):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"
package="com.pushtest.droid"
android:versionCode="1"
android:versionName="1">
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<permission android:name="com.pushtest.droid.permission.C2D_MESSAGE" android:protectionLevel="signature"/>
<uses-permission android:name="com.pushtest.droid.permission.C2D_MESSAGE" />
<application android:label="push droid">
<receiver android:name="com.pushtest.droid.MyGcmBroadcastReceiver"
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" />
<action android:name="com.google.android.gcm.intent.RETRY" />
<category android:name="com.pushtest.droid" />
</intent-filter>
</receiver>
</application>
</manifest>
和廣播接收器(沒有任何屬性)
public class MyGcmBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
System.Diagnostics.Debug.WriteLine("MyGcmBroadcastReceiver.OnReceive");
if (intent.Action == "com.google.android.c2dm.intent.REGISTRATION")
{
var registrationId = intent.GetStringExtra("registration_id");
var error = intent.GetStringExtra("error");
var unregistered = intent.GetStringExtra("unregistered");
System.Diagnostics.Debug.WriteLine("!!!! Registration status |R: {0}|E: {1}|U: {2}", registrationId, error, unregistered);
}
else if (intent.Action == "com.google.android.c2dm.intent.RECEIVE")
{
System.Diagnostics.Debug.WriteLine("!!!! Push Received: |TBD|");
}
}
}
測試示例在這裏: https://dl.dropboxusercontent.com/u/19503836/pushtest-issue.zip
我正在嘗試此代碼在我的Android 2.3.6設備 任何幫助非常感謝。
TIA!
你有手機上的谷歌帳戶? – TombMedia
是的,我可以使用此已配置的帳戶訪問Google Play商店 –
並且您已將此應用程序註冊到GCM以獲取API訪問權限嗎?你可以將代碼發佈到你的intentservice嗎? – TombMedia