在Android M上重新启动应用程序之前,写入外部存储器不起作用

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

这不是一个新的应用程序,我已经在清单中声明了WRITE_EXTERNAL_STORAGE,在早期的系统上它工作正常。

我使用checkSelfPermission和requestPermissions方法,当我读取或写入SD卡的请求时,我有一个例外,我没有权限。

任何人都知道我错过了什么? 还是我碰到一个bug?

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

Solutions Collecting From Web of "在Android M上重新启动应用程序之前,写入外部存储器不起作用"

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

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

你可以这样做:

 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向用户显示有关Permission的消息, mainLayoutActivity's Main Layout ID。

希望它可以帮助你。