从片段中的GCMRegistrar.getRegistrationId获取一个空id

时间:2014-12-04 08:11:26

标签: android google-cloud-messaging

我正在尝试通过GCM发出通知。在测试项目中一切正常。但在详细设计中,我几乎没有改变。我不使用Activity作为片段。当我试图获得regId时

 regId = GCMRegistrar.getRegistrationId(getActivity());

得到一个空的regId。 帮助请理解问题是什么

我的片段:

package com.managment.pavel.managmentgradle.fragments;

     ....

    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.DISPLAY_MESSAGE_ACTION;
    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.EXTRA_MESSAGE;
    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.SENDER_ID;
    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.SERVER_URL;
    import static com.managment.pavel.managmentgradle.Services.CommonUtilities.TAG;

    import com.google.android.gcm.GCMRegistrar;
    import com.managment.pavel.managmentgradle.R;
    import com.managment.pavel.managmentgradle.Services.ServerUtilities;

    public class NotifyFragment extends Fragment implements View.OnClickListener {

        private final BroadcastReceiver mHandleMessageReceiver =
                new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        String newMessage = intent.getExtras().getString(EXTRA_MESSAGE);
                        mDisplay.setText(newMessage + "\n");
                    }
                };

        private TextView mDisplay;
        private AsyncTask<Void, Void, Void> mRegisterTask;
        private String regId;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.notify_fragment, null);

             ...

            GCMRegistrar.checkDevice(getActivity());
            GCMRegistrar.checkManifest(getActivity());

            getActivity().registerReceiver(mHandleMessageReceiver, new IntentFilter(DISPLAY_MESSAGE_ACTION));
            mDisplay = (TextView) v.findViewById(R.id.notyfi_status);

            return v;
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.regGCM:
                    regId = GCMRegistrar.getRegistrationId(getActivity());
                    Log.d(TAG,"regId"+regId);
                    if (regId.equals("")) {
                        GCMRegistrar.register(getActivity(), SENDER_ID);
                    } else {...}
                    break;
                    case R.id.unregGCM:
                    GCMRegistrar.unregister(getActivity());
                    break;
            }
        }
    }

我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.managment.pavel.managmentgradle" >
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <permission
        android:name="com.managment.pavel.managmentgradle.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission
        android:name="com.managment.pavel.managmentgradle.permission.C2D_MESSAGE" />
    <!-- This app has permission to register and receive data message. -->
    <uses-permission
        android:name="com.google.android.c2dm.permission.RECEIVE" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.managment.pavel.managmentgradle.MyActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize" android:theme="@style/Theme.AppCompat">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <!--<service android:name=".Services.GuestIn" android:process=":GuestIn"/>-->
        </activity>

        <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="com.managment.pavel.managmentgradle" />
            </intent-filter>
        </receiver>

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

    </application>

</manifest>

Untilites:

public final class CommonUtilities {

    public static final String SERVER_URL = "http://...........";
    public static final String SENDER_ID = "....................";
    public static final String TAG = "GCMDemo";
    public static final String DISPLAY_MESSAGE_ACTION ="DISPLAY_MESSAGE";
    public static final String EXTRA_MESSAGE = "message";

    static void displayMessage(Context context, String message) {
        Intent intent = new Intent(DISPLAY_MESSAGE_ACTION);
        intent.putExtra(EXTRA_MESSAGE, message);
        context.sendBroadcast(intent);
    }
}

1 个答案:

答案 0 :(得分:0)

GCMRegistrar.register触发向GCM的异步注册,因此在此方法之后立即调用GCMRegistrar.getRegistrationId可能会返回空的注册ID。它也被弃用了。

您应该使用GoogleCloudMessaging.register方法。它是Google Play服务的一部分,并且是同步的,因此您可以立即获得注册ID。

您可以使用Google GCM Demo的代码作为参考。