yanzhenjie / andpermission Goto Github PK
View Code? Open in Web Editor NEW:strawberry: Permissions manager for Android platform.
Home Page: https://yanzhenjie.com/AndPermission
License: Apache License 2.0
:strawberry: Permissions manager for Android platform.
Home Page: https://yanzhenjie.com/AndPermission
License: Apache License 2.0
最近在学习运行时权限,遇到个问题,我在设置中禁止了相机权限,进入应用获取拍照权限,按理说应该获取权限失败,但是系统显示相机权限授权成功,进入相机后因没有获取成功权限,导致相机界面异常。
如何解决?试了小米 华为 都没有问题,魅族出现了这个奇葩问题
当把权限设置成不再提醒时,在设置里面打开,但Debug版可以回调,但正式版没有回调,其中grantResults的值可以得到 为0
targetApi < 23, 在手机权限管理中关闭应用权限,就真的拿不到权限了
Error:(13, 13) Failed to resolve: com.android.support:support-v4:24.2.1
Install Repository and sync project
Show in File
Show in Project Structure dialog
下载这个v4库本地需要一个小时(已经在google 下载中加入的腾讯镜像,显示的每秒十几k,太慢了)
经过反复测试得出如下结论
targetSdkVersion <23 时
一般厂商应用不申请 运行时权限可以正常使用
红米Node3
SD卡的读写权限不会提示用户拒绝或接受
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
ActivityCompat.checkSelfPermission(activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE) ;
永远等于 PackageManager.PERMISSION_GRANTED
因此会造成检测有权限却无法使用的情况
我一次性调用多个权限
`AndPermission.with(this)
.requestCode(100)
.permission(Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.CAMERA)
.rationale((requestCode, rationale) ->
// 此对话框可以自定义,调用rationale.resume()就可以继续申请。
AndPermission.rationaleDialog(SplashActivity.this, rationale).show()
)
.send();
@OverRide
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
@PermissionYes(100)
private void getLocationYes(List<String> grantedPermissions) {
checkAccountLogin();
}
// 失败回调的方法,用注解即可,里面的数字是请求时的requestCode。
@PermissionNo(100)
private void getLocationNo(List<String> deniedPermissions) {
// 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
// 第一种:用默认的提示语。
AndPermission.defaultSettingDialog(this, 300).show();
}
}`
拒绝了其中某个权限,没有显示AndPermission.rationaleDialog,退出后重新进入有显示。
如题
多个权限授权成功之后,然后手动的去关闭所申请的权限,下次进入app不会再次询问,而是默认拥有该权限@PermissionYes方法会回调,不是说有一个权限不成功就不走此方法么
System.err: java.lang.reflect.InvocationTargetException
System.err: at java.lang.reflect.Method.invoke(Native Method)
System.err: at com.yanzhenjie.permission.AndPermission.callbackAnnotation(AndPermission.java:344)
System.err: at com.yanzhenjie.permission.AndPermission.onRequestPermissionsResult(AndPermission.java:284)
最后问题定位到
AndPermission.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
我想知道这几种机型有什么区别呢 小米、华为、Oppo、魅族、Moto,以及Nexus、三星
厂商还修改了权限的实现?
使用Fragment嵌套Fragment,进行权限申请,由于无法回调onRequestPermissionsResult()导致不能正确回调权限申请结果。这个有办法解决吗
在申请多条权限的情况下。如果用户有拒绝有同意应该把同意和拒绝的数据分别回传。更方便做提示处理
jackOptions {
enabled true
}
与 butterknife 框架冲突了,
我想问一下在android.support.v4.app.Fragment
怎样使用?能不能写个例子?我用了报这个错误:
E/AndPermission: Not found the callback method, do you forget @PermissionYes or @permissionNo for callback method ? Or you can use PermissionListener.
AndPermission.defaultSettingDialog(this, PERMISSION_READ_PHONE_TYPE).show();
在第一次申请定位权限时,我拒绝了定位权限,然后我去设置里手动开启定位权限,开启app也显示定位权限已经获得,但事实上是没办法定位。然后我在去手动关闭定位权限,重新开启app,可以跳出申请权限的对话框,这样就可以获得定位权限。
什么情况下会这样啊... 不管有没有拿到权限都不会走rationale,直接走成功回调了
如题
这个权限虽然不是危险权限,但是6.0之后默认关闭了
最后一个else if分支少了一个return呀。
class PermissionUtils {
static Context getContext(Object o) {
if (o instanceof Activity)
return (Activity) o;
else if (o instanceof Fragment)
return ((Fragment) o).getActivity();
else if (o instanceof android.app.Fragment)
((android.app.Fragment) o).getActivity();
throw new IllegalArgumentException("The " + o.getClass().getName() + " is not support.");
}
使用群主的下载管理 第一次安装在下载管理里面直接显示下载出错 并且报错权限不全 所以我就用了大神你的权限管理 可以弹出权限申请框 并且我也允许了 但是会显示权限申请失败 但是下载管理里面下载就可以成功了 所以我想问下 到底权限申请成功了没有 很疑惑
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.yanzhenjie.alertdialog.AlertDialog"
jar包中没有包含AlertDialog相关的代码?
当用户第一次就点拒绝授权的时候,当再次点需要获取权限的按钮时,提示无法获取权限,无法调起需要获取权限的Dilaog了
AndPermission.hasPermission()对android.permission.MANAGE_DOCUMENTS权限判断,开启无效。
调用:
AndPermission.with(this) .requestCode(PermissionsUtils.CAMERA_CODE) .permission(Manifest.permission.CAMERA) .callback(this) .rationale(rationaleListener) .start();
自定义dialog:
`private RationaleListener rationaleListener = new RationaleListener() {
@OverRide
public void showRequestPermissionRationale(int requestCode, final Rationale rationale) {
// 这里的对话框可以自定义,只要调用rationale.resume()就可以继续申请。
mSelectDialog = new SelectDialog.Builder(HomeChildMoreActivity.this)
.setMessage("友情提示")
.setTitle("你已拒绝过定位权限,沒有定位定位权限无法为你推荐附近的妹子,你看着办!")
.setTitleColor(getResources().getColor(R.color.theme))
.setNegativeButton(getString(R.string.permission_button_item_refuse), new SelectDialog.OnNegativeClickListener() {
@OverRide
public void onClick(SelectDialog dialog, Button button) {
dialog.dismiss();
rationale.cancel();
}
})
.setPositiveButton(getString(R.string.permission_button_item_agree), new SelectDialog.OnPositiveClickListener() {
@OverRide
public void onClick(SelectDialog dialog, Button button) {
dialog.dismiss();
rationale.resume();
}
})
.build();
mSelectDialog.show();
}
};`
1.第一次点击后,弹出系统权限弹窗dialog,然后勾选、拒绝,第二次进来显示这个弹窗 (正常)
2.打开手机权限管理设置所有权限为:“提示”,再次点击,为什莫还是弹出这个弹窗,不应该是系统的权限弹窗dialog吗?hasAlwaysDeniedPermission(。。。)
我用1.0.5版本编译时没问题的 但是使用1.0.7的时候 编译出现这个错误
Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed : Attribute meta-data#android.support.VERSION@value value=(25.3.1) from [com.android.support:appcompat-v7:25.3.1] AndroidManifest.xml:27:9-31 is also present at [com.android.support:cardview-v7:26.0.0-alpha1] AndroidManifest.xml:24:9-38 value=(26.0.0-alpha1). Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:25:5-27:34 to override.
我的gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '23.0.3'
defaultConfig {
applicationId "com.remoteyourcam.usb"
minSdkVersion 14
targetSdkVersion 24
}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
buildTypes {
release {
minifyEnabled false//不混淆 目前混淆编译之后会出问题
proguardFiles 'proguard.cfg'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
dependencies {
compile files('libs/acra-4.2.3-sources.jar')
compile files('libs/acra-4.2.3.jar')
compile 'com.zhy:okhttputils:2.6.2'
compile 'com.tencent.bugly:crashreport:latest.release'
compile files('libs/jackson-databind-2.6.0-rc4.jar')
compile files('libs/jackson-core-2.6.0-rc4.jar')
compile files('libs/jackson-annotations-2.6.0-rc4.jar')
compile 'com.zhy:autolayout:1.4.5'
compile files('libs/universal-image-loader-1.9.5.jar')
compile 'com.yanzhenjie:permission:1.0.5'
compile 'com.android.support:cardview-v7:26.0.0-alpha1'
compile 'com.umeng.analytics:analytics:latest.integration'
}
小弟菜鸟 还请严大看看 什么情况 感谢!
1.魅族MX6 andorid6.0版本,测试失败,直接下载严神demo,在我的手机上无法弹出对话框,而是直接弹出toast,说权限申请成功,但是其实没有成功,我去设置中心查看权限,(允许,询问,拒绝),显示的是---询问.
2.oppo R8207 android4.4.4 前两种点击效果和魅族MX6一样,只弹toast说成功,但是实际上并没有成功, 选择第三种listener方式时发现永远都是权限申请失败的弹框.
希望大神可以跟踪一下,或者加我qq我提供机器测试:1179917630
Failed resolution of: Lcom/yanzhenjie/alertdialog/AlertDialog;
和其它的权限申请库一样,我在小米6.0和一加7.1上测试了此库和easyPermission和RxPermission,在小米的6.0设备上三个库均无法获取定位权限(ACCESS_FINE_LOCATION),一加7.1的设备没有问题,建议修改一下README,以免对其他人产生误解。
首先感谢严老大的AndPermission,我们在新版本"地铁通-MetroMan"中使用了它,非常简易的解决了权限问题。
http://android.myapp.com/myapp/detail.htm?apkName=com.xinlukou.metroman
然后提一个Bug:
我们在使用小米手机测试时,android6.0.1系统,没有弹出预计的权限请求对话框,而是直接由小米弹出了整体App的权限请求框,不知道是米UI的特殊定制,还是Bug
03-07 08:33:12.666 29428-29428/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: www.diandou, PID: 29428
java.lang.RuntimeException: Unable to start activity ComponentInfo{www.diandou/www.diandou.activity.SplashActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'yanzhenjie.permission.e yanzhenjie.permission.e.a(int)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2661)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2722)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6114)
at java.lang.reflect.Method.invoke(Native Method)
at android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
at android.internal.os.ZygoteInit.main(ZygoteInit.java:764)
Caused by: java.lang.NullPo
java.lang.RuntimeException:Unable to start activity ComponentInfo{cn.xm.xmvideoplayer/com.xm.xmvideo.ui.activity.HomeActivity}: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=android.content.pm.action.REQUEST_PERMISSIONS pkg=com.lbe.security.miui (has extras) }
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2473)
android.content.ActivityNotFoundException:No Activity found to handle Intent { act=android.content.pm.action.REQUEST_PERMISSIONS pkg=com.lbe.security.miui (has extras) }
android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1805)
android.app.Instrumentation.execStartActivity(Instrumentation.java:1634)
android.app.Activity.startActivityForResult(Activity.java:4622)
android.app.Activity.requestPermissions(Activity.java:3888)
android.support.v4.app.ActivityCompatApi23.requestPermissions(ActivityCompatApi23.java:45)
android.support.v4.app.ActivityCompat.requestPermissions(ActivityCompat.java:372)
com.yanzhenjie.permission.DefaultPermission.void requestPermissions(java.lang.Object,int,java.lang.String[])(DefaultPermission.java:140)
com.yanzhenjie.permission.DefaultPermission.java.lang.String[] access$000(com.yanzhenjie.permission.DefaultPermission)(DefaultPermission.java:33)
##_parent_##2##_parent_##
##_child_## void access$300(java.lang.Object,int,java.lang.String[],int[])##_child_##
##_child_## void access$500(java.lang.Object,int,java.lang.String[])##_child_##
com.yanzhenjie.permission.DefaultPermission$1.void resume()(DefaultPermission.java:88)
com.yanzhenjie.permission.DefaultPermission.void send()(DefaultPermission.java:115)
com.xm.xmvideo.ui.activity.HomeActivity.void check()(HomeActivity.java:104)
com.xm.xmvideo.ui.activity.HomeActivity.void initViews(android.os.Bundle)(HomeActivity.java:92)
com.ximencx.comment_lib.Base.BaseCompatActivity.void onCreate(android.os.Bundle)(BaseCompatActivity.java:43)
android.app.Activity.performCreate(Activity.java:6321)
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2535)
android.app.ActivityThread.access$1100(ActivityThread.java:154)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1394)
android.os.Handler.dispatchMessage(Handler.java:102)
android.os.Looper.loop(Looper.java:148)
android.app.ActivityThread.main(ActivityThread.java:5561)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
de.robv.android.xposed.XposedBridge.main(XposedBridge.java:153)
如果没有在AndroidManifest中配置就会跳出弹窗,要求去Setting中去设置,但是设置之后回来还是弹出窗口让去设置。。如果在AndroidManifest配置过了,那就如题,一直为true。不走其他逻辑,是手机问题还是我用法有问题?
手机是oppo R9s
好像只支持android.support.app.Fragment,不科学呀。
小米Note手机弹出权限申请框,无论点同意还是拒绝,都是回调成功获取权限,onFailed不会回调。
这只是判断mainfest中是否配置了该权限 开发人员一定会配置的 因此本人认为这段代码逻辑可以修改下
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
Context context = PermissionUtils.getContext(object);
final int[] grantResults = new int[permissions.length];
PackageManager packageManager = context.getPackageManager();
String packageName = context.getPackageName();
final int permissionCount = permissions.length;
for (int i = 0; i < permissionCount; i++) {
grantResults[i] = packageManager.checkPermission(permissions[i], packageName);
}
onRequestPermissionsResult(object, requestCode, permissions, grantResults);
}
我的mx6,不管什么权限,都不会弹窗,直接就能获得权限,求解决啊
作者您好,我的vivo手机在测试的时候直接进入权限申请成功或者失败的回调,没有弹出对话框让用户选择,请问一下这是什么问题呢?
这种类型的权限有办法知道有没有打开么?好像授权是没有方式的,只有设置界面小米,华为直接不能设置
v4.Fragment中无法监听到PermissionListener回调信息,允许权限后,没有进入onSucceed或onFailed方法。
获取相机权限
用的是注解回调
点击不在提醒并且拒绝,
多次点击后,
会调用成功的方法
android.support.v4.app.Fragment的子类中测试相机授权,可授权成功,但无法进行回调,提示以下内容:
E/AndPermission: Not found the callback method, do you forget @PermissionYes or @permissionNo for callback method ? Or you can use PermissionListener.
Fragment中代码如下:
发送授权:
private void sendCameraPermission(){
if(PermissionUtil.hasCameraPermission(getContext())){
startScanFragment();
}else{
PermissionUtil.sendCameraPermission(this);
}
}
// =======================================================
// 权限处理方法 =============================================
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
PermissionUtil.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
}
/**
* 相机权限被授权时处理
*/
@PermissionYes(PermissionUtil.PERMISSION_CAMERA_CODE)
public void whenGrantedCameraPermission(List<String> grantedPermissions){
startScanFragment();
}
/**
* 相机权限被拒绝时处理
*/
@PermissionNo(PermissionUtil.PERMISSION_CAMERA_CODE)
public void whenDeniedCameraPermission(List<String> deniedPermissions){
// 用户否勾选了不再提示并且拒绝了权限,那么提示用户到设置中授权。
if (AndPermission.hasAlwaysDeniedPermission(this, deniedPermissions)) {
AndPermission.defaultSettingDialog(this, PermissionUtil.PERMISSION_CAMERA_CODE)
.setTitle("缺少权限")
.setMessage("我们需要权限调用摄像头进行二维码扫描哦!")
.setPositiveButton("去设置")
.setNegativeButton("拒绝", null)
.show();
}
}
封装的调用方法与文档的一致
// 发送权限申请
AndPermission.with(fragment)
.requestCode(requestCode)
.permission(permissions)
.send();
// 结果回调
AndPermission.onRequestPermissionsResult(fragment, requestCode, permissions, grantResults);
请问了解这大概是什么原因造成的呢?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.