简体   繁体   English

为什么未从gcm收到消息

[英]Why Messages not received from gcm

I tried to register my device into GCM service. 我试图将我的设备注册到GCM服务中。 that's worked, I get register id of my device and store that on my server. 可行,我获得设备的注册ID并将其存储在服务器上。 but when I send message to my device nothing affected and device can not recive message. 但是,当我向设备发送消息时,没有任何影响,设备无法接收消息。

Response on google at send message: Google在发送邮件时的回复:

{u'failure': 0, u'canonical_ids': 0, u'success': 1, u'multicast_id': 8319562714448073760L, u'results': [{u'message_id': u'0:1445751667241995%f044e3acf9fd7ecd'}]}

Android Manifest: Android清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="ir.ac.buqaen.rc"
      android:versionCode="5"
      android:versionName="1.4">

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="23"/>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.VIBRATE"/>

<permission
        android:name="ir.ac.buqaen.rc.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

<uses-permission android:name="ir.ac.buqaen.rc.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<application
        android:name=".network.AppController"
        android:label="@string/app_name"
        android:icon="@drawable/icon"
        android:theme="@style/Theme.Main"
        android:allowBackup="true">

    <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:configChanges="keyboardHidden|orientation|screenSize"/>

    <activity
            android:name=".SplashActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <activity android:name=".gcm.MessageActivity"/>

    <receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <!-- Receives the actual messages. -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <!-- Receives the registration id. -->
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="ir.ac.buqaen.rc" />
        </intent-filter>
    </receiver>

    <service android:name=".GCMIntentService" />

</application>
</manifest>

ServerUtilities.java ServerUtilities.java

public final class ServerUtilities {
    private static final String TAG = "GCM";

    public static void register(final Context context, final String regId){
        final MySharedPreferences sp = new MySharedPreferences(context);
        long teacher_id = sp.sharedPreferences.getLong("teacher_id", -1);
        TeacherHelper teacherHelper = new TeacherHelper(context);
        teacherHelper.teacher = teacherHelper.findById(teacher_id);

        Map<String, String> params = new HashMap<String, String>();
        Log.d("regid", "---- regId:" + regId);
        params.put("reg_id", regId);
        params.put("name", teacherHelper.teacher.getStringName());
        params.put("email", teacherHelper.teacher.getStringEmail());
        params.put("user_id", teacherHelper.teacher.getStringUsername());
        params.put("device_id", Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID));
        CustomRequest request = new CustomRequest(context, Globals.UrlGCMRegister, params, new CustomRequest.ResponseAction() {
            @Override
            public void onResponseAction(JSONObject data) throws JSONException {
                try {
                    int vc  = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
                    if (data.getBoolean("status")) {
                        sp.saveToPreferences("gcm" + vc, data.getJSONObject("value").getString("id"));
                        sp.saveToPreferences("gcm_reg_id", regId);
                        GCMRegistrar.setRegisteredOnServer(context, true);
                    } else if (data.getString("msg").equals("already registered")) {
                        sp.saveToPreferences("gcm" + vc, data.getJSONObject("value").getString("id"));
                        GCMRegistrar.setRegisteredOnServer(context, true);
                        sp.saveToPreferences("gcm_reg_id", regId);
                    } else {
                        Log.e(TAG, "registering device failed");
                    }
                } catch (JSONException e) {
                    Log.e("Response Error _ " + context.getClass().getSimpleName(), "----" + e.getMessage());
                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
            }
        });
        AppController.getInstance().addToRequestQueue(request, "request gcm");
    }

    /**
     * Unregister this account/device pair within the server.
     */
    public static void unregister(final Context context, final String regId) {
        final MySharedPreferences sp = new MySharedPreferences(context);

        Map<String, String> params = new HashMap<String, String>();
        params.put("reg_id", regId);
        CustomRequest request = new CustomRequest(context, Globals.UrlGCMUnRegister, params, new CustomRequest.ResponseAction() {
            @Override
            public void onResponseAction(JSONObject data) throws JSONException {
                if (data.getBoolean("status")) {
                    int vc = 1;
                    try {
                        vc = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
                    } catch (PackageManager.NameNotFoundException e) {
                        e.printStackTrace();
                    }
                    sp.editor.remove("gcm" + vc);
                    sp.editor.remove("gcm_reg_id");
                    sp.editor.commit();
                    GCMRegistrar.setRegisteredOnServer(context, false);
                }
            }
        });
        AppController.getInstance().addToRequestQueue(request, "request gcm");
    }
}

GCMIntentService.java GCMIntentService.java

public class GCMIntentService extends GCMBaseIntentService {

    private static final String TAG = "GCMIntentService";

    public GCMIntentService() {
        super(Globals.SENDER_ID);
    }

