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?
Wo abonnierst du die Themen? – Abbas
Ich denke mehrere Login .. mit anderen Registrierungs-ID für andere gespeichert .. und senden Sie noti. zu anderen Gerät ... –
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