Szö*_*dám 21 android android-manifest android-permissions android-6.0-marshmallow
我遇到了新权限系统的问题.我修改了我的代码以获得WRITE_EXTERNAL_STORAGE的许可.但是我的应用程序无法写入(或读取)SD卡,直到我重新启动应用程序(当然我在对话框中允许它).之后它工作正常.
它不是一个新的应用程序,我已经在清单中声明了WRITE_EXTERNAL_STORAGE,而在早期的系统上它运行正常.
我正在使用checkSelfPermission和requestPermissions方法,当我向SD卡发出读取或写入请求时,我有一个例外,我没有权限.
任何人都知道我错过了什么?或者我遇到了一个错误?
SDK版本是最新版本(几小时前更新),我正在模拟器上测试它.
Callback当用户允许WRITE_EXTERNAL_STORAGE来自 的许可时,您需要RuntimePermission dialog。
首先,您需要在您的类中OnRequestPermissionsResultCallback Listener实现并重写 方法来检查用户是否允许或拒绝该权限ActivityCompatActivityvoid 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);
}
}
Run Code Online (Sandbox Code Playgroud)
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,我曾经Snackbar向用户显示有关 Permission 的相关消息,并且mainLayoutid 为Activity's Main Layout。
希望对您有帮助。
| 归档时间: |
|
| 查看次数: |
2950 次 |
| 最近记录: |