2014-07-05 2 views
5

Ich erhalte eine SecurityException, wenn ich versuche, die von Google angebotene In-App-Billing-Bibliothek zu verwenden. Hier ist die vollständige Ausnahme:SecurityException: Binder-Aufruf an eine falsche Schnittstelle mithilfe der In-App-Fakturierung

07-05 15:56:47.783 26481-26481/com.andrewq.planets E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.andrewq.planets, PID: 26481 
    java.lang.SecurityException: Binder invocation to an incorrect interface 
      at android.os.Parcel.readException(Parcel.java:1465) 
      at android.os.Parcel.readException(Parcel.java:1419) 
      at billing.IInAppBillingService$Stub$Proxy.isBillingSupported(IInAppBillingService.java:208) 
      at com.android.vending.billing.IabHelper$1.onServiceConnected(IabHelper.java:227) 
      at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1101) 
      at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1118) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5001) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 

Hier wird die IabHelper.java Methode mit der Linie 227:

@Override 
    public void onServiceConnected(ComponentName name, IBinder service) { 
     if (mDisposed) return; 
     logDebug("Billing service connected."); 
     mService = IInAppBillingService.Stub.asInterface(service); 
     String packageName = mContext.getPackageName(); 
     try { 
      logDebug("Checking for in-app billing 3 support."); 

      // check for in-app billing v3 support 
      //**LINE 227** 
      int response = mService.isBillingSupported(3, packageName, ITEM_TYPE_INAPP); 
      if (response != BILLING_RESPONSE_RESULT_OK) { 
       if (listener != null) listener.onIabSetupFinished(new IabResult(response, 
            "Error checking for billing v3 support.")); 

       // if in-app purchases aren't supported, neither are subscriptions. 
       mSubscriptionsSupported = false; 
       return; 
      } 
      logDebug("In-app billing version 3 supported for " + packageName); 

      // check for v3 subscriptions support 
      response = mService.isBillingSupported(3, packageName, ITEM_TYPE_SUBS); 
      if (response == BILLING_RESPONSE_RESULT_OK) { 
       logDebug("Subscriptions AVAILABLE."); 
       mSubscriptionsSupported = true; 
      } else { 
       logDebug("Subscriptions NOT AVAILABLE. Response: " + response); 
      } 

      mSetupDone = true; 
     } catch (RemoteException e) { 
      if (listener != null) { 
       listener.onIabSetupFinished(new IabResult(IABHELPER_REMOTE_EXCEPTION, 
            "RemoteException while setting up in-app billing.")); 
      } 
      e.printStackTrace(); 
      return; 
     } 

     if (listener != null) { 
      listener.onIabSetupFinished(new IabResult(BILLING_RESPONSE_RESULT_OK, "Setup successful.")); 
     } 
    } 
}; 

Und schließlich ist hier die IInAppBillingService.java Datei, in der Linie 208:

@Override public int isBillingSupported(int apiVersion, java.lang.String packageName, java.lang.String type) throws android.os.RemoteException 
{ 
    android.os.Parcel _data = android.os.Parcel.obtain(); 
    android.os.Parcel _reply = android.os.Parcel.obtain(); 
    int _result; 
    try { 
     _data.writeInterfaceToken(DESCRIPTOR); 
     _data.writeInt(apiVersion); 
     _data.writeString(packageName); 
     _data.writeString(type); 
     mRemote.transact(Stub.TRANSACTION_isBillingSupported, _data, _reply, 0); 
     //**LINE 208** 
     _reply.readException(); 
     _result = _reply.readInt(); 
    } 
    finally { 
     _reply.recycle(); 
     _data.recycle(); 
    } 
    return _result; 
} 

Jetzt passiert das, wenn ich meine App zum ersten Mal starte. Ich habe die Ausnahme erhalten, nachdem ich einen Debugger an den Prozess angehängt habe.

Antwort

10

Gefunden meine Antwort (here), hoffe, es löst Ihre. (Es ist auf Chinesisch, aber Chrome hat es übersetzt.) Es hatte mit dem Speicherort der .AIDL auf der Client-Seite zu tun. Es muss ein genaues Duplikat der .AIDL-Datei auf dem Server sein. Und es muss in einem Paket mit dem gleichen Namen im src-Ordner des Clients platziert werden.

enter image description here

Verwandte Themen