Android中的GoogleCloudMessaging

时间:2016-05-19 07:28:03

标签: android

  • 我已经厌倦了Android应用中的GCM推送通知。在我的应用程序中我第一次从gcm获得reg_id并更新到我的数据库然后我尝试将推送通知发送到另一台设备。它起初工作了。然后当我下次运行应用程序时,它没有得到通知,我不知道问题出在哪里。
  • 另一个疑问是,一旦我从gcm获取我的reg_id,我将它存储到我的数据库中,这就够了吗?因为当我点击发送按钮时,我只会发送到相应的reg_id。

这是我的代码

 public onViewCreated(View view, @Nullable Bundle savedInstanceState){


    Button sendBtn =(Button)view.findViewById(R.id.send);

    sendBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            pushNotifications(); // method to which will call to my app server and it will intern call gcm and pass the message
        }
    });


if (employee.getGcmID() == null || (employee.getGcmID().equalsIgnoreCase("")) {

        // Check device for Play Services APK. If check succeeds, proceed with GCM registration.
        if (checkPlayServices()) {

            gcm = GoogleCloudMessaging.getInstance(context);
            regid = getRegistrationId(context);


            if (regid.isEmpty()) {
                registerInBackground();
            }


            sendRegistrationIdToBackend();

        } else {
            Log.i(TAG, "No valid Google Play Services APK found.");
     }
    }
   }


 private boolean checkPlayServices() {

    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(context);

    if (resultCode != ConnectionResult.SUCCESS) {

        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {

            GooglePlayServicesUtil.getErrorDialog(resultCode, getActivity(), PLAY_SERVICES_RESOLUTION_REQUEST).show();

        } else {
            Log.i(TAG, "This device is not supported.");
            getActivity().finish();
        }
        return false;
    }

    return true;
}


 private void storeRegistrationId(Context context, String regId) {
    final SharedPreferences prefs = getGcmPreferences(context);
    int appVersion = getAppVersion(context);
    Log.i(TAG, "Saving regId on app version " + appVersion);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(PROPERTY_REG_ID, regId);
    editor.putInt(PROPERTY_APP_VERSION, appVersion);
    editor.commit();
}

private String getRegistrationId(Context context) {

    final SharedPreferences prefs = getGcmPreferences(context);

    String registrationId = prefs.getString(PROPERTY_REG_ID, "");
    if (registrationId.isEmpty()) {
        Log.i(TAG, "Registration not found.");
        return "";
    }
    // Check if app was updated; if so, it must clear the registration ID
    // since the existing regID is not guaranteed to work with the new
    // app version.
    int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
    int currentVersion = getAppVersion(context);
    if (registeredVersion != currentVersion) {
        Log.i(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

 private void registerInBackground() {

    new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            String msg = "";
            try {
                if (gcm == null) {
                    gcm = GoogleCloudMessaging.getInstance(context);
                }
                regid = gcm.register(SENDER_ID);
                msg = "Device registered, registration ID=" + regid;

                // You should send the registration ID to your server over HTTP, so it
                // can use GCM/HTTP or CCS to send messages to your app.


                // For this demo: we don't need to send it because the device will send
                // upstream messages to a server that echo back the message using the
                // 'from' address in the message.

                // Persist the regID - no need to register again.
                storeRegistrationId(context, regid);
            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
                // If there is an error, don't just keep trying to register.
                // Require the user to click a button again, or perform
                // exponential back-off.
            }
            return msg;
        }

        @Override
        protected void onPostExecute(String msg) {
        }
    }.execute(null, null, null);
}


private static int getAppVersion(Context context) {
    try {
        PackageInfo packageInfo = context.getPackageManager()
                .getPackageInfo(context.getPackageName(), 0);
        return packageInfo.versionCode;
    } catch (PackageManager.NameNotFoundException e) {
        // should never happen
        throw new RuntimeException("Could not get package name: " + e);
    }
}

 private SharedPreferences getGcmPreferences(Context context) {
    // This sample app persists the registration ID in shared preferences, but
    // how you store the regID in your app is up to you.
    return getActivity().getSharedPreferences(ContainerActivity.class.getSimpleName(),
            Context.MODE_PRIVATE);
}


private void sendRegistrationIdToBackend() {
    updateEmployee(employee); // method to save at database
}

manifest资源配置文件

 <application>

  <uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

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


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

    <service android:name="com.blood.services.GcmIntentService"/>

0 个答案:

没有答案