InApp Billing: java.lang.SecurityException Требуется READ_PHONE_STATE

Я получаю много исключений в отчете о сбое для моего приложения в магазине Google. Может ли кто-нибудь помочь мне, что может вызвать это? Я использую андроид: 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)

person Vijay Bansal    schedule 30.06.2016    source источник
comment
Вероятно, это то, что говорит исключение, у вас отсутствует разрешение READ_PHONE_STATE   -  person J j    schedule 30.06.2016
comment
Я думаю, что более вероятно, что это указано в манифесте, но не было предоставлено на устройствах Marshmallow. developer.android.com/training/permissions/requesting.html   -  person DeeV    schedule 30.06.2016
comment
Имейте в виду, что даже если вы нацелены на Api-19, пользователи Marshmallow могут вручную отозвать разрешение после установки.   -  person Daniel Nugent    schedule 30.06.2016
comment
Вам нужно запрашивать разрешения программно, если вы хотите поддерживать устройства с Android M и выше. Ознакомьтесь с моим ответом здесь. stackoverflow.com/questions/35856432/   -  person Shadab Ansari    schedule 30.06.2016
comment
@ShadabAnsari Он нацелен на API-19, поэтому все разрешения предоставляются во время установки, даже на Marshmallow.   -  person Daniel Nugent    schedule 30.06.2016
comment
Ищите решение и для этого. IAP не требует READ_PHONE_STATE, не в соответствии с документами, да. Это также происходит не для каждого устройства, большинство работает просто отлично. В настоящее время проблема игнорируется здесь: productforums.google.com/forum/#! тема/игра/4LigT3eyQgk   -  person Андрей Вахрушев    schedule 07.07.2016
comment
Видя эту проблему, а также для IAP. Я не хочу добавлять READ_PHONE_STATE в свое приложение — это разрешение опасного уровня, и многие пользователи подумают, что я краду данные или что-то в этом роде.   -  person mliu    schedule 15.07.2016
comment
Я также получаю это много, так как несколько дней. Кажется, это связано с IAP и сервисами Google Play. Здесь вы можете найти больше людей с такой же проблемой: github.com/googlesamples/android -play-billing/issues/26   -  person Steffen    schedule 18.07.2016
comment
У вас все еще есть эта проблема?   -  person Vektor88    schedule 19.09.2016


Ответы (2)


Хотя Google подтвердил, что выпустил обновление с исправлением, следующий блок 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 исключения безопасности. В остальном все остается по-прежнему.

person Varun Bhatia    schedule 28.07.2016

Добавьте соответствующее разрешение в свой AndroidManifest.xml.

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
person Eclipse22    schedule 30.06.2016