Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 運行時權限相關

運行時權限相關

編輯:關於Android編程

什麼是運行時權限
在之前的Android版本中如果我們的APP需要權限,只需要在manifest文件中聲明即可使用,用戶在安裝APP後可以隨意使用。但是Android M對權限進行了加強處理,我們早manifest文件中聲明之後,在使用到相關的功能時需要重新授權才能使用,當然並不是所有的權限都需要重新授權,這些需要重新授權的權限成為Runtime Permission. 運行時權限存在哪些影響
運行時權限對於用戶來說更加方便、更加透明可見,用戶可以更加直觀的管理自己的權限,更好的保護了用戶的隱私。但是對於開發者來說那就是又要多加判斷啦~~(>_<)~~

哪些權限是運行時權限呢
Google將權限分為兩類:一類是Normal Permissions,這類權限一般不涉及用戶隱私,是不需要用戶進行授權的,比如手機震動、訪問網絡等;另一類是Dangerous Permission,一般是涉及到用戶隱私的,需要用戶進行授權,比如讀取sdcard、訪問通訊錄等。

Normal Permission
ACCESS_LOCATION_EXTRA_COMMANDS允許應用程序訪問額外的位置提供程序命令。 ACCESS_NETWORK_STATE允許程序訪問有關網絡的信息。 ACCESS_NOTIFICATION_POLICY為應用標記希望訪問通知策略的權限。(Added in API level 23) ACCESS_WIFI_STATE允許應用程序訪問Wi-Fi網絡的信息。 BLUETOOTH允許應用程序連接到已配對的藍牙設備。 BLUETOOTH_ADMIN允許應用程序發現和配對藍牙設備。 BROADCAST_STICKY允許應用程序使用粘性廣播,這些廣播數據由該系統被完成之後保持,以便客戶端可以快速地檢索數據,而不必等待下一個廣播。 CHANGE_NETWORK_STATE允許應用程序改變網絡連接狀態。 CHANGE_WIFI_MULTICAST_STATE允許應用程序進入的Wi-Fi多播模式。(Added in API level 4) CHANGE_WIFI_STATE允許應用程序改變Wi-Fi連接狀態 DISABLE_KEYGUARD允許應用程序禁用鍵盤鎖,如果它是不安全的。 EXPAND_STATUS_BAR允許應用程序展開或折疊狀態欄。 GET_PACKAGE_SIZE 允許應用程序找出任何package占用的空間。 INSTALL_SHORTCUT允許應用程序安裝快捷方式。(Added in API level 19) INTERNET允許應用程序連接網絡。 KILL_BACKGROUND_PROCESSES允許應用程序殺死後台進程。(Added in API level 8) MODIFY_AUDIO_SETTINGS允許應用程序修改全局的音頻設置。 NFC允許應用程序通過NFC進行I / O操作。(Added in API level 9) READ_SYNC_SETTINGS允許應用程序讀取同步設置。 READ_SYNC_STATS允許應用程序讀取同步狀態。 RECEIVE_BOOT_COMPLETED允許應用程序接收系統啟動之後的廣播。 REORDER_TASKS允許應用程序修改任務的Z順序(不明白是什東東o(╯□╰)o) REQUEST_IGNORE_BATTERY_OPTIMIZATIONS REQUEST_INSTALL_PACKAGES SET_ALARM允許應用程序廣播一個Intent設置為用戶報警。(Added in API level 9) SET_TIME_ZONE允許應用程序設置系統時區。 SET_WALLPAPER允許應用程序設置壁紙。 SET_WALLPAPER_HINTS允許應用程序設置壁紙提示。 TRANSMIT_IR允許使用該設備的紅外線發射器,如果有的話。 UNINSTALL_SHORTCUT允許應用程序卸載啟動的快捷方式。 USE_FINGERPRINT允許應用程序使用指紋硬件。(Added in API level 23) VIBRATE允許訪問震動。 WAKE_LOCK允許使用PowerManager WakeLocks讓處理器進入休眠或屏幕變暗。 WRITE_SYNC_SETTINGS允許應用程序寫入同步設置。

Dangerous Permission
所有的危險權限均屬於權限組,這些危險權限也就是運行時權限

group:android.permission-group.CONTACTS

permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS

group:android.permission-group.PHONE

permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAIL

group:android.permission-group.CALENDAR

permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDAR

group:android.permission-group.CAMERA

permission:android.permission.CAMERA

group:android.permission-group.SENSORS

permission:android.permission.BODY_SENSORS

group:android.permission-group.LOCATION

permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATION

group:android.permission-group.STORAGE

permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGE

group:android.permission-group.MICROPHONE

permission:android.permission.RECORD_AUDIO

group:android.permission-group.SMS

permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS

同一組的任何一個權限被授權了,其他權限也自動被授權。

運行時權限相關API
  直接開始說步驟
  1. 在manifest中添加所需要的權限,這一步和之前的權限聲明並沒有什麼區別,如果試圖去請求一個沒有聲明的權限,程序很有可能直接崩潰。
  2. 檢查權限,這裡涉及到一個API,ContextCompat.checkSelfPermission,主要用於檢測某個權限是否已經被授予,方法返回值為PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。當返回DENIED就需要進行申請授權了。
  

    if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
               //沒有授權 
    }else{
    //
    }

  3. 申請授權,該方法是異步的,第一個參數是Context;第二個參數是需要申請的權限的字符串數組;第三個參數為requestCode,主要用於回調的時候檢測。可以從方法名requestPermissions以及第二個參數看出,是支持一次性申請多個權限的,系統會通過對話框逐一詢問用戶是否授權。
  

“`
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);

 4. 處理權限申請回調,對於權限的申請結果,首先驗證requestCode定位到你的申請,然後驗證grantResults對應於申請的結果,這裡的數組對應於申請時的第二個權限字符串數組。如果你同時申請兩個權限,那麼grantResults的length就為2,分別記錄你兩個權限的申請結果。如果申請成功,就可以做你的事情了~

            @Override
            public void onRequestPermissionsResult(int requestCode,
                    String permissions[], int[] grantResults) {
                switch (requestCode) {
                        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
                        // If request is cancelled, the result arrays are empty.
                        if (grantResults.length > 0
                                            && grantResults[0] ==                                                                     PackageManager.PERMISSION_GRANTED) {

                            // permission was granted, yay! Do the
                            // contacts-related task you need to do.

                        } else {

                                // permission denied, boo! Disable the
                                // functionality that depends on this permission.
                        }
                    return;
                    }
                   }
                }

    綜上4個步驟,對於運行時的權限的處理已經說完了,不過呢,還有一個API也是很重要的,就是用戶在上一次已經拒絕過你的這個權限申請。也就是說,用戶已經拒絕一次了,你又彈個授權框,你需要給用戶一個解釋,為什麼要授權,則使用該方法。

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                        Manifest.permission.READ_CONTACTS)) 
        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
        }

總結一下,將上面的幾個步驟整合到一起就成了下面的這段代碼:

// Here, thisActivity is the current activity
if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved