我正在尝试通过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);
}
}
答案 0 :(得分:0)
GCMRegistrar.register
触发向GCM的异步注册,因此在此方法之后立即调用GCMRegistrar.getRegistrationId
可能会返回空的注册ID。它也被弃用了。
您应该使用GoogleCloudMessaging.register
方法。它是Google Play服务的一部分,并且是同步的,因此您可以立即获得注册ID。
您可以使用Google GCM Demo的代码作为参考。