首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >getExternalStoragePublicDirectory在安卓Q中被弃用

getExternalStoragePublicDirectory在安卓Q中被弃用
EN

Stack Overflow用户
提问于 2019-06-06 05:53:50
回答 5查看 58.2K关注 0票数 97

因为Android Q中已经弃用了getExternalStoragePublicDirectory,所以建议使用其他方法。那么,我们如何指定要将相机应用程序中生成的照片存储到DCIM文件夹或DCIM中的自定义子文件夹中

文档指出,以下3个选项是新的首选替代方案:

  1. Context#getExternalFilesDir(String)
  2. MediaStore
  3. Intent#ACTION_OPEN_DOCUMENT

选项1是不可能的,因为这意味着如果应用程序被卸载,照片将被删除。

选项3也不是一个选择,因为它需要用户通过SAF文件资源管理器选择位置。

我们只剩下第二种选择,MediaStore;但在这个问题的时候,还没有关于如何在Android Q中使用它来替代getExternalStoragePublicDirectory的文档。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-06-06 06:13:26

根据文档,对the RELATIVE_PATH使用DCIM/...,其中...是您的定制子目录。所以,你最终会得到这样的结果:

代码语言:javascript
复制
      val resolver = context.contentResolver
      val contentValues = ContentValues().apply {
        put(MediaStore.MediaColumns.DISPLAY_NAME, "CuteKitten001")
        put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
        put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/PerracoLabs")
      }

      val uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)

      resolver.openOutputStream(uri).use {
        // TODO something with the stream
      }

请注意,由于RELATIVE_PATH是API Level 29的新成员,因此您需要在较新的设备上使用此方法,而在较旧的设备上使用getExternalStoragePublicDirectory()

票数 79
EN

Stack Overflow用户

发布于 2019-08-26 04:58:30

@CommonsWare答案令人惊叹。但是对于那些想要在Java中使用它的人,您需要尝试一下:

代码语言:javascript
复制
ContentResolver resolver = context.getContentResolver();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name);
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, mimeType);
contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);

Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);

根据@SamChen的建议,文本文件的代码应如下所示:

代码语言:javascript
复制
Uri uri = resolver.insert(MediaStore.Files.getContentUri("external"), contentValues);

因为我们不想让txt文件停留在Images文件夹中。

所以,我有mimeType的地方,你输入你想要的mime类型。例如,如果你想要txt (@Panache),你应该用这个字符串替换mimeType"text/plain"。下面是mime类型的列表:https://www.freeformatter.com/mime-types-list.html

另外,在我有变量name的地方,您可以将它替换为本例中的文件名。

票数 36
EN

Stack Overflow用户

发布于 2021-01-25 22:56:31

由于安全问题,默认情况下,针对安卓Q- API 29+的应用程序会禁用存储访问。如果要使其能够在AndroidManifest.xml中添加以下属性:

代码语言:javascript
复制
<manifest ... >
    <!-- This attribute is "false" by default for Android Q or higher -->
    <application android:requestLegacyExternalStorage="true" ... >
     ...
    </application>
</manifest>

那么你必须使用getExternalStorageDirectory()而不是getExternalStoragePublicDirectory()

例如:如果你想在内部存储中创建一个目录,如果不存在。

代码语言:javascript
复制
 File mediaStorageDir = new File(Environment.getExternalStorageDirectory() + "/SampleFolder");

 // Create the storage directory if it does not exist
 if (! mediaStorageDir.exists()){
     if (! mediaStorageDir.mkdirs()){
         Log.d("error", "failed to create directory");
     }
 }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56468539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档