大家好,我是小帥,好久沒(méi)有更新博客了,哈哈,有點(diǎn)懈怠.今天帶給大家的是android6.0權(quán)限,話說(shuō)6.0都出來(lái)好久了,老手忽悠吧!我還是習(xí)慣喜歡上個(gè)效果圖!
當(dāng)用戶拒絕權(quán)限的時(shí)候提示權(quán)限的處理,并且如何打開(kāi),中間的dialog可以自己定義.
6.0的運(yùn)行時(shí)權(quán)限,需要使用如下的API:
int checkSelfPermission(String permission) 用來(lái)檢測(cè)應(yīng)用是否已經(jīng)具有權(quán)限
void requestPermissions(String[] permissions, int requestCode) 進(jìn)行請(qǐng)求單個(gè)或多個(gè)權(quán)限
void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) 用戶對(duì)請(qǐng)求作出響應(yīng)后的回調(diào)
其實(shí)簡(jiǎn)單講就是對(duì)這幾個(gè)的API的使用,記住就行.還有一個(gè)問(wèn)題就是什么時(shí)候需要用到6.0權(quán)限,其實(shí)這里只需要記住危險(xiǎn)權(quán)限就行,下面小帥給大家準(zhǔn)備一張表,需要的拿去
左邊的是權(quán)限組,右邊的是權(quán)限組里面的權(quán)限,只要一次申請(qǐng)權(quán)限組里面的權(quán)限,對(duì)應(yīng)的權(quán)限組的權(quán)限也申請(qǐng)了.
好了,聊了那么久,還是直接上代碼吧,因?yàn)楦鞣N情況的都不一樣,所以這里簡(jiǎn)單的舉了個(gè)列子
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBtnMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mBtnMain = (Button) findViewById(R.id.btn_main);
mBtnMain.setOnClickListener(this);
}
private void callPhone() {
//沒(méi)有授予權(quán)限
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE)!= PackageManager.PERMISSION_GRANTED) {
//做權(quán)限處理,主要是申請(qǐng)權(quán)限
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE},1);
}else {
doCallPhone();
}
}
private void doCallPhone() {
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+"10086"));
startActivity(intent);//代碼檢查工具,不需要處理
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_main:
callPhone();
break;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
//申請(qǐng)了權(quán)限
case 1:
if (grantResults[0]== PackageManager.PERMISSION_GRANTED) {
doCallPhone();
}else {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("幫助")
.setMessage("當(dāng)前應(yīng)用缺少必要權(quán)限.請(qǐng)點(diǎn)擊'設(shè)置'-'權(quán)限',打開(kāi)所需權(quán)限.最后點(diǎn)擊兩次后退按鈕,即可返回")
.setCancelable(false)
.setPositiveButton("設(shè)置", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);
}
})
.setNegativeButton("退出", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
}).show();
AlertDialog alert = builder.create();
}
break;
}
}
}
記得去清單文件里面添加權(quán)限
** <uses-permission android:name="android.permission.CALL_PHONE" />**
其實(shí)有時(shí)候覺(jué)得6.0權(quán)限沒(méi)有必要做,但當(dāng)你手機(jī)是6.0的時(shí)候,你如果只寫(xiě)
doCallPhone()的邏輯代碼時(shí)候會(huì)得不到執(zhí)行.
當(dāng)然也可以有偷懶的方法了
你的應(yīng)用將targetSdkVersion設(shè)置低于23,那么在6.0的系統(tǒng)上不會(huì)為這個(gè)應(yīng)用開(kāi)啟運(yùn)行時(shí)權(quán)限機(jī)制扯旷,即按照以前的一刀切方式處理.
其他權(quán)限基本類型,有些手機(jī)比如小米,華為里面是定制版的Android,里面的dialog風(fēng)格是不一樣的,但實(shí)現(xiàn)原理不變,最后附上demo鏈接:
https://github.com/Chenshuai770/test_permision3.git
我是小帥,一起進(jìn)步