onRequestPermissionsResult在片段和活动中定义时,不在片段中调用

我有一个使用recyclerview适配器在回收站查看和设置数据的片段。

现在,我有一个button在适配器的列表项中点击我需要检查android中的新权限模型在android中的READ_EXTERNAL_STORAGE权限。

我在这个适配器的片段中创build了一个新的函数来检查权限是否被授予,如果没有授予权限请求权限。

我已经通过MyFragment.this作为适配器中的参数并调用适配器中的button单击片段的方法。

我用下面的代码来调用fragment中的requestPermission。

if(ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)){ requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, ConstantVariables.READ_EXTERNAL_STORAGE); } 

我通过使用下面的代码覆盖片段中的onRequestPermissionsResult方法:

 @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case ConstantVariables.READ_EXTERNAL_STORAGE: // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, proceed to the normal flow. startImageUploading(); } else {} 

但它并没有被调用,而是调用了onRequestPermissionsResult方法。

我也已经在片段的父活动中定义了相同的onRequestPermissionsResult方法,并且正在调用。

我无法删除活动的onRequestPermissionsResult方法,但想在请求来自fragment的许可时调用fragment的onRequestPermissionsResult方法。 我怎样才能做到这一点? 我在这里做错了什么,如果有人有想法,请帮助我。

Solutions Collecting From Web of "onRequestPermissionsResult在片段和活动中定义时,不在片段中调用"

编辑的答案涵盖更广泛的问题

我认为你混淆了片段和活动的方法。 我的项目上个月有类似的问题。 请检查你是否终于有以下几点:

  1. 在AppCompatActivity中,使用ActivityCompat.requestpermissions方法
  2. 在v4支持片段中,您应该使用请求权限
  3. Catch是如果你在你的片段中调用AppcompatActivity.requestpermissions,那么callback将来到活动,而不是片段
  4. 确保从activity的onRequestPermissionsResult调用super.onRequestPermissionsResult

看看是否有帮助。

 private void showContacts() { if (getActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSIONS_REQUEST_READ_STORAGE); } else { doShowContacts(); } 

}

  @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == PERMISSIONS_REQUEST_READ_STORAGE && grantResults[0] == PackageManager.PERMISSION_GRANTED) { doShowContacts(); } 

}

更改权限

这个问题实际上是由NestedFragments引起的。 基本上我们大部分的片段都扩展了一个HostedFragment,它继而扩展了一个CompatFragment。 拥有这些嵌套的片段会导致最终由项目中的另一个开发人员解决的问题。

他正在做一些低级别的东西,比如位切换来实现这个工作,所以我不太确定实际的最终解决scheme

validationonRequestPermissionsResultFragment中的PERMISSION_REQUEST_CODE是否包含相同的值。