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" />
效果图,申请权限界面:
设置弹窗界面,点击跳转到该应用的设置页面: