Android运行时权限在接受或拒绝权限后调用相同的Fragment

问题描述 投票:0回答:2

Helo伙计们,

我有组件“BottomNavigationView”的活动,在这个组件中我有四个片段。当我点击第二个片段上的例子并单击“授予权限”按钮时,会弹出用于写入和读取外部存储的运行时权限。

当我接受或拒绝运行时权限时,应用程序会自动回调MainActivity并默认显示第一个片段(因为第一个片段是Main Activitiy中的默认片段)。

接受或拒绝留在第二个片段后是否可能?或者我需要例如保存在我的片段的共享偏好位置并在此位置上邀请片段。

我尝试使用lib https://github.com/googlesamples/easypermissions。在取得成功后,我尝试使用自定义实现进行许可。

这是我的代码。

private static final int REQUEST_CODE = 121;
private void requiredUserPermissionForDownloadPDF(){
    if(!permissionAlreadyGranted()){
        requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
    }
}


private boolean permissionAlreadyGranted() {
    String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
    for (String permission : perms) {
        if (ContextCompat.checkSelfPermission(getContext(), permission) != PackageManager.PERMISSION_GRANTED) {
            return false;
        }
    }
    return true;
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == REQUEST_CODE
            && grantResults[0] == PackageManager.PERMISSION_GRANTED
            && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
        System.out.println("Granted");
    }
}

接受或拒绝留在第二个片段后是否可能?或者我需要例如保存在我的片段的共享偏好位置并在此位置上邀请片段。

android android-fragments android-permissions android-dialogfragment
2个回答
1
投票

我遇到了同样的问题,因为活动正在重新创建。您必须在onSaveInstanceState方法中从BottomNavigationView保存选定的项ID,如下所示:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(KEY_BOT_NAV_VIEW_SELECTED_ITEM_ID, mBottomNavigationView.getSelectedItemId());
    super.onSaveInstanceState(outState);
}

其中KEY_BOT_NAV_VIEW_SELECTED_ITEM_ID是用于保存和检索id的字符串键。然后,在此之后,再次创建活动并调用protected void onCreate(Bundle savedInstanceState)时,bundle参数不为null,您可以检索已保存的id:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mBottomNavigationView.setOnNavigationItemSelectedListener(this);
    if (savedInstanceState != null) {
        restoreInstanceState(savedInstanceState);
    } else {
        //show first fragment fragment 
    }
}

您可以从here了解有关保存和恢复状态的更多信息


0
投票

您是从第二个片段还是从活动请求许可?如果从片段请求,它将保留在片段内。

© www.soinside.com 2019 - 2024. All rights reserved.