Исключение SecurityException: вызов Binder для неправильного интерфейса с использованием биллинга в приложении

#android

#Android

Вопрос:

Я получаю SecurityException при попытке использовать библиотеку биллинга в приложении, которую предлагает Google. Вот полное исключение:

 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)
  

Вот IabHelper.java метод со строкой 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."));
        }
    }
};
  

И, наконец, вот IInAppBillingService.java файл, в котором строка 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 _resu<
    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 _resu<
}
  

Теперь это происходит при первом запуске моего приложения. Я получил исключение после подключения отладчика к процессу.

Ответ №1:

Нашел свой ответ (здесь), надеюсь, он решит ваш. (Это на китайском, но Chrome перевел его.) Это было связано с расположением .AIDL на стороне клиента. Это должно быть точным дубликатом .Файл AIDL на сервере. И он должен быть помещен в пакет с тем же именем в папке src клиента.

введите описание изображения здесь