安卓6.0運行時權限處理

由于一直以來公司做的項目一直使用的目標版本是API22【安卓5.0】契沫,但是在API22上面會有很多的功能不能使用苫拍,例如軟件管理權限捕虽,同時目前推薦的目標版本是API25也就是Android7.0,所以在后續(xù)的框架搭建中我決定提升項目的TargetVersion。

簡介

對于6.0以下的權限及在安裝的時候劲够,根據(jù)權限聲明產(chǎn)生一個權限列表洛勉,用戶只有在同意之后才能完成app的安裝,造成了我們想要使用某個app,就要默默忍受其一些不必要的權限(比如是個app都要訪問通訊錄盯捌、短信等)。而在6.0以后蘑秽,我們可以直接安裝饺著,當app需要我們授予不恰當?shù)臋嘞薜臅r候,我們可以予以拒絕(比如:單機的象棋對戰(zhàn)肠牲,請求訪問任何權限幼衰,我都是不同意的)。當然你也可以在設置界面對每個app的權限進行查看缀雳,以及對單個權限進行授權或者解除授權塑顺。

新的權限機制更好的保護了用戶的隱私,Google將權限分為兩類俏险,一類是Normal Permissions严拒,這類權限一般不涉及用戶隱私,是不需要用戶進行授權的竖独,比如手機震動裤唠、訪問網(wǎng)絡等;另一類是Dangerous Permission莹痢,一般是涉及到用戶隱私的种蘸,需要用戶進行授權,比如讀取sdcard竞膳、訪問通訊錄等航瞭。

普通權限

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

危險權限(這部分就是我們在使用的使用需要去處理的部分)

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

新的運行時權限機制做了向下兼容,對于API23以下的版本不用處理危險權限申請坦辟,仍然是按照老方法刊侯,直接注冊,但是對于API23及其以上在需要如上危險權限的時候需要做動態(tài)的權限申請锉走,否則將無法使用滨彻。危險權限是按組分類,這個在權限判斷的時候可以用到挪蹭,但是建議單個權限判斷亭饵,多個權限申請,以確保萬無一失梁厉。

相關的API介紹

1.AndroidManifest文件中添加需要的權限

如果你的權限沒有注冊辜羊,但是在代碼中動態(tài)的申請,將導致程序崩潰。

2.權限檢查

ContextCompat.checkSelfPermission(@NonNull Context context, @NonNull String permission)

  • 參數(shù)一:上下文
  • 參數(shù)二:需要申請的權限的字符如:Manifest.permission.WRITE_EXTERNAL_STORAGE 可避免出現(xiàn)錯誤八秃。返回值是一個int類型碱妆,0代表已獲取,1代表未獲取喜德,通常和0比較山橄,其中:
    0 == PackageManager.PERMISSION_GRANTED:(GRANTED 英譯:準許)
    -1 == PackageManager.PERMISSION_DENIED:(DENIED 英譯:拒絕)

3.權限請求

ActivityCompat.requestPermissions(final @NonNull Activity activity,final @NonNull String[] permissions, final @IntRange(from = 0) int requestCode)

  • 參數(shù)一:上下文
  • 參數(shù)二:需要申請的權限字符串,可多個權限一起申請系統(tǒng)將逐一的詢問
  • 參數(shù)三:請求碼舍悯,用于回調(diào)時候使用

4.處理請求后的回調(diào)

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {/* callback - do nothing */}

  • 參數(shù)一:請求權限時候的請求碼航棱,多權限分別申請,可以作為分類判斷依據(jù)
  • 參數(shù)二:申請的權限名稱如:Manifest.permission.WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE"
  • 參數(shù)三:申請權限的結果萌衬,例如第一個申請硬盤寫入權限饮醇,第二個申請硬盤讀取權限,通過grantResults[0]==PackageManager.PERMISSION_GRANTED來判斷硬盤寫入權限是否準許秕豫;通過grantResults[1]==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.
}

如果再次拒絕祠墅,只好做不使用該權限了,例如天貓你不允許讀取短信權限會退出歌径。//權限判斷(版本號是否大于等于安卓6.0毁嗦,是否獲取權限)完整的寫法如下://沒有獲取權限并且權限被拒絕,最后一次的申請(如果失敗將無法申請)

//沒有獲取權限并且權限被拒絕回铛,最后一次的申請(如果失敗將無法申請)
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)) {

            // 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 {
            //沒有獲取權限狗准,申請權限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.WRITE_APN_SETTINGS},
                    Constant.number.PERMISSION_REQUEST_CODE);

        }
    } 
    @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode) {
        //磁盤寫入權限成功,更新app茵肃,反之失敗退出
        case Constant.number.HUNDRED:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // permission was granted, yay! Do the
                // contacts-related task you need to do.
                updateApp(updateBean);
            } else {
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                    return;
            }
            break;
        // 磁盤讀取權限成功腔长,讀取磁盤是否下載有新的安裝包,若有修改升級按鈕文字
        case Constant.number.HUNDRED_AND_ONE:
            if (grantResults.length > 0 && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                File file = new File(Constant.string.DOWNLOAD_PATH);
                File[] files = file.listFiles();
                if (null != files) {
                    for (int i = 0, count = files.length; i < count; i++) {
                        String apkName = files[i].getName();
                        if (TextUtils.equals(apkName, SpUtil.getString(this, Constant.string.UPDATE_APP_NAME, Constant.string.DEFAULT_APP_NAME)) && SpUtil.getLong(this, Constant.string.DOWNLOAD_APK_SIZE + Constant.string.DEFAULT_APP_NAME, Constant.number.ZERO) == files[i].length()) {
                            mIsUpdateComplete = true;
                            mBtnUpdate.setText(getResources().getString(R.string.install_now));
                        }
                    }
                }
            }
            break;
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

最后測試验残,看結果

硬盤讀取和寫入權限

討論群:6242914819捞附,歡迎入群
微信公眾號:AndroidHoisting(歡迎關注,第一時間推送博文信息)


安卓直升機
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胚膊,一起剝皮案震驚了整個濱河市故俐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌紊婉,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辑舷,死亡現(xiàn)場離奇詭異喻犁,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門肢础,熙熙樓的掌柜王于貴愁眉苦臉地迎上來还栓,“玉大人,你說我怎么就攤上這事传轰∈:校” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵慨蛙,是天一觀的道長辽聊。 經(jīng)常有香客問我,道長期贫,這世上最難降的妖魔是什么跟匆? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮通砍,結果婚禮上玛臂,老公的妹妹穿的比我還像新娘。我一直安慰自己封孙,他們只是感情好迹冤,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虎忌,像睡著了一般泡徙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呐籽,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天锋勺,我揣著相機與錄音,去河邊找鬼狡蝶。 笑死庶橱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的贪惹。 我是一名探鬼主播苏章,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奏瞬!你這毒婦竟也來了枫绅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤硼端,失蹤者是張志新(化名)和其女友劉穎并淋,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珍昨,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡县耽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年句喷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兔毙。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡唾琼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澎剥,到底是詐尸還是另有隱情锡溯,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布哑姚,位于F島的核電站祭饭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜻懦。R本人自食惡果不足惜甜癞,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宛乃。 院中可真熱鬧悠咱,春花似錦、人聲如沸征炼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆奥。三九已至眼坏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酸些,已是汗流浹背宰译。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留魄懂,地道東北人沿侈。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像市栗,于是被迫代替她去往敵國和親缀拭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容