3

我們已經構建並部署了一款完美運行的基於位置的購物應用。直到我們發現由於拋出安全性異常,我們的應用程序無法在Android 5.1.1設備上運行。Android 5.1的位置權限

經過一番研究,我發現Google創建了一個在運行時請求權限的新方法,但沒有看到任何明確的方法。

任何人都可以在運行時給用戶提供明確的指導/請求許可的代碼行。每當它需要位置時(這在我們的情況中,這是很多的),應用程序也必須這樣做;

編輯: 這裏是清單的一部分:

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.CALL_PHONE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.SEND_SMS"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

<!-- GCM Permissions --> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<uses-permission android:name="com.site.app.permission.C2D_MESSAGE" /> 
<permission android:name="com.site.app.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 

這裏的logcat的:

09-16 10:08:55.531: E/AndroidRuntime(22970): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.site.app/com.site.app.Search}: java.lang.SecurityException: "passive" location provider requires ACCESS_FINE_LOCATION permission. 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2379) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2442) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.app.ActivityThread.access$800(ActivityThread.java:156) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1351) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.os.Handler.dispatchMessage(Handler.java:102) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.os.Looper.loop(Looper.java:211) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.app.ActivityThread.main(ActivityThread.java:5389) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at java.lang.reflect.Method.invoke(Native Method) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at java.lang.reflect.Method.invoke(Method.java:372) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 
09-16 10:08:55.531: E/AndroidRuntime(22970): Caused by: java.lang.SecurityException: "passive" location provider requires ACCESS_FINE_LOCATION permission. 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.os.Parcel.readException(Parcel.java:1553) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.os.Parcel.readException(Parcel.java:1505) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.location.ILocationManager$Stub$Proxy.getLastLocation(ILocationManager.java:693) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.location.LocationManager.getLastKnownLocation(LocationManager.java:1184) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at com.site.app.Search.getBestLocator(Search.java:423) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at com.site.app.Search.useAndroidFinder(Search.java:563) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at com.site.app.Search.onCreate(Search.java:126) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.app.Activity.performCreate(Activity.java:5990) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
09-16 10:08:55.531: E/AndroidRuntime(22970): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2332) 
09-16 10:08:55.531: E/AndroidRuntime(22970): ... 10 more 
+0

「經過一番研究,我發現Google創建了一個在運行時請求權限的新方法」 - 不適用於Android 5.1。這直到Android 6.0纔開始。您可能希望考慮發佈問題的[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve),在這種情況下,您的代碼將包括您的代碼,您的清單在哪裏有權限,和'SecurityException'的堆棧跟蹤。 – CommonsWare

+0

我已經包含了部分清單和logcat。謝謝。 – Visionwriter

+0

你在測試什麼設備?也許它是一個設備特有的問題。 – CommonsWare

回答

3

您可以使用新的ContextCompat類和檢查權限在執行之前的方法checkSelfPermission需要檢查權限的代碼行。

public static boolean isPermissionGranted(String permission, Context context){ 
     //int res = ContextCompat.checkSelfPermission(context, permission); 
     return (ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED); 
    } 

現在對於位置的權限,你需要或者檢查一旦如果應用中的用戶授予ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION