0

Im в настоящее время делает приложение для Android на основе gcm. Когда я запускаю на реальном устройстве, он не обнаружил никаких ошибок, и я могу отправлять сообщения (журналы GAE также показывают/отправляют инструкцию). Проблема в том, что другое устройство не получало никаких сообщений. Я обращаюсь к журналам GAE, и он doest показывает любую инструкцию/register. Когда я запускаю эмулятор, я получу эту ошибку.GCM: Устройство может отправлять сообщение, но не зарегистрировано

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 (значение = "ком. google.android.c2dm.permission.RECEIVE ") @Deprecated

Я уже упоминал о разрешении в манифесте android, но все же линия не исчезла.

Android Manifest:

<?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> 
+0

Можете ли вы показать нам манифеста пожалуйста? – Klatschen

+0

Я добавил файл манифеста, пожалуйста, посмотрите .. –

+0

Можете ли вы показать строку 142 в GcmUtil.java? – Klatschen

ответ

1

В учебнике вы будете следовать слишком стар. Проверьте сообщение от разработчиков Google для пути:

GCM регистр() является устаревшим, начиная 28 мая 2015 Новое приложение развития следует использовать Instance ID API для обработки создания, поворот и обновление регистрационных маркеров.

Source

Таким образом, ее рекомендуют следовать этому руководству от разработчиков Google: Guide

С уважением

+0

Я попробовал решение, которое вы мне дали и все еще получил ту же ошибку. Код gcm.register() устарел, который имеет горизонтальную линию/ударил по нему. Есть ли способ удалить его? –

+0

учебник, который следует за мной: https://github.com/erikswed/InstaChatX –

+0

Я отредактировал мой ответ – Klatschen

Смежные вопросы