gpt4 book ai didi

android - 在我重新启动 Android M 上的应用程序之前,无法写入外部存储

转载 作者:IT老高 更新时间:2023-10-28 23:15:34 27 4
gpt4 key购买 nike

我对新的权限系统有疑问。我修改了我的代码以请求 WRITE_EXTERNAL_STORAGE 的许可。但是我的应用程序无法写入(或读取)SD卡,直到我重新启动应用程序(当然我在对话框中允许它)。之后它工作正常。

这不是一个新应用,我已经在 list 中声明了 WRITE_EXTERNAL_STORAGE,在早期的系统上它运行良好。

我正在使用 checkSelfPermission 和 requestPermissions 方法,当我向 sd 卡发出读取或写入请求时,我遇到了一个我没有权限的异常。

有人知道我错过了什么吗?还是我遇到了错误?

SDK 版本是最新的(几小时前更新),我正在模拟器上测试。

最佳答案

当用户从 RuntimePermission 对话框 允许 WRITE_EXTERNAL_STORAGE 权限时,您需要 Callback

首先,您需要在 Activity 中实现 ActivityCompat 类的 OnRequestPermissionsResultCallback Listener 并覆盖 void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 方法检查用户是允许还是拒绝权限

你可以这样做:

int REQUEST_STORAGE = 1;

private void checkExternalStoragePermissions() {
if (hasStoragePermissionGranted()) {
//You can do what whatever you want to do as permission is granted
} else {
requestExternalStoragePermission();
}
}

public boolean hasStoragePermissionGranted(){
return ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
}

public void requestExternalStoragePermission() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_STORAGE);
}
}

这里是 onRequestPermissionsResult() 方法将在用户从运行时权限对话框中允许或拒绝权限时调用。

您还可以处理用户已选中从不显示运行时权限对话框的情况。

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

if (requestCode == REQUEST_STORAGE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//User allow from permission dialog
//You can do what whatever you want to do as permission is granted
} else if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivtity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
//User has deny from permission dialog
Snackbar.make(mainLayout, getResources().getString("Please enable storage permission"),Snackbar.LENGTH_INDEFINITE)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View view) {
ActivityCompat.requestPermissions(MainActivity.this, {Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_STORAGE);
}
})
.show();
} else {
// User has deny permission and checked never show permission dialog so you can redirect to Application settings page
Snackbar.make(mainLayout, getResources().getString("Please enable permission from settings"),Snackbar.LENGTH_INDEFINITE)
.setAction("OK", new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", MainActivity.this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
})
.show();
}
}
}

这里我使用 Snackbar 向用户显示有关权限的相关消息,mainLayoutActivity 的主布局 的 id。

希望对你有帮助。

关于android - 在我重新启动 Android M 上的应用程序之前,无法写入外部存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082845/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com