0

我已將AWS SNS API集成到我的Android應用程序中。當我打開應用程序,我得到這個錯誤日誌:SNS Android應用程序中的例外情況

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()); 

我並沒有真正理解什麼是在我的代碼的問題,所以你能幫幫我嗎?

回答

2

這不是那麼直觀,錯誤信息只是說MAIN_THREAD在最後沒有解釋。這有效地表明pushManager.registerDevice()方法不能從主線程調用。

Mobile Hub示例應用程序在Async任務中進行呼叫。這是一個例子。

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(); 

既然你當前正在調用從活動的onCreate()生命週期方法PushManager.registerDevice(),你是從主線程,這是不允許的調用它。切換到在後臺線程中調用它,例如使用上面的AsyncTask示例,並且應該解決您的問題。

相關問題