Gcm 注册 AsyncTask crasch android 2.3.7
Gcm Registration AsyncTask crasch android 2.3.7
运行 android 2.3.7 崩溃到 android 4.2.2 运行 ok
对不起我的英语
package com.lemieapp.gcmclient;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
import com.google.android.gms.gcm.GoogleCloudMessaging;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.extensions.android.json.AndroidJsonFactory;
import com.google.api.client.googleapis.services.AbstractGoogleClientRequest;
import com.google.api.client.googleapis.services.GoogleClientRequestInitializer;
import com.lemieapp.backend.registration.Registration;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Created by Dead or Alive on 07/04/2015.
*/
class GcmRegistrationAsyncTask extends AsyncTask<Void, Void, String> {
private static Registration regService = null;
private GoogleCloudMessaging gcm;
private Context context;
// TODO: change to your own sender ID to Google Developers Console project number, as per instructions above
private static final String SENDER_ID = "xxxxxxxxx";
public GcmRegistrationAsyncTask(Context context) {
this.context = context;
}
@Override
protected String doInBackground(Void... params) {
if (regService == null) {
Registration.Builder builder = new Registration.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null)
.setRootUrl("https://gcmclient-907.appspot.com/_ah/api/");
// end of optional local run code
regService = builder.build();
}
String msg = "";
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
}
String 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.
// The request to your server should be authenticated if your app
// is using accounts.
regService.register(regId).execute();
} catch (IOException ex) {
ex.printStackTrace();
msg = "Error: " + ex.getMessage();
}
return msg;
}
@Override
protected void onPostExecute(String msg) {
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
Logger.getLogger("REGISTRATION").log(Level.INFO, msg);
}
}
LOg.cat
04-12 12:40:47.284 2162-2162/com.lemieapp.gcmclient D/szipinf:正在初始化inflate状态
04-12 12:40:49.524 2162-2182/com.lemieapp.gcmclient W/dalvikvm:threadid=9: thread exiting with uncaught exception (group=0x40015608)
04-12 12:40:49.584 2162-2182/com.lemieapp.gcmclient E/AndroidRuntime:致命异常:AsyncTask #1
java.lang.RuntimeException: 执行 doInBackground() 时出错
在 android.os.AsyncTask$3.done(AsyncTask.java:200)
在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
在 java.util.concurrent.FutureTask.setException(FutureTask.java:125)
在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
在 java.util.concurrent.FutureTask.运行(FutureTask.java:138)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
在 java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.IllegalArgumentException: 运行ning on Android SDK level 10 但至少需要 11
在 com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:119)
在 com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:69)
在 com.google.api.client.extensions.android.AndroidUtils.checkMinimumSdkLevel(AndroidUtils.java:48)
在 com.google.api.client.extensions.android.json.AndroidJsonFactory.(AndroidJsonFactory.java:75)
在 com.lemieapp.gcmclient.GcmRegistrationAsyncTask.doInBackground(GcmRegistrationAsyncTask.java:36)
在 com.lemieapp.gcmclient.GcmRegistrationAsyncTask.doInBackground(GcmRegistrationAsyncTask.java:21)
在 android.os.AsyncTask$2.call(AsyncTask.java:185)
在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
在 java.util.concurrent.FutureTask.运行(FutureTask.java:138)
在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
在 java.lang.Thread.run(Thread.java:1019)
04-12 12:40:49.684 2162-2164/com.lemieapp.gcmclient D/dalvikvm﹕ GC_CONCURRENT freed 228K, 50% free 2874K/5639K, external 0K/0K, paused 2ms+3ms
04-12 12:40:49.704 2162-2162/com.lemieapp.gcmclient W/KeyCharacterMap:id -1没有键盘
04-12 12:40:49.704 2162-2162/com.lemieapp.gcmclient W/KeyCharacterMap﹕使用默认键盘映射:/system/usr/keychars/qwerty.kcm.bin
你的日志实际上告诉你你的错误是什么——你需要将 AndroidMaifest.xml 中的最小 API 级别设置为 11。根据 official docs,在 pre 上使用 GCM 3.0 设备,要求用户登录其 Google Play 服务帐户。这在 4.0.4 及更高版本中是不需要的,这就是您没有看到错误的原因。
运行 android 2.3.7 崩溃到 android 4.2.2 运行 ok 对不起我的英语
package com.lemieapp.gcmclient;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
import com.google.android.gms.gcm.GoogleCloudMessaging;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.extensions.android.json.AndroidJsonFactory;
import com.google.api.client.googleapis.services.AbstractGoogleClientRequest;
import com.google.api.client.googleapis.services.GoogleClientRequestInitializer;
import com.lemieapp.backend.registration.Registration;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Created by Dead or Alive on 07/04/2015.
*/
class GcmRegistrationAsyncTask extends AsyncTask<Void, Void, String> {
private static Registration regService = null;
private GoogleCloudMessaging gcm;
private Context context;
// TODO: change to your own sender ID to Google Developers Console project number, as per instructions above
private static final String SENDER_ID = "xxxxxxxxx";
public GcmRegistrationAsyncTask(Context context) {
this.context = context;
}
@Override
protected String doInBackground(Void... params) {
if (regService == null) {
Registration.Builder builder = new Registration.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null)
.setRootUrl("https://gcmclient-907.appspot.com/_ah/api/");
// end of optional local run code
regService = builder.build();
}
String msg = "";
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
}
String 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.
// The request to your server should be authenticated if your app
// is using accounts.
regService.register(regId).execute();
} catch (IOException ex) {
ex.printStackTrace();
msg = "Error: " + ex.getMessage();
}
return msg;
}
@Override
protected void onPostExecute(String msg) {
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
Logger.getLogger("REGISTRATION").log(Level.INFO, msg);
}
}
LOg.cat
04-12 12:40:47.284 2162-2162/com.lemieapp.gcmclient D/szipinf:正在初始化inflate状态 04-12 12:40:49.524 2162-2182/com.lemieapp.gcmclient W/dalvikvm:threadid=9: thread exiting with uncaught exception (group=0x40015608) 04-12 12:40:49.584 2162-2182/com.lemieapp.gcmclient E/AndroidRuntime:致命异常:AsyncTask #1 java.lang.RuntimeException: 执行 doInBackground() 时出错 在 android.os.AsyncTask$3.done(AsyncTask.java:200) 在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 在 java.util.concurrent.FutureTask.setException(FutureTask.java:125) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 在 java.util.concurrent.FutureTask.运行(FutureTask.java:138) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 在 java.lang.Thread.run(Thread.java:1019) Caused by: java.lang.IllegalArgumentException: 运行ning on Android SDK level 10 但至少需要 11 在 com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:119) 在 com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:69) 在 com.google.api.client.extensions.android.AndroidUtils.checkMinimumSdkLevel(AndroidUtils.java:48) 在 com.google.api.client.extensions.android.json.AndroidJsonFactory.(AndroidJsonFactory.java:75) 在 com.lemieapp.gcmclient.GcmRegistrationAsyncTask.doInBackground(GcmRegistrationAsyncTask.java:36) 在 com.lemieapp.gcmclient.GcmRegistrationAsyncTask.doInBackground(GcmRegistrationAsyncTask.java:21) 在 android.os.AsyncTask$2.call(AsyncTask.java:185) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 在 java.util.concurrent.FutureTask.运行(FutureTask.java:138) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 在 java.lang.Thread.run(Thread.java:1019) 04-12 12:40:49.684 2162-2164/com.lemieapp.gcmclient D/dalvikvm﹕ GC_CONCURRENT freed 228K, 50% free 2874K/5639K, external 0K/0K, paused 2ms+3ms 04-12 12:40:49.704 2162-2162/com.lemieapp.gcmclient W/KeyCharacterMap:id -1没有键盘 04-12 12:40:49.704 2162-2162/com.lemieapp.gcmclient W/KeyCharacterMap﹕使用默认键盘映射:/system/usr/keychars/qwerty.kcm.bin
你的日志实际上告诉你你的错误是什么——你需要将 AndroidMaifest.xml 中的最小 API 级别设置为 11。根据 official docs,在 pre 上使用 GCM 3.0 设备,要求用户登录其 Google Play 服务帐户。这在 4.0.4 及更高版本中是不需要的,这就是您没有看到错误的原因。