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 永远不会在片段中被调用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章