Android動態申請權限(一次申請多個動態權限)
Android 6.0也就是API等級23之後,獲取權限需要動態申請,否則程序無法正常使用。
以錄像功能爲例,錄像需要讀寫、相機和麥克風3個權限。下面是一次申請多個權限的代碼,單個權限申請也是差不多的。另外,在用戶禁止後彈出對話框引導用戶跳轉到設置界面去設置。
package com.barrage.barragetest;
import android.Manifest;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
//錄像需要的權限
private static final String[] VIDEO_PERMISSIONS = {Manifest.permission.CAMERA,Manifest.permission.RECORD_AUDIO,Manifest.permission.WRITE_EXTERNAL_STORAGE};
private static final int VIDEO_PERMISSIONS_CODE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestPermission();
}
//申請權限
private void requestPermission() {
// 當API大於 23 時,才動態申請權限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ActivityCompat.requestPermissions(MainActivity.this,VIDEO_PERMISSIONS,VIDEO_PERMISSIONS_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case VIDEO_PERMISSIONS_CODE:
//權限請求失敗
if (grantResults.length == VIDEO_PERMISSIONS.length) {
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
//彈出對話框引導用戶去設置
showDialog();
Toast.makeText(MainActivity.this, "請求權限被拒絕", Toast.LENGTH_LONG).show();
break;
}
}
}else{
Toast.makeText(MainActivity.this, "已授權", Toast.LENGTH_LONG).show();
}
break;
}
}
//彈出提示框
private void showDialog(){
AlertDialog dialog = new AlertDialog.Builder(this)
.setMessage("錄像需要相機、錄音和讀寫權限,是否去設置?")
.setPositiveButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
goToAppSetting();
}
})
.setNegativeButton("否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setCancelable(false)
.show();
}
// 跳轉到當前應用的設置界面
private void goToAppSetting(){
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
}
另外還需要在AndroidManifest.xml中添加相應的權限:
<!-- 相機權限 -->
<uses-permission android:name="android.permission.CAMERA" />
<!-- 錄音權限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- 讀寫權限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
效果圖,申請權限界面:
設置彈窗界面,點擊跳轉到該應用的設置頁面: