如何调用系统对话框以允许写入外部SD卡

时间:2019-03-23 04:12:10

标签: android permissions android-sdcard android-external-storage

我正在编写一个应用程序,以启用各种笔记,计算,日记和其他实用程序功能。当有外部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卡的请求?

0 个答案:

没有答案