Android 6.0 運行時權限簡明處理

今天來跟你們聊這樣一個話題——權限。
正如各位所知,傳統意義上的權限是在用戶安裝APP時被許可的。儘管在使用過程當中,某些第三方Rom或者安全軟件會再次提示權限,但從系統自己來講,就是被放行了。
在Google推出6.0以後,引入了新的權限機制,叫作運行時權限(Runtime Permission)。該機制限制某些敏感的權限,好比讀寫外置存儲,訪問隱私數據等等。對用戶的數據保護提供良好的保障,但同時也爲開發者提供了一些絆腳石。
那麼做爲一名開發者,應該如何作呢?
首先就是端正心態,這樣作確實是對用戶有好處的。
而後就是學習了,也就是本篇文章的正題。
咱們按照Android studio的新建項目嚮導創建新的空項目後,按照原先的方法在Androidmanifest.xml作權限聲明,以下:android

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
複製代碼

而後在Activity中嘗試新建一個文件,以下:git

File newFile = new File(Environment.getExternalStorageDirectory() + File.separator + "test.txt");
if (newFile.exists() && newFile.isFile()) {
    newFile.delete();
}
try {
    newFile.createNewFile();
    Toast.makeText(this, "文件建立成功", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
    e.printStackTrace();
    Toast.makeText(this, "文件建立失敗", Toast.LENGTH_SHORT).show();
}
複製代碼

而後運行,若是你的手機是基於Android 6.0,你就會發現,文件根本沒有辦法被建立。會報Permission denied 錯誤,意思就是權限禁止。
解決的方法也很簡單,分兩步走,第一步先受權,第二步就是在受權響應的回調接口中獲取到受權是否成功的值。
受權的方法可參考以下代碼片:github

private void checkStoragePermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        //未受權,請求受權
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQ_PERMISSION_STORAGE);
    }
}
複製代碼

此處有檢查,若是未經受權,則去受權。
受權響應回調中的處理可參考以下代碼片:安全

if (requestCode == REQ_PERMISSION_STORAGE) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "獲得受權", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "受權取消", Toast.LENGTH_SHORT).show();
        }
    }
複製代碼

各位可在Toast處按照項目需求作出具體的適合本身項目的處理。
上述完整的代碼已經放到Github上面,有興趣的朋友能夠下載查看,網址:github.com/XiaoWenHan/…
下面附上須要作相似處理的權限列表: 身體傳感器 日曆 攝像頭 通信錄 地理位置 麥克風 電話 短信 存儲空間框架

給你們提個醒,若是你項目中的targetSdk<23,是無需作上述處理的。
目前,針對運行時受權處理的框架已經有一些了,感興趣的朋友能夠去看看。下面放上幾個:學習

  • PermissionsDispatcher 使用標註的方式,動態生成類處理運行時權限,目前還不支持嵌套Fragment。this

  • RxPermissions 基於RxJava的運行時權限檢測框架spa

  • Grant 簡化運行時權限的處理,比較靈活code

  • android-RuntimePermissions Google官方的例子xml

最後,放上一個無需權限處理便可使用的權限:

android.permission.ACCESS_LOCATION_EXTRA_COMMANDS android.permission.ACCESS_NETWORK_STATE android.permission.ACCESS_NOTIFICATION_POLICY android.permission.ACCESS_WIFI_STATE android.permission.ACCESS_WIMAX_STATE android.permission.BLUETOOTH android.permission.BLUETOOTH_ADMIN android.permission.BROADCAST_STICKY android.permission.CHANGE_NETWORK_STATE android.permission.CHANGE_WIFI_MULTICAST_STATE android.permission.CHANGE_WIFI_STATE android.permission.CHANGE_WIMAX_STATE android.permission.DISABLE_KEYGUARD android.permission.EXPAND_STATUS_BAR android.permission.FLASHLIGHT android.permission.GET_ACCOUNTS android.permission.GET_PACKAGE_SIZE android.permission.INTERNET android.permission.KILL_BACKGROUND_PROCESSES android.permission.MODIFY_AUDIO_SETTINGS android.permission.NFC android.permission.READ_SYNC_SETTINGS android.permission.READ_SYNC_STATS android.permission.RECEIVE_BOOT_COMPLETED android.permission.REORDER_TASKS android.permission.REQUEST_INSTALL_PACKAGES android.permission.SET_TIME_ZONE android.permission.SET_WALLPAPER android.permission.SET_WALLPAPER_HINTS android.permission.SUBSCRIBED_FEEDS_READ android.permission.TRANSMIT_IR android.permission.USE_FINGERPRINT android.permission.VIBRATE android.permission.WAKE_LOCK android.permission.WRITE_SYNC_SETTINGS com.android.alarm.permission.SET_ALARM com.android.launcher.permission.INSTALL_SHORTCUT com.android.launcher.permission.UNINSTALL_SHORTCUT

相關文章
相關標籤/搜索