    @Override
    protected void onRegistered(Context context, String registrationId) {
        ServerUtilities.register(context, registrationId);
    }

    @Override
    protected void onUnregistered(Context context, String registrationId) {
        ServerUtilities.unregister(context, registrationId);
    }

    @Override
    protected void onMessage(Context context, Intent intent) {
        Log.i("tes", "~~~" + intent.getExtras());
        Log.i(TAG, "Received message");
        MessageHelper messageHelper = new MessageHelper(context);
        try {
            JSONObject data = new JSONObject(intent.getExtras().getString("message"));
            messageHelper.message = new Message(
                    null, data.getInt("type"), data.getInt("status"), data.getString("content"),
                    data.getString("title"), data.getString("date")
            );
            messageHelper.Save();

            createNotification(context, messageHelper.message);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onError(Context context, String errorId) {
        Log.i(TAG, "Received error: " + errorId);
    }

    @Override
    protected boolean onRecoverableError(Context context, String errorId) {
        Log.i(TAG, "Received recoverable error: " + errorId);
        return super.onRecoverableError(context, errorId);
    }

    private void createNotification(Context context, Message message) {
        Intent notificationIntent;
        notificationIntent = new Intent(this, Message.class);

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationIntent.putExtra("message_id", message.id);
        notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent contentIntent = PendingIntent.getActivity(this, message.id.intValue(), notificationIntent, PendingIntent.FLAG_ONE_SHOT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setContentIntent(contentIntent)
                .setSmallIcon(R.drawable.bu_logo)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.bu_logo))
                .setTicker(getString(R.string.new_message))
                .setWhen(System.currentTimeMillis())
                .setAutoCancel(true)
                .setSound(Uri.parse("android.resource://ir.ac.buqaen.rc/raw/notification"))
                .setContentTitle(message.title)
                .setContentText(message.getContentText(context));
        Notification notification = builder.build();

        notificationManager.notify(message.id.intValue(), notification);
    }
}

MainActivity 主要活动

            try {

                // Make sure the device has the proper dependencies.
                GCMRegistrar.checkDevice(getApplicationContext());

                // Make sure the manifest was properly set - comment out this line
                // while developing the app, then uncomment it when it's ready.
                GCMRegistrar.checkManifest(getApplicationContext());

                // Get GCM registration id
                final String regId = GCMRegistrar.getRegistrationId(getApplicationContext());

                // Check if regid already presents
                if (regId.equals("")) {
                    // Registration is not present, register now with GCM
                    GCMRegistrar.register(getApplicationContext(), Globals.SENDER_ID);
                } else {
                    // Try to register again if device is not registered on GCM
                    if (!GCMRegistrar.isRegisteredOnServer(getApplicationContext())) {
                        ServerUtilities.register(getApplicationContext(), regId);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

I dont khow why this code not worked! 我不知道为什么这段代码行不通! I use this code in another project and get messages on my app, but this code in this application on receive messages. 我在另一个项目中使用此代码,并在我的应用程序上获取消息,但是在此应用程序中的此代码接收消息。

Can problem from my package name? 请问我的包裹名称有问题吗? :) :)

ir.ac.buqaen.rc

Please help me hoe to fix this problem. 请帮我解决这个问题。

According to Set up a GCM Client App on Android 根据在Android上设置GCM客户端应用

For existing apps that extend a WakefulBroadcastReceiver , Google recommends migrating to GCMReceiver and GcmListenerService . 对于扩展了WakefulBroadcastReceiver的现有应用程序,Google建议迁移到GCMReceiverGcmListenerService To migrate: 要迁移:

  • In the app manifest, replace your GcmBroadcastReceiver with "com.google.android.gms.gcm.GcmReceiver", and replace the current 在应用清单中,将“ GcmBroadcastReceiver ”替换为“ com.google.android.gms.gcm.GcmReceiver”,然后替换当前的
    service declaration that extends IntentService to the new IntentService扩展到新的服务声明
    GcmListenerService GcmListenerService
  • Remove the BroadcastReceiver implementation from your client code 从客户端代码中删除BroadcastReceiver实现
  • Refactor the current IntentService service implementation to use GcmListenerService 重构当前的IntentService服务实现以使用GcmListenerService

Then, you can refer to my following manifest file. 然后,您可以参考我的以下清单文件。 Hope this helps! 希望这可以帮助!

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.gcmclient" >

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

<permission android:name="com.example.gcm.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    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.REGISTRATION" />
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <category android:name="com.example.gcm" />
        </intent-filter>
    </receiver>
    <service android:name=".service.GcmService" android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

    <service android:name=".service.LoggingService" android:exported="false" />

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:clearTaskOnLaunch="false"
        android:finishOnTaskLaunch="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

</manifest>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM