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 请求许可?如果从片段中请求,它会留在片段中。
大家好,
我有 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 请求许可?如果从片段中请求,它会留在片段中。