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

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

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

我已经通过了MyFragment。这作为适配器中的一个参数,并在适配器中的按钮单击上调用片段的方法。

我已经使用下面的代码在片段中调用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 {}

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

我在片段的父活动中也定义了相同的onRequestPermissionsResult方法,它正在被调用。

我不能删除活动的onRequestPermissionsResult方法,但想调用片段的onRequestPermissionsResult方法时,我请求从片段的权限。 我该怎么做呢?我做错了什么吗,如果有人有什么想法,请帮助我。


当前回答

验证PERMISSION_REQUEST_CODE inonRequestPermissionsResult和yourFragment内部包含相同的值。

其他回答

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

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

在AppCompatActivity中使用ActivityCompat.requestpermissions方法 在v4支持片段中,您应该使用requestpermissions Catch是如果你调用AppcompatActivity。在你的片段请求权限,然后回调将来活动,而不是片段 记得打电话给管理员。来自活动的onRequestPermissionsResult。

看看是否有帮助。

这个问题实际上是由NestedFragments引起的。基本上大多数片段都扩展了一个hostdfragment,而hostdfragment又扩展了一个CompatFragment。这些嵌套的片段导致了一些问题,这些问题最终由项目中的另一个开发人员解决。

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

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();
 }
 }

改变权限

当我们requestPermission from fragment, android改变我们的requestCode在

requestPermissionsFromFragment

这是FragmetActivity的代码:

 void requestPermissionsFromFragment(@NonNull Fragment fragment, @NonNull String[] permissions,
        int requestCode) {
    if (requestCode == -1) {
        ActivityCompat.requestPermissions(this, permissions, requestCode);
        return;
    }
    checkForValidRequestCode(requestCode);
    try {
        mRequestedPermissionsFromFragment = true;
        int requestIndex = allocateRequestIndex(fragment);
        ActivityCompat.requestPermissions(this, permissions,
                ((requestIndex + 1) << 16) + (requestCode & 0xffff));
    } finally {
        mRequestedPermissionsFromFragment = false;
    }
}

你可以看到(requestIndex + 1) << 16) + (requestCode & 0xffff) 当

onRequestPermissionsResult

android检查请求代码,如果它是从fragment发送,它将结果传递给fragment,否则它不传递给fragment 这是FragmentActivity的代码:

enter code here@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
        @NonNull int[] grantResults) {
    mFragments.noteStateNotSaved();
    int index = (requestCode >> 16) & 0xffff;
    if (index != 0) {
        index--;

        String who = mPendingFragmentActivityResults.get(index);
        mPendingFragmentActivityResults.remove(index);
        if (who == null) {
            Log.w(TAG, "Activity result delivered for unknown Fragment.");
            return;
        }
        Fragment frag = mFragments.findFragmentByWho(who);
        if (frag == null) {
            Log.w(TAG, "Activity result no fragment exists for who: " + who);
        } else {
            frag.onRequestPermissionsResult(requestCode & 0xffff, permissions, grantResults);
        }
    }
}

总结

如果你调用activity。requestpermission()或ActivityCompat。如果你调用Fragment .requestPermission(),它会将结果传递给你的Activity和Fragment

这是人们在为“棉花糖”编程时常犯的一个错误。 当在AppCompatActivity中,你应该使用 ActivityCompat.requestPermissions;在 android.support.v4.app。片段,你应该简单地使用 requestPermissions(这是android.support.v4.app.Fragment的实例方法 ActivityCompat。requestPermissions in a fragment, the onRequestPermissionsResult回调在活动上被调用,而不是 的片段。

requestPermissions(permissions, PERMISSIONS_CODE);

如果你从一个片段中调用这段代码,它有自己的requestPermissions方法。

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

ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);

如果是碎片,就打电话

requestPermissions(new String[]{Manifest.permission.CAMERA},
                            MY_PERMISSIONS_REQUEST_CAMERA);

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