SecurityException:使用应用内结算将活页夹绑定到错误的接口 [英] SecurityException: Binder invocation to an incorrect interface using in-app billing

查看:99
本文介绍了SecurityException:使用应用内结算将活页夹绑定到错误的接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试使用Google提供的应用内结算库时,出现SecurityException.这是完整的例外情况:

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)

这是第227行的IabHelper.java方法:

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 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行为:

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.

推荐答案

找到了我的答案(此处),希望它能解决您的问题.(它是中文,但Chrome对此进行了翻译.)它与.AIDL在客户端上的位置有关.它必须与服务器中.AIDL文件完全相同.并且必须将其放在客户端的src文件夹中的同名程序包中.

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.

这篇关于SecurityException:使用应用内结算将活页夹绑定到错误的接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