如果片段和活动中都定义了onRequestPermissionsResult,则不会在片段中调用它

Pri*_*one 132 android android-6.0-marshmallow

我有一个片段,我在其中使用recyclerview适配器在recyclerview中使用recyclerview和设置数据.

现在,我在适配器的列表项中点击了一个按钮,我需要在android中检查android中的新权限模型的READ_EXTERNAL_STORAGE权限.

我已在此适配器的片段中创建了一个新函数,以检查是否授予了权限,如果尚未授予权限,则请求权限.

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

我使用下面的代码在片段中调用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);
    }
Run Code Online (Sandbox Code Playgroud)

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 {}
Run Code Online (Sandbox Code Playgroud)

但它没有被调用,而是调用了这个Activity的onRequestPermissionsResult方法.

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

我无法删除活动的onRequestPermissionsResult方法,但是当我请求片段的权限时,我想调用片段的onRequestPermissionsResult方法.我怎样才能做到这一点?我在这里做错了什么,如果有人在这里有想法,请帮助我.

Var*_*129 315

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

我认为你混淆片段和活动的方法.上个月我的项目有类似的问题.请检查您是否最终有以下内容:

  1. 在AppCompatActivity中使用方法ActivityCompat.requestpermissions
  2. 在v4支持片段中,您应该使用请求权限
  3. Catch是你在片段中调用AppcompatActivity.requestpermissions然后回调将进入活动而不是片段
  4. 务必super.onRequestPermissionsResult从活动中拨打电话onRequestPermissionsResult.

看看它是否有帮助.

  • 当我使用`requestpermissions`请求权限时,在activity的onrequestpermissionresult中添加`super.onrequestpermissionresult`来调用片段的onrequestpermissionresult.现在工作正常,非常感谢.. :) (21认同)
  • 只需要仔细检查,确保您的活动中设置了super.onrequestpermissionresult (8认同)
  • *requestPermissions()*需要API级别23.是否有另一个向后兼容API级别21的解决方案? (4认同)
  • @msc87 1. 在活动和片段的 onRequestPermissionsResult 中,第一行应该是: **super.onRequestPermissionsResult(requestCode, permissions, grantResults);** 2. 在片段中,您识别未授予的权限,只需像这样调用 requestPermission 方法: **requestPermissions(new String[]{Manifest.permission.CALL_PHONE}, MY_PERMISSIONS_REQUEST_CALL_PHONE);** (3认同)
  • 活动回调中缺少 super.onrequestpermissionresult,导致我的片段回调没有被调用 (2认同)

ful*_*oon 83

我从片段和片段中请求了位置权限,我需要更改它:

            ActivityCompat.requestPermissions(getActivity(), new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);
Run Code Online (Sandbox Code Playgroud)

对此:

            requestPermissions(new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_REQ_CODE);
Run Code Online (Sandbox Code Playgroud)

然后在片段中调用onRequestPermissionsResult.

  • 奇迹般有效 :) (2认同)

Far*_*aev 35

这是人们在编写棉花糖时常犯的错误。

在 AppCompatActivity 中时,应该使用 ActivityCompat.requestPermissions;在 android.support.v4.app.Fragment 中时,您应该简单地使用 requestPermissions(这是 android.support.v4.app.Fragment 的实例方法) 如果您在片段中调用 ActivityCompat.requestPermissions,则调用 onRequestPermissionsResult 回调活动而不是片段。

requestPermissions(permissions, PERMISSIONS_CODE);
Run Code Online (Sandbox Code Playgroud)

如果您从片段中调用此代码,则它具有自己的 requestPermissions 方法。

所以基本概念是,如果你在一个活动中,那么调用

ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);
Run Code Online (Sandbox Code Playgroud)

如果在片段中,只需调用

requestPermissions(new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);
Run Code Online (Sandbox Code Playgroud)

作为参考,我从这个链接https://www.coderzheaven.com/2016/10/12/onrequestpermissionsresult-not-called-on-fragments/得到了答案


小智 18

改变这个:

ActivityCompat.requestPermissions(
    activity,
    arrayOf(Manifest.permission.READ_CONTACTS),
    PERMISSIONS_REQUEST_READ_CONTACTS
)
Run Code Online (Sandbox Code Playgroud)

对此:

requestPermissions(
     arrayOf(Manifest.permission.READ_CONTACTS),
     PERMISSIONS_REQUEST_READ_CONTACTS
)
Run Code Online (Sandbox Code Playgroud)


小智 9

在片段中,您不应该将 ActivityCompat 用于 requestPermissions,您只需使用 requestPermissions 并在方法中传递两个参数。

  1. 权限字符串
  2. 请求代码。

对于经验:

 requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);
Run Code Online (Sandbox Code Playgroud)


Jua*_*ler 7

requestPermissionsFragments上的方法需要API级别23或更高级别.
如果您的应用针对较低版本,则可以使用

FragmentCompat.requestPermissions(this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            ConstantVariables.READ_EXTERNAL_STORAGE);
Run Code Online (Sandbox Code Playgroud)

首先,您需要添加support-v13依赖项:

implementation "com.android.support:support-v13:$supportLibVersion"
Run Code Online (Sandbox Code Playgroud)


小智 5

Fragment.requestPermission()如果你想进入onPermissionResult你的 Fragment,你必须调用。