您的位置:首页 > 移动开发

SecurityException: Binder invocation to an incorrect interface using in-app billing

2015-06-09 19:00 148 查看
0down
votefavorite


转自stack overflow:http://stackoverflow.com/questions/24591282/securityexception-binder-invocation-to-an-incorrect-interface-using-in-app-bill

I'm getting a SecurityException when attempting to use the in-app billing library that Google offers. Here is the full exception:

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)

Here is the IabHelper.java method with line 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 ***AILABLE.");
                mSubscriptionsSupported = true;
            } else {
                logDebug("Subscriptions NOT ***AILABLE. 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."));
        }
    }
};

And finally, here is the IInAppBillingService.java file where line 208 is:

@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;
}

Now this happens when I first launch my app. I got the exception after attaching a debugger to the process.



android


share|improve
this question
asked
Jul 5 '14 at 23:09




Andrew Quebe

1,1181932

add a comment |

1 Answer 1

activeoldestvotes

up vote1down voteaccepted
Found my answer (
here), hope it solves yours. (It's in Chinese, but Chrome translated it.) It had to do with the location of the .AIDL on the client side. It must be an exact duplicate of the .AIDL file in the server. And it must be placed in a package of the same name
in the client's src folder.



share|improve
this answer
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: