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

Android runtime permission call same Fragment after accept or denied permission

大家好,

我有 activity 和组件 "BottomNavigationView",在这个组件中我有四个片段。例如,当我单击第二个片段并单击按钮 "Give permission" 时,这里会弹出用于写入和读取外部存储的运行时权限。

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

accept or denied后是否可以停留在第二个片段上?或者我需要例如保存在我的片段的 sharedpreference 位置并在这个位置邀请片段。

我尝试使用 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");
    }
}

accept or denied后是否可以停留在第二个片段上?或者我需要例如保存在我的片段的 sharedpreference 位置并在这个位置邀请片段。

我遇到了同样的问题,这是因为 activity 正在重新创建。 您必须使用 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 的字符串键。然后,在此之后,当再次创建 activity 并调用 protected void onCreate(Bundle savedInstanceState) 时,bundle 参数不为空,您可以检索保存的 id:

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

您可以从 here

了解更多关于保存和恢复状态的信息

您是在向第二个片段还是 activity 请求许可?如果从片段中请求,它会留在片段中。