想了解EasyPermisson动态权限使用例子的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于动态权限设置的相关问题,此外,我们还将为您介绍关于6.0动态加载权限用PermissionGe
想了解EasyPermisson 动态权限使用例子的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于动态权限设置的相关问题,此外,我们还将为您介绍关于6.0动态加载权限用PermissionGen、Android 6.0动态权限获取:一个EasyPermission的权限管理库、Android EasyPermissions官方库高效处理权限相关教程、Android EasyPermissions拍照权限管理申请的新知识。
本文目录一览:- EasyPermisson 动态权限使用例子(动态权限设置)
- 6.0动态加载权限用PermissionGen
- Android 6.0动态权限获取:一个EasyPermission的权限管理库
- Android EasyPermissions官方库高效处理权限相关教程
- Android EasyPermissions拍照权限管理申请
EasyPermisson 动态权限使用例子(动态权限设置)
Android 6.0起权限管理更严格了,朝着IOS权限靠拢了。看来Android也慢慢朝着封闭的方向发展了。如果 targetSdkVersion <23,就没有动态权限问题,但这不是长久之计,迟早要适配的。
Android将权限分为3种:
- 普通权限(Normal Permissions)
- 危险权限(Dangerous Permissions)
- 特殊权限(Special Permissions)
如果 targetSdkVersion>=23 那么就要对 危险权限和 特殊权限动态申请
危险权限(Dangerous Permissions)
Permission Group | Permissions |
---|---|
CALENDAR | READ_CALENDAR <br/>WRITE_CALENDAR |
CAMERA | CAMERA |
CONTACTS | READ_CONTACTS <br/>WRITE_CONTACTS <br/>GET_ACCOUNTS |
LOCATION | ACCESS_FINE_LOCATION <br/>ACCESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | READ_PHONE_STATE<br/> CALL_PHONE <br/>READ_CALL_LOG <br/>WRITE_CALL_LOG <br/>ADD_VOICEMAIL USE_SIP <br/>PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | SEND_SMS <br/>RECEIVE_SMS <br/>READ_SMS<br/> RECEIVE_WAP<br/>_PUSH RECEIVE_MMS |
STORAGE | READ_EXTERNAL_STORAGE<br/> WRITE_EXTERNAL_STORAGE |
危险权限基本都涉及到用户的隐私,Android系统将这些危险权限分为9组,
获取分组中某个权限的同时也就获取了同组中的其他权限
危险权限不仅需要在 AndroidManifest.xml中注册,还需要动态的申请权限
EasyPermisson 是Google对动态权限申请的封装,Google出品必属精品;
添加依赖
dependencies {
compile ''pub.devrel:easypermissions:0.2.1''
}
AndroidManifest添加权限
<manifest>
<uses-permission android:name="android.permission.CAMERA" />
</manifest>
添加实现(以相机权限为例子)
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{
private static final String TAG="tag";
private static final int CAMERA_PERM = 0x100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
grantCamera();
}
private void openCamera(){
}
@AfterPermissionGranted(CAMERA_PERM)
private void grantCamera() {
if (EasyPermissions.hasPermissions(MainActivity.this, Manifest.permission.CAMERA)) {
//有此权限
openCamera();
} else {//没有此权限,需要重新申请
EasyPermissions.requestPermissions(this, "请求camera权限", CAMERA_PERM, Manifest.permission.CAMERA);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
@Override
public void onPermissionsGranted(int requestCode, List<String> perms) {
Log.d(TAG,"success");
}
@Override
public void onPermissionsDenied(int requestCode, List<String> perms) {
if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
new AppSettingsDialog.Builder(this, "点击确定去设置界面设置权限")
.setTitle("Title")
.setPositiveButton("确定")
.setNegativeButton("取消", null /* click listener */)
.setRequestCode(requestCode)
.build()
.show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CAMERA_PERM) {//从设置权限界面返回
if (EasyPermissions.hasPermissions(MainActivity.this, Manifest.permission.CAMERA)){
}
}
}
}
@AfterPermissionGranted(CAMERA_PERM)注解是在用户同意授权后EasyPermissions再次回调注解的函数;AppSettingsDialog 是googgle封装的直接跳转到设置权限界面dialog;
特殊权限(Special Permissions)
Special Permissions |
---|
SYSTEM_ALERT_WINDOW 设置悬浮窗 |
WRITE_SETTINGS 修改系统设置 |
特殊权限比危险权限更危险,特殊权限需要在manifest中申请并且通过发送Intent让用户在设置界面进行勾选.
public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{
private static final int SYSTEM_ALERT_WINDOW_PERM = 0x101;
private static final int WRITE_SETTINGS_PERM = 0x102;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
grantAlertWindow();
grantWriteSettings();
}
private void grantAlertWindow(){
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, SYSTEM_ALERT_WINDOW_PERM);
}
private void grantWriteSettings(){
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, WRITE_SETTINGS_PERM );
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SYSTEM_ALERT_WINDOW_PERM) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if ( Settings.canDrawOverlays(this)){//get
}
}
}else if (requestCode == WRITE_SETTINGS_PERM) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.System.canWrite(this)) {//get
}
}
}
}
}
6.0动态加载权限用PermissionGen
ndroid 6.0 新增加了运行时的动态添加权限,在此介绍一个第三方库,PermissionGen,可以很方便简洁的增加 6.0权限
首先给大家上 PermissionGen 库地址:https://github.com/lovedise/PermissionGen
下面给大家详细介绍它的使用:
1.引用库:
在 app gradle 中引入:
compile ''com.lovedise:permissiongen:0.0.6''
在需要权限检测的地方 调用:
-
private void requestPhotoPermiss(){
-
PermissionGen.with(mContext)
-
.addRequestCode(PHOTO_PERMISS)
-
.permissions(
-
Manifest.permission.WRITE_EXTERNAL_STORAGE,
-
Manifest.permission.CAMERA)
-
.request();
-
}
其中 PermissionGen.with(mContext) 中的 mContext 可以是 Activity,也可以是 Fragment ,photo_permiss 这个常量是自己定义的,之后需要重写
onRequestPermissionsResult
方法,重写如下:
-
@Override
-
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
-
PermissionGen.onRequestPermissionsResult( this, requestCode, permissions, grantResults);
-
}
之后会异步返回两个方法,成功和失败,它们是用注解写的,方法里注解的requestCode 要和你之前定义的常量一致’,方法如下
-
@PermissionSuccess(requestCode = PHOTO_PERMISS)
-
public void requestPhotoSuccess(){
-
//成功之后的处理
-
//.......
-
}
-
-
@PermissionFail(requestCode = PHOTO_PERMISS)
-
public void requestPhotoFail(){
-
//失败之后的处理,我一般是跳到设置界面
-
AppUtil.goToSetting(mContext);
-
}
goToSetting(Context Context)方法代码如下:
-
/***
-
* 去设置界面
-
*/
-
public static void goToSetting(Context context){
-
//go to setting view
-
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
-
Uri uri = Uri.fromParts( "package", getPackageName(), null);
-
intent.setData(uri);
-
context.startActivity(intent);
-
}
注意,在引入 Gen的库的时候,可能会出现同步失败的问题,出现如下类似问题:
Error:(7, 9) Attribute application@icon value=(@mipmap/ic_launcher) from AndroidManifest.xml:7:9 Error:(7, 9) Execution failed for task '':importdemo:processDebugManifest''. > Manifest merger failed : Attribute application@icon value=(@mipmap/ic_launcher) from AndroidManifest.xml:7:9 is also present at com.pnikosis:materialish-progress:1.0:13:9 value=(@drawable/ic_launcher) Suggestion: add ''tools:replace="android:icon"'' to <application> element a
这是由于 库中引用的 value 和 你项目中 mainfast 中的 value 发生冲突,解决办法如下:
在你的 application 中加上 类似的 tools replace 代码,然后在 xml 文件头 添上 tools 的声明,rebuild 你的项目即可解决冲突
最后要说的是,其实最近网上用的比较 多的库 是 AndPermission 库,但是我当时在引用的时候发现 他的 success 和 failed 方法没有调用,由于时间紧急,便用了这个比较老的库,但是库虽老,用起来还是不错的,对于 AndPermission 库的使用大家若出现和我一样的问题,欢迎讨论,再此附上 AndPermission 库地址:
https://github.com/yanzhenjie/AndPermission
大家有什么交流的话,随时留言,谢谢诶
Android 6.0动态权限获取:一个EasyPermission的权限管理库
EasyPermission
README: 中文 | English
EasyPermission简介
这个是一个方便Android中权限管理的库,它使得申请权限和业务代码逻辑简单分离,不去关心权限的申请和回调。 源码地址:https://github.com/githubZYQ/easypermission
初衷
以前你是怎么管理Android的权限的?<br>
先判断有没有权限,再申请权限,最后onRequestPermissionsResult中检查一个个结果,再执行自己的业务逻辑?<br>
有一个打电话的权限,好多地方都要用,你每次使用打电话都要写一遍权限的判断申请和结果处理?<br>
那现在有一个好消息:<br>
这儿有一个方便Android中权限管理的库,你告诉它你需要的权限,然后再告诉它你想要执行什么,就可以了。
解释
1.module-easypermissionlib是EasyPermission 的核心源码code;<br>
2.module-app是EasyPermission的一个使用demo;<br>
集成方法
第一步. 添加JitPack 将其添加到根build.gradle中.
allprojects {
repositories {
...
maven { url ''https://jitpack.io'' }
}
}
第二步. 添加依赖
dependencies {
implementation ''com.github.githubZYQ:easypermission:v1.0.0''
}
第三步.调用 onRequestPermissionsResult()。 将要使用EasyPermission的Activity中的onRequestPermissionsResult,调用EasyPermissionHelper.getInstance().onRequestPermissionsResult即可;<br>
如果你有BaseActivity,那么只需要在BaseActivity中设置一次即可。
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//使用EasyPermissionHelper注入回调
EasyPermissionHelper.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults, this);
}
功能使用
接下来看下怎么使用。
1.检测权限
只需要调用EasyPermission的hasPermission方法,支持多个权限同时传入。
EasyPermission.build().hasPermission(this, Manifest.permission.CALL_PHONE);
2.申请权限
如果你在应用启动时需要申请权限,而且并不关注权限的结果,<br>
只需要调用EasyPermission的requestPermission方法,支持多个权限传入。<br>
EasyPermission.build().requestPermission(MainActivity.this, Manifest.permission.CALL_PHONE);
3.需要权限的结果
如果你需要知道申请权限后用户的选择结果,同时去执行自己的方法myVoid(),<br>
那么在onPermissionsAccess中去做就可以了,<br>
在onPermissionsDismiss是用户拒绝了权限的反馈。
EasyPermission.build()
.mRequestCode(RC_CODE_CALLPHONE)
.mContext(NeedReslutActivity.this)
.mPerms(Manifest.permission.CALL_PHONE)
.mResult(new EasyPermissionResult() {
@Override
public void onPermissionsAccess(int requestCode) {
super.onPermissionsAccess(requestCode);
//做你想做的
}
@Override
public void onPermissionsDismiss(int requestCode, @NonNull List<String> permissions) {
super.onPermissionsDismiss(requestCode, permissions);
//你的权限被用户拒绝了你怎么办
}
}).requestPermission();
4.有时用户拒绝了权限,而且禁止了弹出询问,我该怎么办?
同上,只要在onDismissAsk中,就可以得到被禁止的结果,同时你要注意onDismissAsk默认返回false,<br>
如果你自己修改return true,将视为已经处理了禁止结果,将不再回调onPermissionsDismiss这个方法,<br>
调用openAppDetails方法,可以弹窗引导用户去设置界面设置权限,在onActivityResult中检查结果。
EasyPermission easyPermission = EasyPermission.build()
.mRequestCode(RC_CODE_CALLPHONE)
.mContext(DismissAskActivity.this)
.mPerms(Manifest.permission.CALL_PHONE)
.mResult(new EasyPermissionResult() {
@Override
public void onPermissionsAccess(int requestCode) {
super.onPermissionsAccess(requestCode);
//做你想做的
}
@Override
public void onPermissionsDismiss(int requestCode, @NonNull List<String> permissions) {
super.onPermissionsDismiss(requestCode, permissions);
//你的权限被用户拒绝了你怎么办
}
@Override
public boolean onDismissAsk(int requestCode, @NonNull List<String> permissions) {
//你的权限被用户禁止了并且不能请求了你怎么办
easyPermission.openAppDetails(DismissAskActivity.this, "Call Phone - Give me the permission to dial the number for you");
return true;
}
});
easyPermission.requestPermission();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (EasyPermission.APP_SETTINGS_RC == requestCode) {
//设置界面返回
//Result from system setting
if (easyPermission.hasPermission(DismissAskActivity.this)) {
//做你想做的
} else {
//从设置回来还是没给你权限
}
}
}
拓展
仔细看了Android的权限使用过程,其实内心觉得,关于需要申请的权限的地方,都是使用的系统的API,<br>
那么Android系统为何不能在APP使用某项权限时自己拦截咨询用户,<br>
用户允许了就继续执行,不允许给开发者一个反馈,这样岂不是好? 我真心觉得权限管理、申请、判断都应该是系统完成的,让开发者去注册声明需要哪些权限可以理解,<br>
但是动态的每次使用都要去判断、申请、回调等等真的对开发者不友好,希望后续系统能有所改进,<br>
如果有能直接反馈给Google的Android团队的,希望将此声音带过去。<br>
如果你有更好的方案,比如HOOK技术跳过系统的权限检测等等,欢迎评论交流。
最后
祝所有人平安幸福、家庭和睦、身体健康。<br>
愿世界和平,不再被战争所累。<br>
有任何疑问,可以及时反馈给我;<br>
如果你觉得还不错,请点赞o( ̄▽ ̄)d。
Android EasyPermissions官方库高效处理权限相关教程
介绍:
easypermission库是一个简化基本的系统权限逻辑的库,可用于在Android M或者更高版本上。
1 相关文档
官方文档:
https://github.com/googlesamples/easypermissions
运行时权限官方文档解释:
https://developer.android.com/training/permissions/requesting.html
2 为什么使用Easypermissions
Android M对权限系统进行了改变。Android M之前所需权限只需要在AndroidManifest中申请即可。但更新Android M系统后,部分“Dangerous Permission”需要在运行时询问申请。
导入EasyPermissions依赖库:
在Module的build.gradle中添加以下代码。
dependencies { compile 'pub.devrel:easypermissions:1.0.1' }
依赖库配置完成后,开始使用。
使用步骤
1. 使用EasyPermissions检查权限:
权限可以是单个,也可以是一些列。在EasyPermission库中,使用EasyPermissions#hasPermissions(...)检查若干权限。
<code> /** * * @param context * return true:已经获取权限 * return false: 未获取权限,主动请求权限 */ public static boolean checkPermission(Activity context,String[] perms) { return EasyPermissions.hasPermissions(context,perms); }</code> EasyPermissions.hasPermissions():
第一个参数 : Context参数.例如,Activity对象。
第二个参数 : 一些系列的权限。例如,public final static String[] PERMS_WRITE ={Manifest.permission.WRITE_EXTERNAL_STORAGE};
2. 使用EasyPermissions请求权限:
检查后,发觉用户没有赋予权限,这时候需要代码请求权限,让用户同意。
在EasyPermission库中,使用EasyPermissions#requestPermissions,来请求权限。
<code><code><code> /** * 请求权限 * @param context */ public static void requestPermission(Activity context,String tip,int requestCode,String[] perms) { EasyPermissions.requestPermissions(context,tip,requestCode,perms); }</code></code></code> EasyPermissions.requestPermissions():
第一个参数:Context对象 第二个参数:权限弹窗上的文字提示语。告诉用户,这个权限用途。 第三个参数:这次请求权限的唯一标示,code。 第四个参数 : 一些系列的权限。
3. EasyPermissions响应请求结果:
请求后,弹出系统权限弹窗,剩下是用户是否授权操作。权限结果是回调在Activity或者Fragment中的重写的onRequestPermissionsResult()方法中。
<code><code><code>public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{ //.....省略部分代码。 /** * 重写onRequestPermissionsResult,用于接受请求结果 * * @param requestCode * @param permissions * @param grantResults */ @Override public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode,permissions,grantResults); //将请求结果传递EasyPermission库处理 EasyPermissions.onRequestPermissionsResult(requestCode,grantResults,this); } /** * 请求权限成功。 * 可以弹窗显示结果,也可执行具体需要的逻辑操作 * * @param requestCode * @param perms */ @Override public void onPermissionsGranted(int requestCode,List<string> perms) { ToastUtils.showToast(getApplicationContext(),"用户授权成功"); } /** * 请求权限失败 * * @param requestCode * @param perms */ @Override public void onPermissionsDenied(int requestCode,"用户授权失败"); /** * 若是在权限弹窗中,用户勾选了'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限。 * 这时候,需要跳转到设置界面去,让用户手动开启。 */ if (EasyPermissions.somePermissionPermanentlyDenied(this,perms)) { new AppSettingsDialog.Builder(this).build().show(); } } }</string></string></code></code></code>
将权限结果传递给EasyPermissions.onRequestPermissionsResult()来处理。、
EasyPermissions.onRequestPermissionsResult()方法:
第一个参数: 请求的code 第二个参数: 一些列的请求权限 第三个参数: 用户授权的结果 第四个参数: 权限回调监听器
这里不需要手写判断权限是否成功的逻辑操作,而会在EasyPermissions.PermissionCallbacks监听器中响应。
EasyPermissions.PermissionCallbacks接口:
onPermissionsGranted():
用户授权成功,接下来执行具体需要的逻辑操作
onPermissionsDenied():
用户授权失败,处理失败的逻辑。
注意:若是在权限弹窗中,用户勾选了'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限。 这时候,需要跳转到设置界面去,让用户手动开启。
你可能并不满足,需要手动调用逻辑处理方法。EasyPermissions库为你考虑好了,具备强大之处。当用户同意权限后,可以不需要通过监听器方式来实现,直接调用相关的逻辑代码的方法。只需要使用@AfterPermissionGranted注解标注逻辑处理的方法。
4. @AfterPermissionGranted注解:
@AfterPermissionGranted注解为了提供方便,但可以添加也可以不添加,是可选的。
好处:
使用了该注解,当权限请求被用户同意后,会根据请求code来执行,相应的含有@AfterPermissionGranted注解的方法。
简化了请求成功操作流程,不需要在EasyPermissions.onRequestPermissionsResult()的回调监听器中请求成功的方法中,再次手动调用,获取权限后需要操作的逻辑代码。
以下代码,请求写入磁盘的权限,当用户同意权限后,弹出一个Toast弹窗的逻辑处理操作。
<code><code><code><code><code><code><code><code> @AfterPermissionGranted(Constance.WRITE_PERMISSION_CODE) 是可选的 public void onPermissionsSuccess() { ToastUtils.showToast(getApplicationContext(),"用户授权成功"); }</code></code></code></code></code></code></code></code>
当用户同意权限,该方法不需要手动调用,会匹配到的Constance.WRITE_PERMISSION_CODE请求码,自动执行。
5. 使用EasyPermissions处理权限被拒的情况:
在权限弹窗中,用户可能直接拒绝权限,下次权限请求依旧会弹出该权限弹窗。除此之外,还可以勾选'NEVER ASK AGAIN.'或者'不在提示',且拒绝权限,下次请求权限,弹窗不能弹出,无法让用户授权。这时候,需要跳转到设置界面去,让用户手动开启。
在EasyPermission库中,使用EasyPermissions.somePermissionPermanentlyDenied()来处理,是否勾选不再提示的选项。
<code><code><code><code><code><code><code><code><code> /** * 请求权限失败 * * @param requestCode * @param perms */ @Override public void onPermissionsDenied(int requestCode,perms)) { new AppSettingsDialog.Builder(this).build().show(); } } @Override protected void onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); switch (requestCode) { //当从软件设置界面,返回当前程序时候 case AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE: //执行Toast显示或者其他逻辑处理操作 break; } }</string></code></code></code></code></code></code></code></code></code>
以上代码是,当无法弹出权限弹框,直接跳转到设置界面去,让用户手动开启权限。
当从设置界面返回时候,结果会在Activity或者Fragment中onActivityResult()响应。
运行效果,如下:
总结
以上所述是小编给大家介绍的Android EasyPermissions官方库高效处理权限相关教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!
Android EasyPermissions拍照权限管理申请
1、在build.gradle中添加如下
//权限 implementation('pub.devrel:easypermissions:2.0.1') { exclude group: 'com.android.support' }
2、在activity中使用 public void showCamera(int num) { String[] permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (!EasyPermissions.hasPermissions(context, permissions)) { //弹出一个对话框进行提示用户 PermissionUtils.requestPermissions(context, 100, permissions, null); }else { openCamera(num); } } //判断权限的结果码 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == 100) { //如果已经允许该权限 if(grantResults[0] == PackageManager.PERMISSION_GRANTED) { openCamera(selectId); }else { //否则,提示该权限已经被禁止 ToastUtil.shortshow(context,"未授予拍照权限"); } return; } }
关于EasyPermisson 动态权限使用例子和动态权限设置的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于6.0动态加载权限用PermissionGen、Android 6.0动态权限获取:一个EasyPermission的权限管理库、Android EasyPermissions官方库高效处理权限相关教程、Android EasyPermissions拍照权限管理申请等相关知识的信息别忘了在本站进行查找喔。
本文标签: