Android InApp计费:java.lang.SecurityException需要读取\电话\状态

Android InApp计费:java.lang.SecurityException需要读取\电话\状态,android,in-app-purchase,in-app-billing,securityexception,Android,In App Purchase,In App Billing,Securityexception,我在谷歌商店的应用程序崩溃报告中遇到了很多异常。 有人能告诉我这是什么原因吗?我使用的是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(Par

我在谷歌商店的应用程序崩溃报告中遇到了很多异常。 有人能告诉我这是什么原因吗?我使用的是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)

在AndroidManifest.xml中添加适当的权限

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

尽管谷歌已经确认已经发布了具有修复程序的更新,但下面的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 querysku详细信息(字符串项目类型、库存库存、列出更多库存)
抛出RemoteException、JSONException{
logDebug(“查询SKU详细信息”);
ArrayList skuList=新的ArrayList();
skuList.addAll(inv.getAllowedskus(itemType));
if(moreSkus!=null){
用于(字符串sku:moreSkus){
如果(!skuList.contains(sku)){
skuList.添加(sku);
}
}
}
if(skuList.size()==0){
logDebug(“queryPrices:因为没有SKU,所以无需执行任何操作。”);
返回账单\响应\结果\确定;
}
//通过PlayStore论坛报告的NullPointer崩溃
if(mService==null){
返回服务不可用;
}
Bundle querySkus=新Bundle();
querySkus.putStringArrayList(获取SKU详细信息、项目清单、skuList);
试一试{
Bundle skuDetails=mService.getSkuDetails(3,mContext.getPackageName(),itemType,querySkus);
如果(!skuDetails.containsKey(响应\u获取\u SKU\u详细信息\u列表)){
int response=getResponseCodeFromBundle(skuDetails);
如果(响应!=计费\u响应\u结果\u确定){
logDebug(“getSkuDetails()失败:“+getResponseDesc(response));
返回响应;
}
否则{
logError(“getSkuDetails()返回的捆绑包既没有错误也没有详细信息列表。”);
返回错误的响应;
}
}
ArrayList responseList=skuDetails.getStringArrayList(响应\u获取\u SKU\u详细信息\u列表);
for(字符串thisResponse:responseList){
SkuDetails d=新SkuDetails(itemType,thisResponse);
logDebug(“获取sku详细信息:+d);
存货明细(d);
}
返回账单\响应\结果\确定;
}
//由于缺少通过PlayStore论坛报告的权限而导致安全异常
捕获(安全异常e)
{
返回服务不可用;
}
}
请注意,int querySkuDetails方法(String itemType、Inventory inv、List moreSkus)中唯一的更改是安全异常的try-catch块。休息吧,一切都一样


这可能是例外情况所说的,你错过了阅读、电话、州许可证。我想更可能是在清单上,但它还没有在棉花糖设备上被授予。请记住,即使您的目标是Api-19,棉花糖上的用户也可以在安装后手动撤销权限。正在寻找解决方案。IAP不需要读取电话状态,但根据文件,yall。并非所有设备都会出现这种情况,大多数设备工作正常。这个问题现在被忽略了:几天后我也得到了很多。似乎与IAP和Google Play服务有关。在这里,您可以找到更多具有相同问题的人: