2016-06-27 6 views
2

Ich habe eine einfache Android-App, die das GCM-Registrierungstoken erwirbt und an einen PHP-Server sendet, damit der Server eine Benachrichtigung an die App sendet.Ich kann keine Benachrichtigung vom GCM-Server nach der Neuformatierung des Geräts erhalten

Im Folgenden sind mein Arbeitscode:

Meine RegistrationIntentService Klasse:

public class RegistrationIntentService extends IntentService { 
    private static final String TAG = "RegistrationIntentService"; 
    private static final String pathToServer = "http://192.168.5.200/phpserverside/registeruser.php"; 

    public RegistrationIntentService() { 
     super(TAG); 
    } 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 

     try { 
      // Initially this call goes out to the network to retrieve the token, subsequent calls are local. 
      // R.string.gcm_defaultSenderId (the Sender ID) is typically derived from google-services.json. 
      InstanceID instanceID = InstanceID.getInstance(this); 
      String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 
      Log.i(TAG, "GCM Registration Token: " + token); 
      postData(token); 
      // You should store a boolean that indicates whether the generated token has been 
      // sent to your server. If the boolean is false, send the token to your server, 
      // otherwise your server should have already received the token. 
      sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, true).apply(); 
     } catch (Exception e) { 
      Log.d(TAG, "Failed to complete token refresh", e); 
      // If an exception happens while fetching the new token or updating our registration data 
      // on a third-party server, this ensures that we'll attempt the update at a later time. 
      sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false).apply(); 
     } 
     // Notify UI that registration has completed, so the progress indicator can be hidden. 
     Intent registrationComplete = new Intent(QuickstartPreferences.REGISTRATION_COMPLETE); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete); 
    } 


    public static String postData(String token) { 
     // Create a new HttpClient and Post Header 
     String _response = ""; 

     String uristr = pathToServer; 
     Log.v(TAG, "URI: " + uristr); 
     if(uristr!=null){ 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpParams params = httpclient.getParams(); 
      HttpConnectionParams.setConnectionTimeout(params, 10000); 
      HttpConnectionParams.setSoTimeout(params, 10000); 
      HttpPost httppost = new HttpPost(uristr); 

      Log.d(TAG, "1 wit username: " + token); 
      try { 
       // Add your data 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
       nameValuePairs.add(new BasicNameValuePair("registrationId", token)); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

       // Execute HTTP Post Request 
       HttpResponse response = httpclient.execute(httppost); 
       InputStream inputStream = response.getEntity().getContent(); 
       InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
       BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
       StringBuilder stringBuilder = new StringBuilder(); 
       String bufferedStrChunk = null; 

       while((bufferedStrChunk = bufferedReader.readLine()) != null){ 
        stringBuilder.append(bufferedStrChunk); 
       } 
       _response = stringBuilder.toString(); 
      } catch (ClientProtocolException e) { 
       Log.d(TAG,e.toString()); 
       _response = ""; 
       // TODO Auto-generated catch block 
      } catch (IOException e) { 
       Log.d(TAG,e.toString()); 
       _response = ""; 
       // TODO Auto-generated catch block 
      } 
      Log.v(TAG, "response: " + _response); 
      Log.v("reply of the server: ",_response); 
      return _response ; 
     } 
     return ""; 
    } 

} 

Meine MyGcmListenerService Klasse:

public class MyGcmListenerService extends GcmListenerService { 
    private static final String TAG = "MyGcmListenerService"; 
    @Override 
    public void onMessageReceived(String from, Bundle data) { 
     //super.onMessageReceived(from, data); 
     String message = data.getString("message"); 
     Log.d(TAG, "Message: " + message); 
     Log.d(TAG, "From: " + from); 
     Log.d(TAG, "Message: " + message); 
     if (from.startsWith("/topics/")) { 
      // message received from some topic. 
     } else { 
      // normal downstream message. 
     } 
     sendNotification(message); 
    } 
    private void sendNotification(String message) { 


     Log.d("MyGcmListenerService", "message: " + message); 
      Intent intent = new Intent(this, MainActivity.class); 
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT); 
      Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
      NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
        .setSmallIcon(R.drawable.notification_icon) 
        .setContentTitle("GCM Message Received") 
        .setContentText(message) 
        .setAutoCancel(true) 
        .setSound(defaultSoundUri) 
        .setContentIntent(pendingIntent); 
      NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
      notificationManager.notify(0, notificationBuilder.build()); 
     } 
    } 

Und meine Manifest-Datei

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.ictcsu.mybuangproject" > 

    <uses-permission android:name="android.permission.INTERNET"/> 
    <!-- For checking current network state --> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <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="com.example.gcm" /> 
      </intent-filter> 
     </receiver> 
     <service 
      android:name="com.ictcsu.mybuangproject.MyGcmListenerService" 
      android:exported="false" > 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      </intent-filter> 
     </service> 
     <service 
      android:name="com.ictcsu.mybuangproject.MyInstanceIDListenerService" 
      android:exported="false"> 
      <intent-filter> 
       <action android:name="com.google.android.gms.iid.InstanceID" /> 
      </intent-filter> 
     </service> 
     <service 
      android:name="com.ictcsu.mybuangproject.RegistrationIntentService" 
      android:exported="false"> 
     </service> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

Die prog Ram funktionierte richtig auf meinem Huawei MediaPad 7 Vogue, jedoch musste ich mein Gerät aus einem wichtigen Grund neu formatieren, und wenn ich die Anwendung neu installierte, erhält es keine Benachrichtigung mehr.

Die Antwort von meinem PHP-Server zeigt an, dass es erfolgreich ist. Ich installierte auch die App zu meinem Telefon LG L70 und es ist richtig, Benachrichtigungen zu erhalten.

Ich weiß nicht wirklich, was zu tun ist, ich habe viele Codes gesucht und ausprobiert, aber es hat nicht funktioniert. Denken Sie, dass die Umformatierung des Geräts damit zu tun hatte?

+0

Wo abonnierst du die Themen? – Abbas

+0

Ich denke mehrere Login .. mit anderen Registrierungs-ID für andere gespeichert .. und senden Sie noti. zu anderen Gerät ... –

+0

Ich weiß nicht, was passiert, wenn Sie Gerät neu formatieren, da ich es selbst nie getan habe, aber die Google Play-Dienste bleiben oder sind derzeit installiert? Außerdem habe ich festgestellt, dass in der Praxis manchmal sogar die Neuinstallation der App gelegentlich dazu führt, dass der GCM-Dienst für einige Zeit angehalten wird. In der Regel dauert etwa 30-60 Minuten. Wenn das der Fall ist, schließe die Frage. – Abbas

Antwort

0

Jedes Mal, wenn Sie die Geräte-ID Ihres Geräts zurücksetzen, müssen Sie sich erneut anmelden, damit Sie auf der Serverseite die Geräte-ID aktualisieren können. Bitte gehen Sie durch Google-Dokument, um mehr über die Geräte-ID und GCM zu erfahren, und wie es funktioniert, wird es helfen, das Problem zu verfolgen.

+0

Für Debugging-Zwecke sende ich meine Registrierungs-/Geräte-ID jedes Mal an meinen Server, wenn sich der Benutzer bei der App anmeldet. Also denke ich, die Registrierungs-ID ist nicht das Problem, aber ich werde nachschlagen, wie das GCM hoffentlich dieses Problem lösen kann. – ErenRavenHeart

Verwandte Themen