onRequestPermissionsResult 永远不会在片段中被调用 [重复]
Posted
技术标签:
【中文标题】onRequestPermissionsResult 永远不会在片段中被调用 [重复]【英文标题】:onRequestPermissionsResult never gets called in fragment [duplicate] 【发布时间】:2017-09-22 14:56:52 【问题描述】:以下代码在 Activity 中运行良好,但我无法使其在 Fragment 中运行。
onRequestPermissionsResult
永远不会被调用。
API 级别 23 (android 6.0) 中有一个 requestPermissions
函数,但我需要让它在 API 级别 21 (Android 5.0) 等较低级别上工作,所以不幸的是我不能使用它。 ActivityCompat.requestPermissions
只是根本不调用onRequestPermissionsResult
。
有什么建议吗?
public class MyFragment extends Fragment
final int REQUEST_CODE = 120;
@Override
public View onCreateView(LayoutInflater infl, ViewGroup cont, Bundle bundle)
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED)
Log.i("LOG", "Asking for permission right now..");
ActivityCompat.requestPermissions(getActivity(), new String[]Manifest.permission.READ_CONTACTS, REQUEST_CODE);
//This is working but needs API level 23 (Android 6.0) - How to make this work on Android 5.0?
//requestPermissions( new String[]Manifest.permission.READ_CONTACTS, REQUEST_CODE);
return super.onCreateView(infl, cont, bundle);
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
Log.i("LOG", "onRequestPermissionsResult!");
if (requestCode == REQUEST_CODE)
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
Log.i("LOG", "GRANTED");
Toast.makeText(getActivity(), "GRANTED,", Toast.LENGTH_LONG).show();
else
Log.i("LOG", "REFUSED");
Toast.makeText(getActivity(), "REFUSED,", Toast.LENGTH_LONG).show();
【问题讨论】:
onCreateView
是调用requestPermissions
将其移至onResume
的糟糕选择
@Selvin 我不在生产代码中调用它。它只是一个小的虚拟代码,可以轻松显示和重现错误。
抱歉,我不太明白你的想法,如果你的安卓设备是 5.0,那你为什么需要申请权限??
@PhạmLam 5.0+
用FragmentCompat
替换ActivityCompat
并调用它的requestPermissions()
方法。就目前而言,onRequestPermissionsResult()
正在被调用...在您传递给 ActivityCompat.requestPermissions()
的活动上。
【参考方案1】:
在托管活动的 onRequestPermissionResult 内调用 fragment.onRequestPermissionResult。
【讨论】:
我在一个片段中工作,这就是重点【参考方案2】:在 API 23 中添加了运行时请求权限。因此它在旧版本中不起作用。在 API 中,安装时授予的权限超过 23 个。
编辑:在请求许可之前,只需调用 checkSelfPermission 并调用您的代码(如果已被授予)而不是请求许可。
【讨论】:
以上是关于onRequestPermissionsResult 永远不会在片段中被调用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章