Android 6.0以上动态权限备忘录
来源:互联网 发布:网络侦探攻略第十九章 编辑:程序博客网 时间:2024/05/17 09:18
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联系我删除。
阅读全文
0 0
- Android 6.0以上动态权限备忘录
- [Android] 6.0以上系统动态权限说明
- Android 6.0以上 动态权限申请
- android 6.0以上动态权限的申请
- android 6.0 以上如何动态申请权限?
- Android 6.0以上系统动态获取权限
- Android 6.0 7.0及以上 动态权限
- Android开发动态获取权限(6.0以上API>23)
- android拨打电话崩溃6.0以上实时动态权限申请
- 解决Android拍照6.0以上动态获取权限问题
- Android 6.0 以上权限问题
- Android 6.0以上权限处理
- android 6.0以上权限设置
- Android 6.0(API 23)及其以上动态申请的权限与申请权限的方法
- android 6.0及以上 运行时权限申请(动态权限申请)
- 安卓6.0以上动态权限问题
- Android移动开发-Android 6.0以上动态运行时权限申请方法
- Android之动态申请权限(API23以上需求)
- redis-aof
- 数据类型
- Translate Picture to Char-Set Picture
- jQuery杂项方法
- 微服务泛谈
- Android 6.0以上动态权限备忘录
- C语言实现FTP(C/S)协议(ls命令和download命令)用两个端口实现(命令端口和数据端口)
- elasticsearch CRUD
- 20171221memo
- ubuntu安装配置sbt
- GIT PUSH/PULL时总需要输入用户名密码的解决方案
- Android关于AutoService、Javapoet讲解
- 全排列
- 数据结构与算法_链表1_单链表