2016-06-30 38 views
11

Otrzymuję wiele wyjątków w raporcie o awariach dla mojej aplikacji w sklepie Google. Czy ktoś może powiedzieć mi, co może spowodować? Używam android: targetSdkVersion = 19Płatności InApp: java.lang.SecurityException wymaga READ_PHONE_STATE

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) 
+0

Prawdopodobnie to, co mówi wyjątek, brakujące prawo do odczytu READ_PHONE_STATE –

+2

Myślę, że jest bardziej prawdopodobne, że jest w manifeście, ale nie zostało przyznane na urządzeniach Marshmallow. https://developer.android.com/training/permissions/requesting.html – DeeV

+0

Pamiętaj, że nawet jeśli celujesz w Api-19, użytkownicy na Marshmallow mogą ręcznie odwołać uprawnienia po instalacji. –

Odpowiedz

-7

Dodaj odpowiednie zezwolenie w AndroidManifest.xml

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

Chociaż Google potwierdził, że wysyła aktualizację mającą poprawkę, ale następujący blok try catch przynajmniej zapobiega awarii

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; 
       } 
} 

Zwróć uwagę, że jedyna zmiana w sposobie int querySkuDetails (Str ing itemType, Inventory inv, List moreSkus) jest blokiem catch próby wyjątku bezpieczeństwa. Reszta wszystko pozostaje takie samo.