安卓11在外部存储器上不创建应用程序目录

13
最近,我将我的智能手机升级到了Android 11,并注意到其中一个应用程序在创建外部存储器上的目录时崩溃。我已经阅读了Android 11文档,发现从Android 11开始,应用程序不能在外部存储器上创建自己的应用程序专用目录。这很奇怪,因为当我打开Android/data目录时,有很多应用程序文件夹,所以可能存在应用程序在更新之前创建的文件夹,或者是这些文件夹是由应用程序自动创建的?

Android/data不存在。你的意思是:/storage/emulated/0/Android/data。在这个目录下,包含所有应用程序的特定目录。每个应用程序都可以访问自己的目录。/storage/emulated/0是外部存储的根目录,您的应用程序无法创建目录...除非您知道如何...或者使用SAF。 - blackapps
请阅读此链接 https://dev59.com/BVIG5IYBdhLWcg3w01A9#66366102 - Thoriya Prahalad
3个回答

28

好的,我找到了一种方法。我们的应用程序无法创建该文件夹,但是如果我们调用例如getApplicationContext().getExternalFilesDir("");,Android将为我们创建该文件夹。

很愚蠢的是,如果我们想打开不存在的目录,它会创建它,但当我们想自己创建它时就会出问题。Android 开发人员应该让我们的生活更轻松,但每次更新他们都让它变得更加困难。


但它只会在Android文件夹中创建一个目录,而不是@KyluAce想要的外部存储! - miraquee
无法正确解释,但在我的情况下,Android文件夹位于外部存储中。也许在没有SD卡扩展的手机中,内部=外部? - KyluAce
12
我决定停止为安卓开发应用,因为市场上充斥着定制化的安卓,应用在这些设备上根本无法运行。做什么都没有用,最后只会默默无闻。大型科技公司错误地实施了隐私政策,这只是为了限制开发人员、控制言论自由、操纵选举和民主。隐私是史蒂夫·乔布斯定义的东西,但谷歌和Facebook为了自己的利益改变了其定义。 - Rushikant Pawar
什么是解决方案?请发布解决方案而不是文本。 - Anand Savjani
Android不断强制我们进行这些更新,实际上他们会费尽心思地破坏我们的应用程序,我已经花了3天时间来修复这个问题,并因此收到了数百条负面评论,这是一个毫无必要的问题。 - Edmund Rojas

12

getApplicationContext().getExternalFilesDir(""); 可以给你提供应用程序特定的外部存储目录,其他应用程序将无法访问其内容。我认为所说的

从Android 11开始,应用程序不能在外部存储上创建自己的特定于应用程序的目录。

是指不能在外部存储上创建除了前面提到的那个应用特定目录以外的其他应用特定目录。我发现这篇文章有点有用。


需要“存储权限”吗? - M DEV

-2
            ContentValues values = new ContentValues();

            values.put(MediaStore.MediaColumns.DISPLAY_NAME, currentlyDownloadingFileObject.getFileName());
            values.put(MediaStore.MediaColumns.MIME_TYPE, "video/mp4");
            values.put(MediaStore.MediaColumns.BUCKET_DISPLAY_NAME, "my_file.mp4");
            values.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/" + "YOUR_DIRECTORY_NAME_GOES_HERE");

            context.getApplicationContext().getExternalFilesDir(MediaStore.Video.Media.EXTERNAL_CONTENT_URI+"/"+getApplicationName(context));

            Uri newUri newUri = context.getContentResolver()
                    .insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);

         // values.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/" + "YOUR_DIRECTORY_NAME_GOES_HERE");

您可以在内容值中存储一个给定相对路径的文件,如果尚未创建目录,则会创建该目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接