我在尝试使用Google提供的应用内结算库时遇到了SecurityException.以下是完整的例外情况:
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方法:
@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,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 _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;
}
现在,当我第一次启动我的应用程序时会发生将调试器附加到进程后,我得到了异常.
解决方法
找到我的答案(
here),希望它能解决你的问题. (它是中文的,但Chrome翻译了它.) 它与客户端的.AIDL位置有关.它必须与服务器中的.AIDL文件完全相同.它必须放在客户端的src文件夹中的同名包中.