当前位置: 首页 > 知识库问答 >
问题:

onRequestPermissionsResult未在对话片段中调用

鞠嘉誉
2023-03-14

我已经开始处理Android M运行时权限。在这里,我面临的问题是,如果从Dialog Frament类调用RequestPermissionsResult,那么在同一个Dialog fraend类中不会调用onRequestPermissionsResult。但是如果从Activity类或Frament类调用onRequestPermissionsResult方法会在同一类中调用

以下是我的示例代码:

public class ContactPickerDialog extends DialogFragment {
    private static final int READ_CONTACTS_REQUEST_CODE = 12;
    private Context mContext;

    private void loadContact() {
        if(hasPermission(mContext, Manifest.permission.READ_CONTACTS)){
            new ContactSyncTask().execute();
        } else {
            this.requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        Logger.d("TAG", "dialog onRequestPermissionsResult");
        switch (requestCode) {
            case READ_CONTACTS_REQUEST_CODE:
                // Check Permissions Granted or not
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    new ContactSyncTask().execute();
                } else {
                    // Permission Denied
                    Toast.makeText(getActivity(), "Read contact permission is denied", Toast.LENGTH_SHORT).show();
                }
            break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

    private static boolean hasPermission(Context context, String permission){
        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
    }

} 

在代码中,我调用了< code >对话框片段类的< code>requestPermissions方法。所以我期待在同一个班级取得好成绩。

感谢任何帮助。提前感谢!

编辑:在这里我添加更多细节,以便对其他人更有帮助。以前我使用 getChildFragmentManager() 来显示 DialogFragment。

ContactPickerDialog dialog = new ContactPickerDialog();
dialog.show(getChildFragmentManager(), "Contact Picker");

但是正如@CommonWare让我用activity来展示DialogFragment。我做了以下的改变,它起作用了。

ContactPickerDialog dialog = new ContactPickerDialog();
dialog.show(getActivity().getSupportFragmentManager(), "Contact Picker");

共有3个答案

王经赋
2023-03-14

这个问题似乎在Android支持库23.3.0及以上版本中得到修复。

如果您使用的是支持 v4 片段,则嵌套片段现在将收到对 onRequestPermissionsResult() 的回调。

编辑:@AndrewS,以下是你如何更新。

在build.gradle(app)文件中,更改以下行以使用最新版本的最新支持库24.0.0:

dependencies {
    compile 'com.android.support:appcompat-v7:24.0.0'
}
章稳
2023-03-14

Android中似乎存在一个bug,其中嵌套片段不支持onRequestPermissionsResult()回调。对于<code>DialogFragment</code>,解决方法似乎是让希望显示对话框的片段调用宿主活动上的方法,而该活动显示<code>对话框fragment>本身。

苏宜人
2023-03-14

如果您在支持库中的片段中,请直接调用RequestPermis(),并且您的片段的onRequestPermissionsResult()将被回调。

如果你调用 ActivityCompat.requestPermissions(),那么 ActivityonRequestPermissionsResult() 将被回调。

 类似资料:
  • 我有一个片段,其中有recyclerview,并使用recyclerview适配器在这个recyclerview中设置数据。 现在,我在适配器的列表项中单击了一个按钮,我需要检查android中的READ\u EXTERNAL\u STORAGE权限,以查看android中的新权限模型。 我在这个适配器的片段中创建了一个新函数,用于检查是否授予了权限,如果尚未授予权限,则请求权限。 我已经通过了我

  • 下面的代码在活动中运行良好,但我不能使它在片段中工作。 从不调用。

  • 运行playstore Build Apk时,未调用Marshmallow Runtime Permissions onRequestPermissionsResult,但正常调试Apk时运行良好。谁来帮帮我。。谢谢 OnRequestPermissionResult方法

  • 我有一个片段,其中我有RecolyerView和使用RecolyerView适配器在这个RecolyerView中设置数据。 现在,我在适配器的列表项中有一个按钮,单击该按钮,我需要检查android中的READ_EXTERNAL_STORAGE权限,以获取android中的新权限模型。 我在这个适配器的片段中创建了一个新函数来检查权限是否被授予,如果还没有授予,则请求权限。 我已经使用下面的代码

  • 在我的非活动类中,我请求了一个Fine location权限,但回调onRequestPermissionsResult“永远不会被调用”。现在我看到了一些与此相关的问题,但他们都认为请求是从活动或片段发出的,没有人考虑从非活动类发出请求。这是我的代码 这是onRequestPermissionResultCallback方法的实现 解决了:正如一些人提到的“activity”的onRequest

  • 我试图实现marshmallow的权限支持,但我在“OnRequestPermissionsResult”中的代码从未被调用。代码的“onCreate”和“onMapReady”部分工作正常。检查设备是否具有权限并请求权限可以正常工作。 这是我的活动: }

  • 在我活动页面之一的片段中,我希望从用户处获得权限,并在授予权限后执行一些操作,但不起作用,且在授予权限后看不到任何日志

  • 这是我的代码,根据文档,它是用于: 我在这里找到了一个解决方案,但我并不真正理解它,因为它是用编写的,我也不理解。我需要帮助!! ---编辑----