我有一个片段,其中我有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方法时,我请求从片段的权限。 我该怎么做呢?我做错了什么吗,如果有人有什么想法,请帮助我。


当前回答

在低于23的api中,你可以在活动中创建一个接口,然后在子片段中实现它,当你在活动中获得权限请求结果时,将它传递给在片段中实现的接口。 就是这么简单:)

其他回答

对于tragetSDK 28, SDK检查(>23)和请求权限从片段将工作。ActivityCompat。requestPermissions失败(如果您将请求代码设置在65536以下,则会出现权限对话框,如果用户允许权限,则提供权限,但不会发生回调。但如果您设置大于65536,则ActivityCompat。requestPermissions将立即失败。我不知道这背后的逻辑是什么。可能是一个bug,也可能是故意的)。

工作代码:

  if (Build.VERSION.SDK_INT >= 23) {
                        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, LOCATION_ACCESS_REQUEST);
                    }

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

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

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

看看是否有帮助。

我也有同样的问题。你的片段可以从活动布局中初始化。 像这样:

main_activty.xml

<fragment
    android:id="@+id/fragment"
    android:name="com.exampe.SomeFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

当我使用FragmentTransaction代替时,这个问题为我解决了

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

权限字符串 RequestCode。

对于exp:

 requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSION_CODE);

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

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