【问题标题】:Set up Android iAP Purchases - error设置 Android iAP 购买 - 错误
【发布时间】:2016-09-08 16:06:38
【问题描述】:

我正在尝试为高级会员设置 iAP。 我已将我的应用程序和签名的 apk 添加到开发者控制台,然后我开始遵循这个示例:Implementing In-app Billing

我注意到一个棘手的部分:

警告:不要在主线程上调用 getSkuDetails 方法。调用此方法会触发可能阻塞主线程的网络请求。相反,创建一个单独的线程并从该线程内部调用 getSkuDetails 方法。

这是我写的代码:

public class class...
Bundle querySkus = new Bundle();


/** gestisce gli acquisti in app */
IInAppBillingService mService;

ServiceConnection mServiceConn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mService = IInAppBillingService.Stub.asInterface(service);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mService = null;
    }
    };

在我的onCreate() 方法中:

Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
    serviceIntent.setPackage("com.android.vending");
    bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);

    ArrayList<String> skuList = new ArrayList<String>();
    skuList.add("premiumUpgrade");


    querySkus.putStringArrayList("chords_premium", skuList);

    AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus);
        }
    });

现在Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus); 我收到了:

未处理的异常:android.os.RemoteException

首先,我该如何解决?

我正在我的主要活动中实现此代码,即使应该重定向到购买对话框的按钮位于另一个活动中。 我做得对吗?我需要将它传递给其他活动吗?如果是这样,怎么做?将处理 iAP 的整个代码放在特定活动中会更好吗?

**编辑:** 我试图捕捉这样的异常:

AsyncTask.execute(new Runnable() {
        @Override
        public void run() {
            try {Bundle skuDetails = mService.getSkuDetails(3, getPackageName(), "inapp", querySkus); }
            catch (RemoteException e) {e.printStackTrace();};
        }
    });

它不起作用,因为我无法设置 int response = skuDetails...(在上面链接的文档中)

【问题讨论】:

  • 是编译错误还是运行时错误?
  • 编译错误

标签: java android multithreading in-app-purchase


【解决方案1】:

尚未测试您的代码.. 但我认为您可以试试这个:

    AsyncTask.execute(new Runnable() {
                @Override
                public void run() {
                    Bundle skuDetails = null;
                    try {
                        skuDetails = mService.getSkuDetails(3,
                           getPackageName(), "inapp", querySkus); 
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                    int response = skuDetails.whateverYouWantToDoWithThis();
                }
     });

AsyncTask.execute(new Runnable() {
                @Override
                public void run() throws RemoteException {
                    Bundle skuDetails = mService.getSkuDetails(3,
                           getPackageName(), "inapp", querySkus); 
                    int response = skuDetails.whateverYouWantToDoWithThis();
                }
     });

在此处阅读有关 throws 与 try-catch 的更多信息:try/catch versus throws Exception

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2015-05-12
    相关资源
    最近更新 更多