不知道各位在平時(shí)的開(kāi)發(fā)中儿倒,有沒(méi)有遇到過(guò)自己的應(yīng)用在Android 6.0上的手機(jī)運(yùn)調(diào)用相機(jī)、電話、本地存儲(chǔ)讀取等敏感權(quán)限會(huì)突然Crash的問(wèn)題驱还。明明自己在AndroidManifest.xml中已經(jīng)添加了相關(guān)的uses-permission 為什么還會(huì)發(fā)生沒(méi)有相關(guān)權(quán)限的錯(cuò)誤涛碑,導(dǎo)致應(yīng)用Crash呢精堕?
原因是Android M對(duì)應(yīng)用權(quán)限進(jìn)行了更細(xì)分的管理,不像以前版本中蒲障,權(quán)限只在應(yīng)用安裝時(shí)提醒用戶歹篓,如果用戶同意安裝該應(yīng)用就是同意了所有權(quán)限,因此很多第三方rom和一些安全軟件增加了權(quán)限管理功能來(lái)改進(jìn)android系統(tǒng)這種粗放的權(quán)限管理方式揉阎。
那么我們?cè)陂_(kāi)發(fā)中應(yīng)該怎樣應(yīng)對(duì)Android 高版本系統(tǒng)的這種改變呢庄撮。
這是最近做的一個(gè)項(xiàng)目在android版本6.0.1上安裝后,會(huì)自動(dòng)彈出該頁(yè)面讓用戶進(jìn)行權(quán)限的選擇毙籽。這里我們都設(shè)為不允許洞斯。在項(xiàng)目中有個(gè)更改頭像的功能,頭像的圖片是本地選取獲取拍照獲取坑赡。開(kāi)始時(shí)這里并沒(méi)有做過(guò)多的處理烙如,進(jìn)入獲取本地照片的頁(yè)面就會(huì)Crash。這里的處理辦法是進(jìn)行獲取本地文件前毅否,先檢查應(yīng)用有無(wú)改權(quán)限亚铁,沒(méi)有的話彈窗詢問(wèn)用戶是否允許該權(quán)限,再根據(jù)用戶相應(yīng)的操作做相應(yīng)的處理螟加。
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void checkPermission() {
if (ContextCompat.checkSelfPermission(mContext,
Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
//應(yīng)用還未獲取讀取本地文件 的權(quán)限徘溢,詢問(wèn)是否允許
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}
,PERMISSON_STORGE);
}
else {
//已經(jīng)有該權(quán)限,進(jìn)入選取圖片
selectPhoto();
}}
如何獲取用戶選擇呢捆探?
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == PERMISSON_STORGE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
selectPhoto();
} else {
showToast("權(quán)限被禁止甸昏,無(wú)法獲取手機(jī)里圖片");
}
}}
不知道怎么回事,貼出來(lái)的代碼在編輯器里面會(huì)這么亂徐许,下面附上個(gè)截圖