0

Ich habe AWS SNS API in meiner Android App integriert. Als ich die App geöffnet, bekam ich diese Fehlerprotokoll:Ausnahmen in SNS Android App

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)  

die Linien, die im Fehlerprotokoll erwähnt werden, sind jene: 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()); 

ich nicht wirklich verstehen, was das Problem in meinem Code ist, so könnten Sie mir bitte helfen?

Antwort

2

Es ist nicht so intuitiv, dass die Fehlermeldung nur MAIN_THREAD am Ende ohne eine Erklärung sagt. Das zeigt effektiv an, dass die pushManager.registerDevice() Methode nicht aus dem Hauptthread aufgerufen werden kann.

Die Mobile Hub-Beispielanwendung führt den Aufruf innerhalb einer Async-Aufgabe durch. Hier ist ein Beispiel.

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

Da Sie derzeit onCreate() Lebenszyklus PushManager.registerDevice() von Ihrer Tätigkeit Methode aufrufen, werden Sie es von der Haupt-Thread aufrufen, was nicht erlaubt ist. Wechseln Sie zum Aufruf in einem Hintergrundthread, z. B. mit dem obigen Beispiel AsyncTask, und Ihr Problem sollte gelöst werden.

Verwandte Themen