android – 注册到gcm时获取null设备ID

GCMRegistrar.checkDevice(this);
GCMRegistrar.unregister(this);  
GCMRegistrar.checkManifest(this);

if (GCMRegistrar.isRegistered(this)) {
    GCMRegistrar.getRegistrationId(this));
}

regId = GCMRegistrar.getRegistrationId(this);
l.setText(regId);

if (regId.equals("")) {     
    GCMRegistrar.register(this,"187805647345");
    GCMRegistrar.getRegistrationId(this));
    l.setText(regId);
}
else {
    GCMRegistrar.getRegistrationId(this));
}

Toast.makeText(RegisterHalf.this,""+regId,2000).show();

运行应用程序时,我得到设备ID = null
但是当我第二次运行时,设备ID有一个值.

请告诉我为什么会这样.

解决方法

你必须从sdk导入谷歌播放服务项目到你的工作区并添加
它作为你的项目的lib.然后按照以下步骤:

1).//declare global
    private GoogleCloudMessaging _gcm;
    String _devideId;
2). then execute a new thread like this:
private class GetDeviceID extends AsyncTask<String,String,String>{
    @Override
    protected void onPreExecute() {
        // progress bar
        super.onPreExecute();
    }



    @Override
    protected String doInBackground(String... params) {
        if (_gcm == null) {
            _gcm = GoogleCloudMessaging.getInstance(CompanyRegistration.this);
        }

        try {
            _devideId= _gcm.register("your project number of 12 digit");
            System.out.println("my id is\n" + _devideId+ _devideId.length());

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(String result) {

        //dismiss dialouge here

    }
}
3). in _devideId String you get the device id.
4).modify your manifest file as
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.SEND" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

//在应用程序标签中添加您的收件人

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

            <category android:name="your package name" />
        </intent-filter>
    </receiver>

//广播接收班

import android.app.Activity;
   import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.BroadcastReceiver;
    import android.content.Context;
   import android.content.Intent;
     import android.content.SharedPreferences;
   import android.media.RingtoneManager;
   import android.support.v4.app.NotificationCompat;
    import android.util.Log;  

import com.google.android.gms.gcm.GoogleCloudMessaging;

public class GcmBroadcastReceiver extends BroadcastReceiver {
static final String TAG = "GCMDemo";
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
Context ctx;
private SharedPreferences prefs;
Boolean alert = true;

@Override
public void onReceive(Context context,Intent intent) {

    prefs = context.getSharedPreferences(
            GcmBroadcastReceiver.class.getSimpleName(),context.MODE_PRIVATE); // changes here

    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
    ctx = context;
    String messageType = gcm.getMessageType(intent);
    System.out.println("reciever is" + messageType);
    if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
        sendNotification("Send error: " + intent.getExtras().toString());
    } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED
            .equals(messageType)) {
        sendNotification("Deleted messages on server: "
                + intent.getExtras().toString());
    } else {

        Log.i("aaaaaa",intent.getExtras().toString());
        sendNotification(intent.getExtras().getString("message").toString());
    }
    setResultCode(Activity.RESULT_OK);
}

private void sendNotification(String msg) {
    mNotificationManager = (NotificationManager) ctx
            .getSystemService(Context.NOTIFICATION_SERVICE);

    PendingIntent contentIntent = PendingIntent.getActivity(ctx,new Intent(ctx,GcmBroadcastReceiver.class),0); // changes here

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            ctx).setSmallIcon(R.drawable.ic_launcher)
            .setContentTitle("Come Fetch Me Notification ")
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
            .setContentText(msg);

    mBuilder.setContentIntent(contentIntent);
    mBuilder.setSound(RingtoneManager
            .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
    mNotificationManager.notify(NOTIFICATION_ID,mBuilder.build());
}
}

相关文章

Android 如何解决dialog弹出时无法捕捉Activity的back事件 在...
Android实现自定义带文字和图片的Button 在Android开发中经常...
Android 关于长按back键退出应用程序的实现最近在做一个Andr...
android自带的时间选择器只能精确到分,但是对于某些应用要求...