前幾天遇到一個(gè)需求強(qiáng)制用戶去申請(qǐng)某個(gè)權(quán)限,大家都知道(Api 23)以后官方提出動(dòng)態(tài)權(quán)限拍谐,所以我們要提示用戶打開權(quán)限烛缔,實(shí)現(xiàn)功能后總結(jié)了一下實(shí)現(xiàn)方法,下面來(lái)說(shuō)一下我是怎么強(qiáng)制用戶去申請(qǐng)權(quán)限的:
1.先介紹一下平時(shí)申請(qǐng)動(dòng)態(tài)權(quán)限常用的一些API:
//用于檢測(cè)權(quán)限是否打開
ContextCompat.checkSelfPermission(@NonNull Context context, @NonNull String permission) == PackageManager.PERMISSION_DENIED
//去申請(qǐng)權(quán)限
ActivityCompat.requestPermissions(final @NonNull Activity activity,final @NonNull String[] permissions, final @IntRange(from =0)int requestCode)
//返回權(quán)限申請(qǐng)結(jié)果
onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
2.幾句話說(shuō)明強(qiáng)制用戶申請(qǐng)權(quán)限流程:
1.判斷用戶是否打開權(quán)限?? checkSelfPermission()
2.如果用戶沒有打開權(quán)限則去申請(qǐng)權(quán)限? requestPermissions()
3.返回申請(qǐng)結(jié)果? onRequestPermissionsResult()
4.判斷用戶是否決絕權(quán)限? grantResult == PackageManager.PERMISSION_DENIED
5.如果用戶拒絕則提示彈出Dialog提示去設(shè)置頁(yè)面打開權(quán)限
6.在onActivityResult()判斷全是是否打開轩拨,如果沒有調(diào)用 requestPermissions()去申請(qǐng)權(quán)限
上面是一個(gè)循環(huán)申請(qǐng)的過(guò)程
3.代碼圖片
4.直接上代碼了
public class MainActivityextends Activity {
private String[]PERMISSION =new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
? ? private static final StringTAG ="";
? ? private static final int OPEN_SET_REQUEST_CODE =15;
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? initData();
? ? }
??? private void initData() {
?????? if (lacksPermissions(PERMISSION)) {
??????? Log.i(TAG, "缺少權(quán)限去申請(qǐng)");
? ? ? ? ? ? ActivityCompat.requestPermissions(this, PERMISSION, OPEN_SET_REQUEST_CODE);
? ? ? ? }else {
??????? Log.i(TAG, "已經(jīng)全部打開權(quán)限");
? ? ? ? }
}
@Override
? ? protected void onActivityResult(int requestCode, int resultCode, Intent data) {
?????? super.onActivityResult(requestCode, resultCode, data);
? ? ? ? if (requestCode ==OPEN_SET_REQUEST_CODE) {
???????????? if (lacksPermissions(PERMISSION)) {
????????????????? Log.i(TAG, "缺少權(quán)限去申請(qǐng)");
? ? ? ? ? ? ? ?? ActivityCompat.requestPermissions(this, PERMISSION, OPEN_SET_REQUEST_CODE);
? ? ? ? ? ? }
}
}
@Override
? ? public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
???? super.onRequestPermissionsResult(requestCode, permissions, grantResults);
? ? ? ? if (requestCode ==OPEN_SET_REQUEST_CODE) {
?????????? if (hasAllPermissionsGranted(grantResults)) {
??????????????? Log.i(TAG, "用戶允許打開權(quán)限");
? ? ? ? ? ? }else {
??????????????? Log.i(TAG, "用戶拒絕打開權(quán)限");
? ? ? ? ? ? ? ? showPermissionDialog("請(qǐng)去設(shè)置頁(yè)面打開***權(quán)限", OPEN_SET_REQUEST_CODE);
? ? ? ? ? ? }
}
}
/**
? ? * 判斷權(quán)限申請(qǐng)結(jié)果
? ? *
? ? * @param grantResults
? ? * @return
? ? */
? ? private boolean hasAllPermissionsGranted(@NonNull int[] grantResults) {
???? for (int grantResult : grantResults) {
???????????? if (grantResult == PackageManager.PERMISSION_DENIED) {//PERMISSION_GRANTED 授予
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
??? }
??? return true;
? ? }
// 判斷是否缺少權(quán)限權(quán)限集合 true=缺少權(quán)限
? ? public boolean lacksPermissions(String... permissions) {
??? for (String permission : permissions) {
????????? if (lacksPermission(permission)) {
??????????? return true;
? ? ? ? ? ? }
}
return false;
}
// 判斷是否缺少權(quán)限? true=缺少權(quán)限
? ? public boolean lacksPermission(String permission) {
??? return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_DENIED;
? ? }
private void showPermissionDialog(String text, int requestCode) {
/*此處彈出Dialog顯示內(nèi)容為text(需要去設(shè)置頁(yè)面打開***權(quán)限)具體Dialog我就不寫了,
? ? ? ? 點(diǎn)擊確定按鈕調(diào)用toSetActivity(OPEN_SET_REQUEST_CODE)方法*/
? ? ? ? toSetActivity(requestCode);
? ? }
private void toSetActivity(int requestCode) {
Intent intent =new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
? ? ? ? Uri uri = Uri.fromParts("package", getPackageName(), null);
? ? ? ? intent.setData(uri);
? ? ? ? startActivityForResult(intent, requestCode);
? ? }
}