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 及更高版本中是不需要的,这就是您没有看到错误的原因。