Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android 10上运行时,我如何授予存储目录_下载的权限? 我的问题_Android_Android Permissions_Android 10.0_Android External Storage - Fatal编程技术网

在Android 10上运行时,我如何授予存储目录_下载的权限? 我的问题

在Android 10上运行时,我如何授予存储目录_下载的权限? 我的问题,android,android-permissions,android-10.0,android-external-storage,Android,Android Permissions,Android 10.0,Android External Storage,我有一个针对API 30的Android应用程序,它将数据文件存储在公共目录中,供用户访问并复制到其他地方自己的目录 这适用于API 28及以下版本,也适用于API 30,但不适用于访问被拒绝的API 29 到目前为止我做了什么 我研究了这里的各种帖子,包括回答API 29/Android 10主题的经验丰富的用户的答案,以及Android开发者的相关主题,但无法找到我问题的具体答案(或我能理解的答案)。我在Kotlin中看到了一些例子——我熟悉Java,但不熟悉Kotlin 我的代码中有什么

我有一个针对API 30的Android应用程序,它将数据文件存储在公共目录中,供用户访问并复制到其他地方自己的目录

这适用于API 28及以下版本,也适用于API 30,但不适用于访问被拒绝的API 29

到目前为止我做了什么 我研究了这里的各种帖子,包括回答API 29/Android 10主题的经验丰富的用户的答案,以及Android开发者的相关主题,但无法找到我问题的具体答案(或我能理解的答案)。我在Kotlin中看到了一些例子——我熟悉Java,但不熟悉Kotlin

我的代码中有什么 在我的清单中:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
在我的Java代码中:

我的主要类包括以下全局变量:

    public static File      dataDir;
    public static File      fileSaveDir;
在其他模块中,我有:

            Spine.dataDir = getFilesDir();
            Spine.fileSaveDir =
                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
以及保存文件的代码:

                    // Default toast text
                    toastText = "Failed to save file";

                    // [code to build fileName snipped]

                    // Create the output file
                    outFile = new File(Spine.fileSaveDir, fileName);
                    
                    try
                    {
                        out = new BufferedWriter(new FileWriter(outFile), 1024);
                    
                        // Output the formatted body
                        // [code snipped]

                        // Flush and close file
                        out.flush();
                        out.close();

                        // File has been saved
                        toastText = "File saved as " + formatDesc;
                    }
                    catch (IOException e)
                    {
                        toastText += "\n" + e.getMessage();
                    }
在API 29上运行时,尝试创建BufferedWriter时会引发异常。否则,在其他API级别上,一切正常。我到处寻找这个问题的解决办法,但一直找不到

在Android Studio中的API 29模拟器上运行时,实际的toast文本输出为:

Failed to save file
/storage/emulated/0/Download/
20210520.txt: open failed : EACCES
(Permission denied)

解决方案(感谢响应者)是在清单的应用程序部分添加android:requestLegacyExternalStorage=“true”,同时仍以API 30为目标


在我所有的测试中,我把它放在清单的错误部分,这就是为什么我不能让它工作的原因。

有时你需要运行时权限才能写入外部存储

if (ContextCompat.checkSelfPermission(Main_activity.this),
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            if (!ActivityCompat.shouldShowRequestPermissionRationale(OMain_activity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                ActivityCompat.requestPermissions(getActivity(),
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        1);
            }
    }

请求清单文件中的旧外部存储。我现在不在计算机旁(现在已经很晚了),但我以前在清单中有这个,我很确定它没有解决问题。我的目标是API 29还是API 30都没有区别。不管怎样,我明天会再次检查。已排序-请在Shazniq的答案中查看我的答案和我的评论。谢谢。是的,我也读过,但不幸的是它没有帮助。由于
targetSdkVersion 30
,requestLegacyExternalStorage属性将无法工作。试着确认一下:如果您将其更改为
targetSdkVersion 29
,那么我认为它会起作用。我不知道它是否相关,但您的build.gradle文件显示targetSdkVersion 30--您可能想更改它,我假设您在清单中设置了28或更少,因为您的问题是“这适用于api 28及以下版本”。不,您假设错误。目标Sdk设置为30时,它适用于除29以外的所有版本。否。Target 30和请求遗留外部存储对于Android 10设备有效。我的主要活动的OnCreate函数中已经有非常类似的代码,除了它既结合了WraveExtAlpLyStand和Access FieleLoad的请求之外,还没有添加代码,这就是为什么我认为这是问题。我引用的代码只是与API 29有关(具体地说)不起作用。如果没有您在这里提到的代码,所有这些都不会起作用!:-)无论如何,谢谢你抽出时间。好的,没问题。
<application
        android:requestLegacyExternalStorage="true"
    ....
if (ContextCompat.checkSelfPermission(Main_activity.this),
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            if (!ActivityCompat.shouldShowRequestPermissionRationale(OMain_activity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                ActivityCompat.requestPermissions(getActivity(),
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        1);
            }
    }