Android6.0SDK23动态权限的请求和直接使用-使用版
来源:互联网 发布:淘宝买家vip等级 编辑:程序博客网 时间:2024/06/01 17:19
自从Android6.0以后SDK23版本,现在的Android的很多权限是需要动态请求的,例如常用的相机,读写存储,定位,录音等等,不仅仅要在AndroidManifest.xml里面做权限的请求,而且在代码里,也需要做一些处理,为了方便自己使用,把基本的模板总结出来,若没有“奇特”需求的情况下,基本是“拿来主义”直接使用。
文末会附上Demo下载。
贴图几张:
基本的操作,其他情况自己可以测试,可以自己在手机的应用管理处再把权限给取消,这样可以反复测试各种情况:
贴完图,上部分代码块:
BaseActivity自定义基类:
/** * Created by zhenQi on 2016/12/27. * 自定义BaseActivity基类 */public class BaseActivity extends AppCompatActivity { //实例化监听对象 private static PermissionListener mListener; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //添加Activity管理类的方法-添加类 ActivityCollector.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); //添加Activity管理类的方法-移除类 ActivityCollector.removeActivity(this); } //权限请求的方法(直接粘贴复制即可使用) public static void requestRuntimePermission(String[] permissions, PermissionListener listener) { Activity topActivity = ActivityCollector.getTopActivity(); if (topActivity == null) { return; } mListener = listener; List<String> permissionList = new ArrayList<>(); for (String permission : permissions) { if (ContextCompat.checkSelfPermission(topActivity, permission) != PackageManager.PERMISSION_GRANTED) { permissionList.add(permission); } } if (!permissionList.isEmpty()) { ActivityCompat.requestPermissions(topActivity, permissionList.toArray(new String[permissionList.size()]), 1); } else { mListener.onGranted(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 1: if (grantResults.length > 0) { List<String> deniedPermissions = new ArrayList<>(); for (int i = 0; i < grantResults.length; i++) { int grantResult = grantResults[i]; String permission = permissions[i]; if (grantResult != PackageManager.PERMISSION_GRANTED) { deniedPermissions.add(permission); } } if (deniedPermissions.isEmpty()) { mListener.onGranted(); } else { mListener.onDenied(deniedPermissions); } } break; default: break; } }}
主要操作的类MainActivity:
/** * 权限的请求操作封装在BaseActivity基类中,当前类继承BaseActivity基类 * 首先声明(废话):动态权限是Android 6.0版本以后(SDK:23),谷歌更新的对于一些危险/隐秘权限的动态提醒和动态授权的“规定” * 可以用判断方法:Build.VERSION.SDK_INT >= 23,来判断当前版本是不是大于SDK 23。——废话结束。 * 使用权限方法,直接调用requestRuntimePermission(要请求的权限数组,PermissionListener监听方法)的方法, * 注:首先所有的动态请求,都是要在AndroidManifest.xml,中去添加的,例如: * <uses-permission android:name="android.permission.CALL_PHONE" />//打电话权限 * <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />//精准定位权限 * <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />//写数据权限 * <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />//读数据权限 * <uses-permission android:name="android.permission.CAMERA" />//相机权限 * <uses-permission android:name="android.permission.RECORD_AUDIO" />//录音权限 * 等等... */public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * (这里引用布局的onClick点击方法) * * @param view 点击-统一请求很多权限: */ public void buttonClick(View view) { requestRuntimePermission(new String[]{ Manifest.permission.CALL_PHONE,//打电话权限 Manifest.permission.ACCESS_FINE_LOCATION,//精准定位权限 Manifest.permission.CAMERA,//相机权限 Manifest.permission.WRITE_EXTERNAL_STORAGE,//写数据权限 Manifest.permission.READ_EXTERNAL_STORAGE,//读数据权限 Manifest.permission.RECORD_AUDIO//录音权限 }, new PermissionListener() { //授权后的回调方法 @Override public void onGranted() { Toast.makeText(MainActivity.this, "所有权限都同意了", Toast.LENGTH_SHORT).show(); } //权限被拒绝的回调方法 @Override public void onDenied(List<String> deniedPermission) { for (String permission : deniedPermission) { Toast.makeText(MainActivity.this, "被拒绝权限:" + permission, Toast.LENGTH_SHORT).show(); } } }); } //单独请求相机权限 public void pai(View view) { requestRuntimePermission(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, new PermissionListener() { @Override public void onGranted() { Toast.makeText(MainActivity.this, "允许了拍照", Toast.LENGTH_SHORT).show(); } @Override public void onDenied(List<String> deniedPermission) { for (String permission : deniedPermission) { Toast.makeText(MainActivity.this, "被拒绝权限:" + permission, Toast.LENGTH_SHORT).show(); } } }); } //单独请求-存储权限 public void cun(View view) { requestRuntimePermission(new String[]{Manifest.permission.CAMERA}, new PermissionListener() { @Override public void onGranted() { Toast.makeText(MainActivity.this, "允许了读写", Toast.LENGTH_SHORT).show(); } @Override public void onDenied(List<String> deniedPermission) { for (String permission : deniedPermission) { Toast.makeText(MainActivity.this, "被拒绝权限:" + permission, Toast.LENGTH_SHORT).show(); } } }); } //单独请求-打电话的权限 public void callClick(View view) { Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "123456789")); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return; } startActivity(intent); } //跳转到下一页 public void tiao(View view) { Intent intent = new Intent(this, Main2Activity.class); startActivity(intent); } //抽出-做一些操作的方法 private void doSomething() { // do something Toast.makeText(this, "所有权限都同意了", Toast.LENGTH_SHORT).show(); }}
其他代码:
其他说明:
Demo中自定义了Util工具类,
PermissionListener(监听回调)接口,
自定义ActivityCollector(Activity)管理类
/** * Created by zhenQi on 2016/12/27. * 自定义的一个工具类 */public class Util { public void test() { BaseActivity.requestRuntimePermission(new String[]{}, new PermissionListener() { @Override public void onGranted() { } @Override public void onDenied(List<String> deniedPermission) { } }); }}
/** * Created by zhenQi on 2016/12/27. * Activity的管理类,方面统一管理Activity */public class ActivityCollector { private static List<Activity> activityList = new ArrayList<>(); public static void addActivity(Activity activity) { activityList.add(activity); } public static void removeActivity(Activity activity) { activityList.remove(activity); } public static Activity getTopActivity() { if (activityList.isEmpty()) { return null; } else { return activityList.get(activityList.size() - 1); } }}
/** * Created by zhenQi on 2016/12/27. * 定义回调接口,授权的方法,和拒绝的方法 */public interface PermissionListener { void onGranted(); void onDenied(List<String> deniedPermission);}
public class Main2Activity extends AppCompatActivity implements View.OnClickListener { private Button finish; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); initView(); } //点击-请求录音的权限(这里引用布局的onClick(lu)点击方法) public void luyin(View view) { requestRuntimePermission(new String[]{Manifest.permission.RECORD_AUDIO}, new PermissionListener() { @Override public void onGranted() { //授权的操作 Toast.makeText(Main2Activity.this, "录音权限-已经授权", Toast.LENGTH_SHORT).show(); } @Override public void onDenied(List<String> deniedPermission) { for (String permission : deniedPermission) { //未授权的操作 Toast.makeText(Main2Activity.this, "录音权限-未经授权", Toast.LENGTH_SHORT).show(); } } }); } private void initView() { finish = (Button) findViewById(R.id.finish); //这里使用监听点击事件的方法,激活点击事件 finish.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { //返回上一页-杀死当前Activity case R.id.finish: finish(); break; } }}
点击此处,下载Demo;
权限区分列表:
点击此处,下载Demo;
1 0
- Android6.0SDK23动态权限的请求和直接使用-使用版
- android6.0/sdk23版本的AsyncHttpClient框架的使用
- android6.0动态权限的使用
- Android6.0的动态权限的简单使用
- Android6.0权限的使用
- 使用EasyPermissions 来打造简单的android6.0动态权限
- Android6.0权限管理依赖库的介绍和使用
- android6.0以上权限动态请求实现
- Android6.0动态运行时权限封装使用
- Android6.0动态权限设置 第三方开源库permissiongen使用封装
- Android6.0权限封装使用
- android6.0+ Permission权限使用
- Android6.0请求权限
- Android6.0动态权限
- Android6.0动态权限
- Android6.0动态权限
- Android6.0动态权限
- android6.0动态权限
- 自定义字符串拷贝my_strcpy()
- 集合框架-LinkedHashSet的概述和使用
- [leetcode.Tree]563. Binary Tree Tilt
- Elasticsearch基础教程
- VS2005批处理顺序编译解决方案
- Android6.0SDK23动态权限的请求和直接使用-使用版
- Android 关于MVP的一些思考与总结
- caffe:blob、layer和net源码学习
- 如何看CentOS系统是32位还是64位的?
- 【OM】SoftEtherVPN搭建教程(1)
- Python自动化拉取Mysql数据并装载到Hive
- Android内容提供器实现导入手机中的全部歌曲
- SQL Server 无法打开物理文件拒绝访问解决方法
- 自定义标题栏