Android 6.0 运行时权限 easypermissions,permissionsdispatcher ,rxpermissions 三种不同方案的实现
来源:互联网 发布:有哪些搜索算法 编辑:程序博客网 时间:2024/05/18 01:25
关于android 6.0 运行时权限 ,目前有五种处理方法
危险权限和权限组
1.. 采用不理睬的方式将项目的targetSdkVersion 设置为22及以下,
如果设备运行的是 Android 5.1(API 级别 22)或更低版本,
并且应用的 targetSdkVersion 是 22 或更低版本,则系统会在安装时要求用户授予权限。
再次强调,系统只告诉用户应用需要的权限组,而不告知具体权限。
2.. 采用系统原生API处理,google原生方案。(采用原生方案,后面会更新。。。。)
3.. easypermissions 基于注解,采用反射,影响性能
package com.example.administrator.permissionstest;import android.Manifest;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.TextView;import android.widget.Toast;import java.util.List;import pub.devrel.easypermissions.EasyPermissions;public class EasyActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks { private static final int RC_CALL_PHONE = 0; private String TAG= "EasyActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_common); TextView permissions = (TextView) findViewById(R.id.permissions); permissions.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] perms = {Manifest.permission.CALL_PHONE}; EasyPermissions.requestPermissions(EasyActivity.this, "直接拨打电话的权限", RC_CALL_PHONE, perms); } }); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //Forward results to EasyPermissions Toast.makeText(getApplicationContext(), "onRequestPermissionsResult requestCode" + requestCode, Toast.LENGTH_LONG).show(); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsGranted(int requestCode, List<String> perms) { if (perms != null && perms.size() > 0) for (String item : perms) { Log.d(TAG,"onPermissionsGranted "+item); } } @Override public void onPermissionsDenied(int requestCode, List<String> perms) { if (perms != null && perms.size() > 0) for (String item : perms) { Log.d(TAG,"onPermissionsDenied "+item); } }}
4.. permissionsdispatcher 基于注解,编译生成类,无反射,不影响性能
package com.example.administrator.permissionstest;import android.Manifest;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.support.annotation.NonNull;import android.support.v7.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.TextView;import android.widget.Toast;import permissions.dispatcher.NeedsPermission;import permissions.dispatcher.OnNeverAskAgain;import permissions.dispatcher.OnPermissionDenied;import permissions.dispatcher.OnShowRationale;import permissions.dispatcher.PermissionRequest;import permissions.dispatcher.RuntimePermissions;@RuntimePermissionspublic class DispatcherActivity extends AppCompatActivity { private String TAG = "DispatcherActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_common); TextView permissions = (TextView) findViewById(R.id.permissions); permissions.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "showCameraWithCheck "); DispatcherActivityPermissionsDispatcher.showCameraWithCheck(DispatcherActivity.this); } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // NOTE: delegate the permission handling to generated method DispatcherActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults); } @NeedsPermission(Manifest.permission.CAMERA) void showCamera() { Log.d(TAG, "showCamera "); Intent intent = new Intent(); //调用照相机 intent.setAction("android.media.action.STILL_IMAGE_CAMERA"); startActivity(intent); } @OnShowRationale(Manifest.permission.CAMERA) void showRationaleForCamera(final PermissionRequest request) { Log.d(TAG, "showRationaleForCamera "); new AlertDialog.Builder(this) .setMessage("使用此功能需要打开照相机的权限") .setPositiveButton("允许", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { request.proceed(); } }) .setNegativeButton("拒绝", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { request.cancel(); } }) .show(); } @OnPermissionDenied(Manifest.permission.CAMERA) void showDeniedForCamera() { Log.d(TAG, "showDeniedForCamera "); Toast.makeText(this, "你拒绝了权限,该功能不可用", Toast.LENGTH_SHORT).show(); } @OnNeverAskAgain(Manifest.permission.CAMERA) void showNeverAskForCamera() { Log.d(TAG, "showNeverAskForCamera "); Toast.makeText(this, "用户设置不再询问权限申请", Toast.LENGTH_SHORT).show(); // Toast.makeText(this, " R.string.permission_camera_neverask", Toast.LENGTH_SHORT).show(); }}
5.. rxpermissions 基于Rxjava, Rxjava1.0版本跟2.0版本都有(本文采用Rxjava2.0)
package com.example.administrator.permissionstest;import android.Manifest;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.TextView;import android.widget.Toast;import com.tbruyelle.rxpermissions2.Permission;import com.tbruyelle.rxpermissions2.RxPermissions;import io.reactivex.functions.Consumer;import pub.devrel.easypermissions.EasyPermissions;public class RxActivity extends AppCompatActivity{ private String TAG= "RxActivity";//READ_EXTERNAL_STORAGE @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_common); TextView permissions = (TextView) findViewById(R.id.permissions); permissions.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // RxPermissions rxPermission = new RxPermissions(RxActivity.this); requestPermission(); } }); } public void requestPermission(){ RxPermissions rxPermissions = new RxPermissions(this); rxPermissions.requestEach(Manifest.permission.READ_EXTERNAL_STORAGE).subscribe(new Consumer<Permission>() { @Override public void accept(Permission permission) throws Exception { if (permission.granted) { // 用户已经同意该权限 Toast.makeText(getApplicationContext(),"用户已经同意该权限",Toast.LENGTH_SHORT).show(); Log.d(TAG, permission.name + " is granted."); } else if (permission.shouldShowRequestPermissionRationale) { // 用户拒绝了该权限,没有选中『不再询问』(Never ask again),那么下次再次启动时,还会提示请求权限的对话框 Toast.makeText(getApplicationContext(),"用户拒绝了该权限",Toast.LENGTH_SHORT).show(); Log.d(TAG, permission.name + " is denied. More info should be provided."); } else { // 用户拒绝了该权限,并且选中『不再询问』 Toast.makeText(getApplicationContext(),"用户拒绝了该权限,并且选中『不再询问』",Toast.LENGTH_SHORT).show(); Log.d(TAG, permission.name + " is denied."); } } }); } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); //Forward results to EasyPermissions Toast.makeText(getApplicationContext(), "onRequestPermissionsResult requestCode" + requestCode, Toast.LENGTH_LONG).show(); EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); }}
PS:本人写的一个小Demo 里面包含了easypermissions,permissionsdispatcher ,rxpermissions
三种插件的用法
permissions Demo
Google官方github Demo
阅读全文
0 0
- Android 6.0 运行时权限 easypermissions,permissionsdispatcher ,rxpermissions 三种不同方案的实现
- 目前最流行的运行时权限请求框架PermissionsDispatcher、RxPermissions和easypermissions的使用和对比
- 目前最流行的运行时权限请求框架PermissionsDispatcher、RxPermissions和easypermissions的使用和对比
- Android 运行时权限获取-PermissionsDispatcher
- Android 6.0以上运行权限及RxPermissions的使用
- android 运行时权限解析RxPermissions的使用
- Android基础知识---RxPermissions获取运行时权限
- Android动态获取运行时权限RxPermissions
- Android 6.0+ 运行时权限——EasyPermissions源码解析
- PermissionsDispatcher库的使用(简单处理Android 6.0系统中的运行时权限的开源库)
- Android 6.0运行时权限的申请使用及EasyPermissions的使用
- Android 6.0运行时权限的申请使用及EasyPermissions的使用
- 安卓学习笔记--- Android 6.0运行时权限的申请使用及EasyPermissions的使用
- Android M 6.0以上 需要运行时申请的权限--easypermissions库
- RxPermissions 获取运行时权限
- RxPermissions解决Android 6.0 获取运行权限问题
- android——RxPermissions获取运行时权限
- Android 6.0权限+RxPermissions使用
- Android常用控件七之ProgressBar的代码用法
- Android 监听屏幕锁屏(听音频,看视频)
- Word_Search
- codeforces round 22-B.the golden age
- es5.X插件headmaster的简单安装方法
- Android 6.0 运行时权限 easypermissions,permissionsdispatcher ,rxpermissions 三种不同方案的实现
- 线程池
- AngularJS之内置指令汇总
- Java中关于final修饰符的几个知识点
- Ubuntu系统安装QT
- 一种基于C++的扑克牌实现
- 新闻客户端
- 二叉搜索树与双向链表
- 汇编语言(第三版)检测点笔记