InApp计费:java.lang.SecurityException 需要READ_PHONE_STATE权限

12

我的应用在 Google 应用商店中出现了许多崩溃报告异常。请问有人可以帮我找出可能的原因吗? 我正在使用 android:targetSdkVersion=19。

java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10131 nor current process has android.permission.READ_PHONE_STATE.
    at android.os.Parcel.readException(Parcel.java:1546)
    at android.os.Parcel.readException(Parcel.java:1499)
    at com.android.vending.billing.IInAppBillingService$Stub$Proxy.getSkuDetails(IInAppBillingService.java:251)
    at com.inapp.util.IabHelper.querySkuDetails(IabHelper.java:920)
    at com.inapp.util.IabHelper.queryInventory(IabHelper.java:550)
    at com.inapp.util.IabHelper.queryInventory(IabHelper.java:522)
    at com.inapp.util.IabHelper$2.run(IabHelper.java:617)
    at java.lang.Thread.run(Thread.java:818)

很可能是异常提示的内容,你缺少了READ_PHONE_STATE权限。 - J j
2
我认为更可能是在清单文件中,但在Marshmallow设备上尚未被授予。https://developer.android.com/training/permissions/requesting.html - DeeV
请记住,即使您的目标是Api-19,安装后在Marshmallow上的用户仍然可以手动撤销权限。 - Daniel Nugent
5
也在寻找解决方案。根据文档,IAP不需要READ_PHONE_STATE权限,但并非所有情况都是如此。大多数设备可以正常运行,但并非所有设备都如此。目前这个问题在这里被忽略:https://productforums.google.com/forum/#!topic/play/4LigT3eyQgk - Андрей Вахрушев
3
最近几天我也经常遇到这个问题。似乎与IAP和Google Play服务有关。在这里,您可以找到更多遇到同样问题的人:https://github.com/googlesamples/android-play-billing/issues/26 - Steffen
显示剩余4条评论
2个回答

3

尽管谷歌已经确认已经发布了修复补丁的更新,但是以下 try catch 块至少可以防止崩溃。

int querySkuDetails(String itemType, Inventory inv, List<String> moreSkus)
                                throws RemoteException, JSONException {
        logDebug("Querying SKU details.");
        ArrayList<String> skuList = new ArrayList<String>();
        skuList.addAll(inv.getAllOwnedSkus(itemType));
        if (moreSkus != null) {
            for (String sku : moreSkus) {
                if (!skuList.contains(sku)) {
                    skuList.add(sku);
                }
            }
        }

        if (skuList.size() == 0) {
            logDebug("queryPrices: nothing to do because there are no SKUs.");
            return BILLING_RESPONSE_RESULT_OK;
        }

        // NullPointer crash reported through PlayStore forums
        if (mService == null) {
            return IABHELPER_SERVICE_UNAVAILABLE;
        }

        Bundle querySkus = new Bundle();
        querySkus.putStringArrayList(GET_SKU_DETAILS_ITEM_LIST, skuList);

        try {
                    Bundle skuDetails = mService.getSkuDetails(3, mContext.getPackageName(), itemType, querySkus);
                    if (!skuDetails.containsKey(RESPONSE_GET_SKU_DETAILS_LIST)) {
                        int response = getResponseCodeFromBundle(skuDetails);
                        if (response != BILLING_RESPONSE_RESULT_OK) {
                            logDebug("getSkuDetails() failed: " + getResponseDesc(response));
                            return response;
                        }
                        else {
                            logError("getSkuDetails() returned a bundle with neither an error nor a detail list.");
                            return IABHELPER_BAD_RESPONSE;
                        }
                    }

                    ArrayList<String> responseList = skuDetails.getStringArrayList(RESPONSE_GET_SKU_DETAILS_LIST);

                    for (String thisResponse : responseList) {
                        SkuDetails d = new SkuDetails(itemType, thisResponse);
                        logDebug("Got sku details: " + d);
                        inv.addSkuDetails(d);
                    }
                    return BILLING_RESPONSE_RESULT_OK;
                }
                // Security Exception due to missing permissions reported through PlayStore forums
                catch (SecurityException e)
                {
                    return IABHELPER_SERVICE_UNAVAILABLE;
                }
}

请注意,方法int querySkuDetails(String itemType, Inventory inv, List moreSkus)中唯一的变化是安全异常的try catch块。其他所有内容都保持不变。

-7
请在AndroidManifest.xml文件中添加适当的权限。
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接