簡體   English   中英

GCM:設備可以發送消息但未注冊

[英]GCM:Device can send message but not registered

我目前正在基於gcm制作一個android應用。當我在真實設備上運行時,它沒有顯示任何錯誤並且可以發送消息(GAE日志還顯示/ send語句)。問題是另一台設備沒有收到任何消息。到GAE日志,它不顯示任何/ register語句。當我在模擬器上運行時,我會收到此錯誤。

04-12 14:56:38.897: E/AndroidRuntime(1181): java.lang.RuntimeException: An error occured while executing doInBackground()
04-12 14:56:38.897: E/AndroidRuntime(1181):     at android.os.AsyncTask$3.done(AsyncTask.java:300)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at java.lang.Thread.run(Thread.java:841)
04-12 14:56:38.897: E/AndroidRuntime(1181): Caused by: java.lang.NullPointerException
04-12 14:56:38.897: E/AndroidRuntime(1181):     at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at com.example.gcm.GcmUtil$1.doInBackground(GcmUtil.java:142)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at com.example.gcm.GcmUtil$1.doInBackground(GcmUtil.java:1)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
04-12 14:56:38.897: E/AndroidRuntime(1181):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
04-12 14:56:38.897: E/AndroidRuntime(1181):     ... 4 more

代碼是:

  private void registerBackground() {
    registrationTask = new AsyncTask<Void, Void, Boolean>() {

        @Override
        protected Boolean doInBackground(Void... params) {
            long backoff = BACKOFF_MILLI_SECONDS + random.nextInt(1000);
            for (int i = 1; i <= MAX_ATTEMPTS; i++) {
                //Log.d(TAG, "Attempt #" + i + " to register");
                try {
                    if (gcm == null) {
                        gcm = GoogleCloudMessaging.getInstance(ctx);
                    }
                    String regid = gcm.register(Common.getSenderId());

                    ServerUtilities.register(Common.getPreferredEmail(),
                    regid);

                    // Save the regid - no need to register again.
                    setRegistrationId(regid);
                    return Boolean.TRUE;

                } catch (IOException ex) {
                    //Log.e(TAG, "Failed to register on attempt " + i + ":"
                    + ex);
                    if (i == MAX_ATTEMPTS) {
                        break;
                    }
                    try {
                        //Log.d(TAG, "Sleeping for " + backoff + " ms before
                        retry");
                        Thread.sleep(backoff);
                    } catch (InterruptedException e1) {
                        // Activity finished before we complete - exit.
                        //Log.d(TAG, "Thread interrupted: abort remaining
                        retries!");
                        Thread.currentThread().interrupt();
                    }
                    // increase backoff exponentially
                    backoff *= 2;                       
                }
            }
            return Boolean.FALSE;
        }

注意:我注意到gcm.register上的寄存器上有一條水平線...當我將鼠標懸停在它上面時,它說@RequiresPermission(value =“ com.google.android.c2dm.permission.RECEIVE”)@

我已經在android清單中提到了權限,但是該行並沒有消失。

Android清單:

  <?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.heylo"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="15" />

<permission
    android:name="com.example.heylo.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.example.heylo.permission.C2D_MESSAGE" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

<uses-permission android:name="android.permission.READ_CONTACTS" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>

<uses-permission android:name="android.permission.WAKE_LOCK" >
</uses-permission>

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >      
</uses-permission>

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>

<application
    android:name="com.example.heylo.Common"
    android:allowBackup="true"
    android:icon="@drawable/ic_splash"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
    </activity>

    <activity android:name=".SplashScreen" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <receiver
        android:name="com.example.gcm.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />

            <category android:name="com.example.heylo" />
        </intent-filter>
    </receiver>

    <provider
        android:name="com.example.heylo.DataProvider"
        android:authorities="com.example.heylo.provider"
        android:exported="false" >
    </provider>

    <activity
        android:name=".Message_List"
        android:label="@string/title_activity_message__list" >
    </activity>

    <activity
        android:name=".SettingsActivity"
        android:label="@string/title_activity_settings" >
    </activity>

</application>

</manifest>

您遵循的教程太舊了。 查看Google開發人員發送給您的消息:

自2015年5月28日起,不再支持GCM register()。新的應用開發應使用Instance ID API來處理注冊令牌的創建,輪換和更新。

資源

因此,建議您遵循Google開發人員的以下指南指南

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM