Ful*_*oin 7 android google-cloud-messaging google-play-services
问题解决了 更新:
我解决了这个问题.问题在于方法registerGCMInBackground().
GoogleCloudMessaging.getInstance()期待ApplicationContext.
private void registerGCMInBackground(final String userId) {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
Log.d("Register GCM", "started");
try {
if (gcm == null) {
//PROBLEM SOLVED HERE
gcm = GoogleCloudMessaging.getInstance(getApplicationContext());
Log.d("GCM", gcm.toString());
}
regid = gcm.register(SENDER_ID); //////NULL POINTER EXCEPTION
msg = "Device registered, registration ID=" + regid;
// You should send the registration ID to your server over HTTP
sendRegistrationIdToBackend(userId, regid);
// 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) {
return "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 regid;
}
Run Code Online (Sandbox Code Playgroud)
--------解决问题--------------
我在GCM(Google Cloud Messaging)注册我的Android设备时遇到问题.我正在使用Google Developers中的示例.通过使用Google Developer Example,我确保了以下事项:
这个问题似乎与此问题相同.不幸的是仍然没有回答 我通过以下行获得Null Pointer Exception:
regid = gcm.register(SENDER_ID);
Run Code Online (Sandbox Code Playgroud)
这是我的问题代码: 示例活动
static final String TAG = "GCM";
public static final String EXTRA_MESSAGE = "message";
public static final String PROPERTY_REG_ID = "registration_id";
private static final String PROPERTY_APP_VERSION = "appVersion";
private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
String SENDER_ID = "xxxxxxxxxxxxxxx";
GoogleCloudMessaging gcm;
AtomicInteger msgId = new AtomicInteger();
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.registration);
final Button register = (Button) findViewById(R.id.btn_register);
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText mobilePhoneNumber = (EditText) findViewById(R.id.et_phonenumber);
if(!mobilePhoneNumber.getText().toString().isEmpty()){
User user = new User();
user.setMobilePhoneNumber(mobilePhoneNumber.getText().toString());
EditText firstName = (EditText) findViewById(R.id.et_firstName);
user.setFirstName(firstName.getText().toString());
EditText lastName = (EditText) findViewById(R.id.et_lastName);
user.setLastName(lastName.getText().toString());
EditText email = (EditText) findViewById(R.id.et_email);
user.setEmail(email.getText().toString());
Log.d("email: ", user.getEmail().toString());
if (android.os.Build.VERSION.SDK_INT>14) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
}
UserService userService = new UserService();
String path = userService.createNewUser(user);
Log.d("Location: ", path);
Toast.makeText(getApplicationContext(),
path, Toast.LENGTH_LONG).show();
String userID = path.replace("/user/", "");
userID = userID.replace("/users/", "");
Log.d("UserID:::", userID);
Log.d("User Service", "register in Background started");
if(checkPlayServices()){
registerGCMInBackground(userID);
}
}
else{
Toast.makeText(getApplicationContext(),
"Please enter your Mobile Phone Number", Toast.LENGTH_LONG).show();
}
}
});
private void registerGCMInBackground(final String userId) {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
Log.d("Register GCM", "started");
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
Log.d("GCM", gcm.toString());
}
regid = gcm.register(SENDER_ID); //////NULL POINTER EXCEPTION
msg = "Device registered, registration ID=" + regid;
// You should send the registration ID to your server over HTTP
sendRegistrationIdToBackend(userId, regid);
// 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) {
return "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 regid;
}
@Override
protected void onPostExecute(String msg) {
}
}.execute(null, null, null);
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制台输出: 控制台输出
这个问题我已经整整两天了.:( 非常感谢你!
我解决了这个问题。问题出在方法 registerGCMInBackground() 中。 GoogleCloudMessaging.getInstance() 需要 ApplicationContext。
private void registerGCMInBackground(final String userId) {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
String msg = "";
Log.d("Register GCM", "started");
try {
if (gcm == null) {
//PROBLEM SOLVED HERE
gcm = GoogleCloudMessaging.getInstance(getApplicationContext());
Log.d("GCM", gcm.toString());
}
regid = gcm.register(SENDER_ID); //////NULL POINTER EXCEPTION
msg = "Device registered, registration ID=" + regid;
// You should send the registration ID to your server over HTTP
sendRegistrationIdToBackend(userId, regid);
// 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) {
return "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 regid;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5379 次 |
| 最近记录: |