一开始,我写的是,点击弹出需要的权限,允许后还需要再次点击才会执行我想要的操作,测试为此提出优化,应该是“权限获得后”就会继续前面的操作,而不是用户再操作一次,以此记录一下。
怎么知道我们是允许、还是拒绝权限呢?这时候就需要onRequestPermissionsResult或onActivityResult方法。
坑:在fragment里面获取权限,不会执行fragment里onRequestPermissionsResult
解决:在fragment的主activity里面添加如下代码:
// Fragment里申请权限不回调onRequestPermissionsResult
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// 获取到Activity下的Fragment
List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments == null) {
return;
// 查找在Fragment中onRequestPermissionsResult方法并调用
for (Fragment fragment : fragments) {
if (fragment != null) {
// 这里就会调用我们Fragment中的onRequestPermissionsResult方法
fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
1.在activity/fragment里面获取权限后,自动继续之前的权限,eg:相机权限
//点击按钮时判断是否有相机权限,没有就申请(允许后执行ZM()不需要再次点击)
if (Build.VERSION.SDK_INT >= 23) {//低于23也需要判断相机是否开启,先动态申请
int checkPermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA);
if (checkPermission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, 22);//打开相机权限,requestCode=22,后面用到
} else {
ZM();//有相机权限时,执行ZM方法
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case 22://对应前面的22
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//会报数组越界,要判断好grantResults[]
ZM();//有相机权限时,执行ZM方法
} else {
//没有允许
break;
2. 获取GPS、蓝牙时用到的是onActivityResult
坑:在fragment里面获取,onActivityResult需要写在主activity里面
2.1 没有权限时,申请打开GPS/蓝牙
//获取GPS
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
activity.startActivityForResult(intent, 2020);
//获取蓝牙
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startActivityForResult(intent, 2022);
2.2 onActivityResult必须是在activity里面,如是fragment里面需要打开GPS/蓝牙,那么可以在“成功”里面写个LiveDataBus,fragment接收后继续操作
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2020 || requestCode == 2022) {
if (resultCode == RESULT_OK) {//RESULT_OK 成功,RESULT_CANCELED 取消,
//允许之后的操作,
String[] permissions = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
// 声明一个集合,在后面的代码中用来存储用户拒...
上一篇Android 动态获取权限中,在申请权限的时候需要onRequestPermissionsResult方法来判断时候开启权限,但是在Fragment使用过程中,需要获取摄像机权限出现这个方法不起作用的问题,找到两个解决方案。
一、宿主activity需要重写
在宿主activity中,一定要重写onRequestPermissionsResult并且带上下面这句话,不然fragment不回调onRequestPermissionsResult。
// Activity中
@Override
动态权限申请:
Google在 Android 6.0 开始引入了权限申请机制,将所有权限分成了正常权限和危险权限。应用的相关功能每次在使用危险权限时需要动态的申请并得到用户的授权才能使用。
正常权限:不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
危险权限:会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如...
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; private void insertDummyContactWrapper() {
List<String> permissionsNeeded = new ArrayList<String>(); final List<String>
如果应用具有此权限,方法将返回PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。
如果应用不具有此权限,方法将返回PERMISSION_DENIED,且应用必须明确向用户要求权限。
今天写二维码的功能,涉及到摄像权限的动态申请。于是用到了easypermision
但是用到的是Fragment,发现onPermissionsGranted没有响应。问过同事后发现,他们用Activity时没有问题。onPermissionsGranted正常响应。
后来问了权限,逐句Log后发现了 问题所在。
@Override
public void onReques...
private void startFolderActivity(int pos) {
index = pos;
if (SplashActivity.checkPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) &&
SplashActiv
问题根因在于,我们调用的是,而点进去看一下这个方法的源码大家知道原因了吧,所以回调会直接到activity的onRequestPermissionsResult方法中。既然知道了原因,那么解决方法就对应的有两个。
我正在更新我们的应用程序以使用新的M权限系统。除了onRequestPermissionsResult()之外,其他所有功能都可以使用。我需要检查按下按钮的权限,如果成功,则发送短信。当我授予执行权限时,对话框关闭,但是直到再次按下按钮时,它才触发“发送文本”。我已经在onRequestPermissionsResult()方法中调试并设置了断点,但是它从来没有涉及到它。首先调用此方法:priva...
以上是演示请求一个相机权限的过程:
首次申请(顶部提醒)-拒绝-再次申请(顶部提醒)-再次拒绝(并勾选禁止再次询问)-再次申请(中部弹窗引导)-在设置页不授权-返回-再次申请(中部弹窗引导)-在设置页将相机权限设为允许-返回app
在此过程中,任意一次拒绝和允许,都可以及时的拿到允许/拒绝的结果,进而在页面展示授权状态或者执行自己授权后的逻辑。以上的这些所有逻辑,只需要一句代码就能搞定,你相信吗?
是的,EasyPermission她来了,在项目中集成之后,安卓权限的检查、申请、提示、
我正在更新我们的应用程序以使用新的M权限系统.除了onRequestPermissionsResult()之外,它都在工作.我需要在按下按钮时检查权限,如果成功,则发送短信.当我授予这样做的权限时,对话框会关闭,但在我再次按下按钮之前它不会触发发送文本.我已经在onRequestPermissionsResult()方法中调试并设置了断点,但它从未进入过它.首先调用此方法:private void...
我正在尝试在启动相机活动之前获得用户的相机许可.用户在权限对话框中按“允许”后,onRequestPermissionsResult永远不会被回调.这是我的Activity类:public class ImageCaptureActivity extends AppCompatActivity {public static final String TAG = ImageCaptureActivi...
相信每一个做Android的程序猿都没少重写Activity的onActivityResult和onPermissionResult方法,随之而来的各种框架也是层出不穷。其中,我觉得这种使用Fragment来实现的方法是最好的。所以我思路也是这种,但是特点就是充分使用了Kotlin的各种特性,使逻辑清晰、层次分明,代...
如果应用具有此权限,方法将返回PackageManager.PERMISSION_GRANTED,并且应用可以继续操作。
如果应用不具有此权限,方法将返回PERMISSION_DENIED,且应用必须明确向用户要求权...