在 FragmentActivity 中永远不会调用 onRequestPermissionsResult()
Posted
技术标签:
【中文标题】在 FragmentActivity 中永远不会调用 onRequestPermissionsResult()【英文标题】:onRequestPermissionsResult() is never called in FragmentActivity 【发布时间】:2017-01-12 04:27:30 【问题描述】:我正在尝试实现运行时权限,但是当FragmentActivity
收到onRequestPermissionResult()
时出现了一些问题。 checkPermissions()
方法工作得很好,但在用户允许或拒绝权限后永远不会调用 onRequestPermissionResult()
。
当系统对话框显示请求权限时,MyActivity.onDestroy()
永远不会被调用。和这个问题有关吗?
我已经尝试关注 this one 和 another one ,但我想我错过了一些东西。
我的设备是 Nexus 5X (android 6.0),目标 SDK 版本是 23。
最低支持 SDK 版本为 15。
当然,我在AndroidManifest.xml
中写了所需的权限,并在 build.gradle 中添加了 v23 支持库。
这是我的代码:
public class MyActivity extends FragmentActivity
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
checkPermissions();
private void checkPermissions()
String[] dangerousPermissions =
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.GET_ACCOUNTS,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.RECORD_AUDIO
;
for(String permission : dangerousPermissions)
if (!hasPermission(permission))
Log.e("permission.debug", "need to grant " + permission);
ActivityCompat.requestPermissions(this, dangerousPermissions, 4);
public boolean hasPermission(String permission)
return ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
Log.d("permission.debug", " request code " + requestCode);
for (int i = 0; i < permissions.length; i++)
if (grantResults[i] == 0 && Manifest.permission.READ_PHONE_STATE.equals(permissions[i]))
initiate();
这是我的代码的日志:
E/permission.debug: need to grant android.permission.READ_PHONE_STATE
E/permission.debug: need to grant android.permission.GET_ACCOUNTS
E/permission.debug: need to grant android.permission.WRITE_EXTERNAL_STORAGE
E/permission.debug: need to grant android.permission.RECORD_AUDIO
谢谢。
【问题讨论】:
你能分享你的logcat吗? 我试图为这段代码获取一些日志,没有错误或警告。这很奇怪。 你可以在这个link找到答案 【参考方案1】:尝试直接调用 requestPermissions 而不是 ActivityCompat.requestPermissions。如下所示
if (checkNeededPermissions.size() > 0)
Log.d(TAG, "Checking permissions");
requestPermissions(this, dangerousPermissions, 4);
编辑
我没有看到您在哪里定义了列表 checkNeededPermissions。可以请你在里面像上面那样写一个日志
【讨论】:
不幸的是,minSdkVersion 是15
。所以我必须使用ActivityCompat.requestPermissions().
@EugeneKim 您使用 FragmentActivity 的任何原因?
@EugeneKim 我已经编辑了上面的答案,请检查并尝试一次。并分享你的 logcat
对不起,我省略了代码的细节。我编辑了我的问题并附加了日志以检查权限。 @gaurav4sarma
@EugeneKim 运行时权限仅适用于 sdK 23 那么你为什么要为你的 minSdkVersion 15 烦恼呢?【参考方案2】:
我刚刚找到solution。
当您在AndroidManifest.xml
中使用noHistory
属性声明一个活动时,当活动从屏幕上消失时,它将删除您的活动任务。
要接收onRequestPermissionResult()
回调,必须保证Activity恢复。
【讨论】:
【参考方案3】:有同样的问题。通过在调用ActivityCompat.requestPermissions
【讨论】:
以上是关于在 FragmentActivity 中永远不会调用 onRequestPermissionsResult()的主要内容,如果未能解决你的问题,请参考以下文章
实时更新你永远都不会想到上了考场会犯什么样的**错误——汇总
控制台应用程序中 Observable 的 LastAsync() 死锁