Android 6.0以上动态权限申请备忘录
最近的一个项目已经打包给测试了,每天的主要工作就是面对着电脑屏幕发呆。发呆之余,顺手整理一下经常会用到的那些代码吧。今天主要写写Android 6.0以上动态权限申请的步骤。
关于什么是普通权限,什么是敏感权限,动态申请权限的流程是什么等已经有前辈们做了大量的阐述,我这里不在赘述了,直接贴代码吧。
1.创建项目
在Android Studio 主界面依次File > New > New Project…… > Next > Next > Next > Finish.
2.在Manifest中声明权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.stevengo.permissiontest">
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.CAMERA"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".PermissionActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
我这里随便声明了两个权限,仅作为示例。
3.添加字符串资源
<resources>
<string name="string_dialog_title_help">帮助</string>
<string name="string_dialog_content_lack_permission">程序缺少必要的权限,请单击【确定】按钮进行设置!</string>
<string name="string_dialog_positiveButton">确定</string>
<string name="string_dialog_negativeButton">取消</string>
</resources>
4.编写申请逻辑
package cn.stevengo.permissiontest;
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.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
/**
* @author StevenGo
* @date 2017/12/21
* <p>
* Android 6.0以上动态权限示例
*/
public class PermissionActivity extends AppCompatActivity {
/**
* 要申请的权限
*/
private String[] permissions = new String[]{
"android.permission.WRITE_CONTACTS",
"android.permission.CAMERA"
};
/**
* 权限请求码
*/
public static final int PERMISSION_REQUEST_CODE = 0x001;
/**
* startActivityForResult请求码
*/
public static final int FOR_RESULT_REQUEST_CODE = 0x002;
/**
* url scheme
*/
public static final String PACKAGE_URL_SCHEME = "package:";
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_permission);
initPermission();
}
/**
* 初始化权限的方法
*/
private void initPermission() {
//判断当前编译版本是否大于M
//如果小于M直接延时启动
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
//无需动态申请权限
//do something
return;
}
//当有未授权的权限时进行权限请求
String[] needPermission = checkPermission();
if (needPermission.length != 0) {
ActivityCompat.requestPermissions(PermissionActivity.this,
needPermission,
PERMISSION_REQUEST_CODE);
//授权成功
} else {
//do something
}
}
/**
* 检查未授权的权限
*/
private String[] checkPermission() {
//存储未授权的权限
List<String> deniedPermissionList = new ArrayList<>();
//检查需要的权限是否已经授权,将未授权的权限保存到list中
for (int i = 0; i < permissions.length; i++) {
if (ContextCompat.checkSelfPermission(PermissionActivity.this, permissions[i]) != PackageManager.PERMISSION_GRANTED) {
deniedPermissionList.add(permissions[i]);
}
}
//将list中的权限转换成array存储
String[] deniedPermissions = new String[deniedPermissionList.size()];
for (int i = 0; i < deniedPermissions.length; i++) {
deniedPermissions[i] = deniedPermissionList.get(i);
}
return deniedPermissions;
}
/**
* 进行完权限请求回调的方法
*
* @param requestCode 请求码
* @param permissions 要申请的权限
* @param grantResults 请求结果
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
boolean flag = true;
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
//检查是否有未授权的权限
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
flag = false;
break;
}
}
//如果没有未授权的权限,执行后续操作
if (flag) {
//do something
}
//如果有未授权的权限,引导用户授权
else {
showAlterDialog(R.string.string_dialog_title_help, R.string.string_dialog_content_lack_permission);
}
break;
default:
break;
}
}
/**
* 显示提示对话框
*
* @param titleId 标题资源id
* @param contentId 内容资源id
*/
private void showAlterDialog(int titleId, int contentId) {
AlertDialog dialog = new AlertDialog.Builder(this)
//设置标题
.setTitle(titleId)
//设置内容
.setMessage(contentId)
//设置确定按钮
.setPositiveButton(R.string.string_dialog_positiveButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//启动应用详情页
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse(PACKAGE_URL_SCHEME + getPackageName()));
startActivityForResult(intent, FOR_RESULT_REQUEST_CODE);
}
})
//设置取消按钮
.setNegativeButton(R.string.string_dialog_negativeButton, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//执行权限不足对应的操作
//do something
}
})
.create();
dialog.show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//设置完权限之后重新初始化,检查授权情况
switch (requestCode) {
case FOR_RESULT_REQUEST_CODE:
//重新初始化权限
initPermission();
break;
default:
break;
}
}
}
ok,动态申请权限的流程就这么多。
网上这类文章还是蛮多的,我参考了好几篇,但是实在抱歉不知道有哪些了,如果有人看到认为我侵权的话请1435374903@qq.com联系我删除。