在早期版本的Android中适肠,權(quán)限的申請十分簡單,在AndroidManifest.xml中請求對應(yīng)的權(quán)限就可以了制圈。
Google發(fā)現(xiàn)们童,這樣子的權(quán)限申請方式,問題好大>小慧库!因?yàn)橛脩粼诎惭b的時候,只需要同意一次即會同意所有權(quán)限馋嗜,沒辦法單個拒絕權(quán)限完沪,造成用戶信息的泄露。(直接安裝apk嵌戈,同意一次即可覆积;如果在GooglePlay安裝,也是同意權(quán)限就直接下載了)一個相對合理的權(quán)限方案熟呛,千呼萬喚終于來了宽档。為了不對早期版本的App造成傷害,在早期的Build版本的Apk庵朝,直接在Manifest里申請權(quán)限吗冤,是沒有問題了,不過發(fā)布Google Play的時候九府,會提示你要用最新的BuildTool(國內(nèi)環(huán)境跟不上沒辦法)早期的方案就不記錄了椎瘟,這里看看最新的方案要怎么弄!(其實(shí)官方教程和網(wǎng)上資料都很多侄旬,官方教程很詳細(xì)肺蔚,網(wǎng)上的資料就比較亂,甚至有些把簡單的權(quán)限方式弄的太復(fù)雜了儡羔,或者說對應(yīng)一般的情況宣羊,可以有更簡單的解決方法)
這里先大致貼一下思路(假設(shè)獲取位置的FINE_LOCATION權(quán)限):
1.檢查是否已經(jīng)有這個權(quán)限(有權(quán)限,直接就去執(zhí)行定位吧)
2.如果沒有這個權(quán)限汰蜘,就向用戶申請這個權(quán)限
3.用戶如果允許仇冯,執(zhí)行定位,用戶如果拒絕族操,執(zhí)行其他操作(千萬別像某信苛坚,某寶,某度那樣,不給權(quán)限不運(yùn)行App哦F貌铡=闵摹!)
那么對應(yīng)的代碼就是這樣:
// RequestCode是獲取返回用的柠掂!
private final int PERMISSION_REQUEST_CODE = 1;
// 方法项滑,獲取位置權(quán)限
protected void requestFineLocationPermission() {
String permission = Manifest.permission.ACCESS_FINE_LOCATION;
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
// 此時還沒有權(quán)限!
ActivityCompat.requestPermissions(this, new String[]{permission}, PERMISSION_REQUEST_CODE);
}
else {
// 有權(quán)限了涯贞,去做該做的事情吧枪狂!
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if(requestCode == PERMISSION_REQUEST_CODE) {
if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//權(quán)限通過
}
}else{
//權(quán)限拒絕
}
return;
}
super.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
是的,就是這么簡單宋渔。不過州疾,如果你就這樣子用在了你的項(xiàng)目里,會有坑;始稹Q媳汀!
如果你本身就是Android用戶氧急,細(xì)心的你一定會發(fā)現(xiàn)颗胡,App在向你申請權(quán)限的時候,你會有幾個選項(xiàng):
1.允許
2.禁止
3.還可以禁止后不再詢問7园印(坑就出現(xiàn)在這里了)
如果按上面的代碼毒姨,你會永遠(yuǎn)得到一個結(jié)果:用戶拒絕!6で蕖(如果用戶是不小心點(diǎn)錯弧呐,或者出于好奇心嘗試,那很容易就懵逼了)而且你的requestPermissions方法嵌纲,在用戶面前完全不會顯示權(quán)限對話框俘枫!
所以我們要修改一下第二段:
// 方法,獲取位置權(quán)限
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 權(quán)限通過
} else {
// 權(quán)限拒絕
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
// 禁止后不再詢問了逮走!
} else {
// 用戶此次選擇了禁止權(quán)限
}
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
這個方法鸠蚪,shouldShowRequestPermissionRationale,翻譯過來就是:是否應(yīng)該顯示請求權(quán)限的說明言沐。我們就可以用來檢查用戶是否選擇了“禁止后不再詢問”邓嘹。
這里就簡單說一下返回值Boolean的意思,True表示此時應(yīng)該顯示說明险胰,F(xiàn)alse表示用戶選擇了不要再提示了,證明用戶不想將該權(quán)限賦予你的App矿筝,不用解釋了……
至此起便,這個功能算是可用了!!榆综!但是妙痹,還不完美!1谴怯伊!必須稍微封裝一下讓自己用起來更方便嘛!思路如下:
1.一個Class MyBaseActivity判沟,這個相信你會有
2.一個Interface PermissionListener(可選耿芹,不然就在MyBaseActivity里添加可復(fù)寫方法)
這里用Interface的方法貼一下代碼:(其實(shí)在MyBaseActivity里會更簡單哈)
private final int PERMISSION_REQUEST_CODE = 1;
private int mPermissionRequestId;
private PermissionListener mPermissionListener;
protected void permissionRequest(int requestId, String permission, PermissionListener listener) {
mPermissionListener = listener;
mPermissionRequestId = requestId;
if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) {
mPermissionListener.onPermissionConfirmed(mPermissionRequestId);
} else {
// 嘗試請求權(quán)限
ActivityCompat.requestPermissions(this, new String[]{permission}, PERMISSION_REQUEST_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//權(quán)限通過
mPermissionListener.onPermissionConfirmed(mPermissionRequestId);
} else {
//權(quán)限拒絕
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
// 用戶直接拒絕了(不再顯示)
mPermissionListener.onPermissionDeniedForever(mPermissionRequestId);
} else {
// 用戶此次選擇了禁止權(quán)限
mPermissionListener.onPermissionDenied(mPermissionRequestId);
}
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
public interface PermissionListener {
void onPermissionConfirmed(int requestId);
void onPermissionDenied(int requestId);
void onPermissionDeniedForever(int requestId);
}
然后,在你的Activity里挪哄,extend你的MyBaseActivity吧秕,implements剛才那個Interface,然后通過剛才寫的這個方法:permissionRequest(YOUR_REQUEST_ID, Manifest.permission.PERMISSION_YOU_WANT, YourActivity.this);就可以在接口回調(diào)里知道權(quán)限的情況咯迹炼!
(個人覺得在MyBaseActivity里加模板方法的方案會更優(yōu)砸彬,這里就不貼出來了,自己嘗試吧K谷搿)