我正在编写一个应用程序,以启用各种笔记,计算,日记和其他实用程序功能。当有外部SD卡可用时,我希望能够直接对SD卡进行编辑,保存,重命名,删除等操作。
为避免并发症,并且由于这主要是供我个人使用,因此我目前的目标是API级别24-27。
我已启用WRITE_EXTERNAL_STORAGE权限,这意味着我可以处理主要的“内部”存储文件,并且checkSelfPermissions
将按预期返回PERMISSION_GRANTED。
对于外部SD卡,我可以读取所有内容,打开的文件等。在阅读了各种非常有用的参考文件之后,尤其是Universal way to write to external SD card on Android,我有点希望checkSelfPermissions
调用不会返回PERMISSION_GRANTED 。但是,它仍然可以。
我认为问题是,实际上,我只是在检查是否已启用WRITE_EXTERNAL_STORAGE权限,但我没有专门为外部SD卡做checkSelfPermissions
。
当我跟踪两种情况下发生的情况时(例如,重命名常规“内部”文件系统上的文件与尝试重命名外部SD卡上的文件),一切似乎都相同,没有问题,但是文件未重命名。
下面的代码(片段中)显示了各种调用
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (grantResults.length > 0) {
Log.d(TAG,"onRequestPermissionsResult="+grantResults[0]);
}
else {
Log.d(TAG,"request cancelled!!");
}
switch (requestCode) {
case REQUEST_CODE_STORAGE_PERMISSION:
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0 && grantResults[0] == PERMISSION_GRANTED) {
toastMessage("Permission granted!");
} else {
toastMessage("Permission denied :-(");
}
break;
}
}
private boolean hasPermissions() {
Log.d(TAG,"check if has permissions");
boolean temp = ActivityCompat.checkSelfPermission(getContext(),
WRITE_EXTERNAL_STORAGE) == PERMISSION_GRANTED;
Log.d(TAG,"has permissions= "+temp);
return temp;
}
private void requestPermissions() {
Log.d(TAG,"requesting permission");
requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_STORAGE_PERMISSION);
}
而且我尝试在重命名之前明确请求权限:
dirName = this.currentDirectory.getPath() + "/" + data.getDataString();
Log.d(TAG,"rename to "+dirName);
File g = new File(dirName);
File f = directoryEntries.get(hPos).getFile();
requestPermissions();
f.renameTo(g);
Log.d(TAG,"file renamed");
无论是要访问“内部”存储还是外部SD卡,返回的结果都是相同的。并且在进行requestPermissions
调用时不会调用系统对话(大概是因为上面的内容不是特定于外部SD卡的,而是实际上只是在检查是否已包含WRITE_EXTERNAL_STORAGE许可(因此只需检查,同样,该应用可以写入内部存储)。
我如何提出特定于外部SD卡的请求?