安卓進(jìn)階第七篇之6.0權(quán)限適配問(wèn)題

Android M已經(jīng)出來(lái)很久了,特別是從6.0開(kāi)始增加了運(yùn)行時(shí)權(quán)限RuntimePermission。如果你的項(xiàng)目targetSdkVersion支持到22以上(>=23),那就必須做權(quán)限適配,否側(cè)app就會(huì)報(bào)權(quán)限錯(cuò)誤,如果想app不報(bào)錯(cuò),只需設(shè)置targetSdkVersion<=22,不過(guò)這也不是長(zhǎng)久之計(jì),權(quán)限適配遲早是要做的。

google將權(quán)限分為兩類,一種是普通權(quán)限 ( Normal Permissions),一種是危險(xiǎn)權(quán)限(Dangerous Permission)。

普通權(quán)限如下:

ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS

危險(xiǎn)權(quán)限如下:

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

我們可以看到,危險(xiǎn)權(quán)限都是一組一組的,那么這對(duì)我們申請(qǐng)權(quán)限有什么影響呢?簡(jiǎn)單點(diǎn)說(shuō),如果你申請(qǐng)某一個(gè)組的權(quán)限(假如說(shuō)這個(gè)組下有兩個(gè)權(quán)限A和B),如果彈出的授權(quán)dialog你授予了A權(quán)限,但是拒絕了B權(quán)限,那么下次再次點(diǎn)擊獲取授權(quán)的時(shí)候,因?yàn)槟阋呀?jīng)授權(quán)了這個(gè)組下的A權(quán)限,那么系統(tǒng)會(huì)認(rèn)為你已經(jīng)授權(quán)了這個(gè)組下的所有權(quán)限,所以不再會(huì)彈出授權(quán)權(quán)限B的dialog。所以我們?cè)谏暾?qǐng)授權(quán)的時(shí)候,盡量不要去使用申請(qǐng)組的權(quán)限,而是對(duì)每個(gè)危險(xiǎn)權(quán)限進(jìn)行正常的申請(qǐng)。

說(shuō)了這么多了,該練練手了,關(guān)于權(quán)限適配,github上已經(jīng)有很多大神寫(xiě)了封裝庫(kù),我們可以直接使用,但我個(gè)人最喜歡的還是這位貌似韓國(guó)大神寫(xiě)的permissiongen(https://github.com/lovedise/PermissionGen ),使用也非常簡(jiǎn)單,直接在app gradle下添加 compile 'com.lovedise:permissiongen:0.0.6',然后同步一下,接下來(lái)就是在app中的使用了,也是非常方便,比如我們寫(xiě)一個(gè)按鈕,點(diǎn)擊去申請(qǐng)撥打電話的權(quán)限,xml代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout    
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_main"    
android:layout_width="match_parent"    
android:layout_height="match_parent"   >    
   <Button        
     android:text="打電話"        
    android:id="@+id/call_phone_btn"        
    android:layout_width="match_parent"        
    android:layout_height="45dp"/>
</RelativeLayout>

再來(lái)看看是怎么調(diào)用權(quán)限的:

@Override
public void onClick(View v) {    
     switch (v.getId()){        
     case R.id.call_phone_btn:                  
        PermissionGen.needPermission(MainActivity.this,100,Manifest.permission.CALL_PHONE);            
     break;    
 }}

第二個(gè)參數(shù)100,就是我們請(qǐng)求的requestCode,第三個(gè)參數(shù)就是要請(qǐng)求的權(quán)限,再看看請(qǐng)求結(jié)果的返回:

@PermissionSuccess(requestCode = 100)
private void doCallPhoneSuccess() {    
    Toast.makeText(MainActivity.this, "請(qǐng)求授權(quán)成功", Toast.LENGTH_LONG).show();
}
@PermissionFail(requestCode = 100)
private void doCallPhoneError() {    
    Toast.makeText(MainActivity.this, "請(qǐng)求授權(quán)失敗", Toast.LENGTH_LONG).show();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {    
     PermissionGen.onRequestPermissionsResult(MainActivity.this, requestCode, permissions, grantResults);
}

個(gè)人覺(jué)得作者已經(jīng)封裝的很好了,用起來(lái)很方便,也可以滿足我們項(xiàng)目中的需求。(沒(méi)什么技術(shù)含量,就當(dāng)是自己的一個(gè)筆記吧。)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評(píng)論 25 709
  • 一、概述 隨著Android 7.0的發(fā)布,Android 6.0的普及速度很快就升上去了,目前Android 6...
    ListenerGao閱讀 1,002評(píng)論 3 17
  • 發(fā)熱放入Android6.0帶來(lái)了新的權(quán)限管理方式,根據(jù)提供的官方文檔,再加上自己的理解,做了以下匯總僅供大家伙參...
    PapiAP閱讀 1,841評(píng)論 0 6
  • 人們的脾氣都是變化多端的,其中憤怒的情緒最影響人。有時(shí)候覺(jué)得更年期的到來(lái)就是女人最痛苦的時(shí)候,因?yàn)檫@個(gè)時(shí)期意識(shí)到你...
    奇喻9在17閱讀 166評(píng)論 0 0

友情鏈接更多精彩內(nèi)容