【问题标题】:Exceptions in SNS Android AppSNS Android 应用程序中的异常
【发布时间】:2017-02-10 02:55:01
【问题描述】:

我在我的 Android 应用程序中集成了 AWS SNS API。当我打开应用程序时,我得到了这个错误日志:

E/GCMTokenHelper: Unable to register with GCM. MAIN_THREAD
                                                           java.io.IOException: MAIN_THREAD
                                                               at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)
                                                               at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)
                                                               at com.amazonaws.mobile.push.GCMTokenHelper.updateGCMToken(GCMTokenHelper.java:79)
                                                               at com.amazonaws.mobile.push.PushManager.registerDevice(PushManager.java:196)
                                                               at com.intap.appme.MainActivity.onCreate(MainActivity.java:49)
                                                               at android.app.Activity.performCreate(Activity.java:6876)
                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                                                               at android.app.ActivityThread.access$1100(ActivityThread.java:221)
                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                               at android.os.Looper.loop(Looper.java:158)
                                                               at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
10-01 20:54:37.354 4725-4725/com.intap.appme E/PushManager: Push Notifications - FAILED : GCM registration failed : java.io.IOException: MAIN_THREAD
                                                        java.io.IOException: MAIN_THREAD
                                                            at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)
                                                            at com.google.android.gms.iid.InstanceID.getToken(Unknown Source)
                                                            at com.amazonaws.mobile.push.GCMTokenHelper.updateGCMToken(GCMTokenHelper.java:79)
                                                            at com.amazonaws.mobile.push.PushManager.registerDevice(PushManager.java:196)
                                                            at com.intap.appme.MainActivity.onCreate(MainActivity.java:49)
                                                            at android.app.Activity.performCreate(Activity.java:6876)
                                                            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
                                                            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
                                                            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                                                            at android.app.ActivityThread.access$1100(ActivityThread.java:221)
                                                            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                                                            at android.os.Handler.dispatchMessage(Handler.java:102)
                                                            at android.os.Looper.loop(Looper.java:158)
                                                            at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                            at java.lang.reflect.Method.invoke(Native Method)
                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
10-01 20:54:39.724 4725-4725/com.intap.appme E/AndroidRuntime: FATAL EXCEPTION: main
                                                           Process: com.intap.appme, PID: 4725
                                                           java.lang.RuntimeException: Unable to start activity ComponentInfo{com.intap.appme/com.intap.appme.MainActivity}: com.amazonaws.services.sns.model.InvalidParameterException: Invalid parameter: Endpoint (Service: AmazonSNS; Status Code: 400; Error Code: InvalidParameter; Request ID: 698306d3-9079-53a0-8dc2-56ba6ae67d2b)
                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                                                               at android.app.ActivityThread.access$1100(ActivityThread.java:221)
                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                                                               at android.os.Handler.dispatchMessage(Handler.java:102)
                                                               at android.os.Looper.loop(Looper.java:158)
                                                               at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                            Caused by: com.amazonaws.services.sns.model.InvalidParameterException: Invalid parameter: Endpoint (Service: AmazonSNS; Status Code: 400; Error Code: InvalidParameter; Request ID: 698306d3-9079-53a0-8dc2-56ba6ae67d2b)
                                                               at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:712)
                                                               at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:388)
                                                               at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:199)
                                                               at com.amazonaws.services.sns.AmazonSNSClient.invoke(AmazonSNSClient.java:2262)
                                                               at com.amazonaws.services.sns.AmazonSNSClient.subscribe(AmazonSNSClient.java:1256)
                                                               at com.amazonaws.mobile.push.PushManager.subscribeToTopic(PushManager.java:251)
                                                               at com.intap.appme.MainActivity.onCreate(MainActivity.java:50)
                                                               at android.app.Activity.performCreate(Activity.java:6876)
                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                                                               at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                                                               at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                               at android.os.Looper.loop(Looper.java:158) 
                                                               at android.app.ActivityThread.main(ActivityThread.java:7224) 
                                                               at java.lang.reflect.Method.invoke(Native Method) 
                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

错误日志中提到的行是: GCMTokenHelper.java:79

newDeviceToken = instanceID.getToken(gcmSenderID, GoogleCloudMessaging.INSTANCE_ID_SCOPE);

PushManager.java:196

gcmTokenHelper.updateGCMToken();

PushManager.java:251

final SubscribeResult result = sns.subscribe(request);

MainActivity.java:49

pushManager.registerDevice();

MainActivity.java:50

pushManager.subscribeToTopic(pushManager.getDefaultTopic());

我真的不明白我的代码有什么问题,请你帮帮我吗?

【问题讨论】:

    标签: android amazon-web-services google-cloud-messaging subscription amazon-sns


    【解决方案1】:

    错误信息只是在结尾处显示MAIN_THREAD 而没有任何解释,这不是那么直观。这实际上表明无法从主线程调用 pushManager.registerDevice() 方法。

    Mobile Hub 示例应用程序在异步任务中进行调用。这是一个例子。

    new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(final Void... params) {
            // register device first to ensure we have a push endpoint.
            pushManager.registerDevice();
    
            // if registration succeeded.
            if (pushManager.isRegistered()) {
                if (pushManager.isPushEnabled()) {
                    // if push is enabled, the push manager keeps its state
                    // including the subscribed topics and automatically
                    // re-subscribes when registering the device.
                    return null;
                }
                try {
                    // Enable push
                    pushManager.setPushEnabled(true);
                    // Automatically subscribe to the default SNS topic
                    pushManager.subscribeToTopic(pushManager.getDefaultTopic());
                    return null;
                } catch (final AmazonClientException ace) {
                    Log.e(LOG_TAG, "Failed to change push notification status", ace);
                    return ace.getMessage();
                }
            }
    
            return "Failed to register for push notifications.";
        }
    
        @Override
        protected void onPostExecute(final String errorMessage) {
            if (errorMessage != null) {
                // do something to show the error message...
            }
        }
    }.execute();
    

    由于您当前正在从 Activity 的 onCreate() 生命周期方法调用 PushManager.registerDevice(),因此您正在从主线程调用它,这是不允许的。切换到在后台线程中调用它,例如使用上面的AsyncTask 示例,您的问题应该得到解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-10
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多