如何将文件保存到 Android Q (API 29) 上的公共(外部)存储?

t.j*_*cic 18 java android file-storage

我一直在使用外部存储来保存不同类型的文件。该文件需要对用户可见。现在从 Android Q 开始,该方法getExternalStoragePublicDirectory()已被弃用getExternalStoragePublicDirectory(docs)

我使用了以下代码:

File externalFilesDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "DirectoryName");
Run Code Online (Sandbox Code Playgroud)

是否有另一种方法来保存用户可见的文件?

Nau*_*Ash 7

您需要为 Android Q 添加一个检查。假设您想将图像保存在您的公共下载文件夹中。

try{
     OutputStream fos;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
       ContentResolver resolver = context.getContentResolver();
       ContentValues contentValues = new ContentValues();
       contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName);
       contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg");
       contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);
       Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
       fos = resolver.openOutputStream(Objects.requireNonNull(imageUri));
    } else {
       String imagesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();
       File image = new File(imagesDir, fileName);
       fos = new FileOutputStream(image);
    }
     finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
     Objects.requireNonNull(fos).close();
}catch (IOException e) {
  // Log Message
}
Run Code Online (Sandbox Code Playgroud)

  • 有很多带有图像的示例,因为它是用于保存的常用格式,但我需要的是文件的 .pdf 和 .docx 扩展名。对于该扩展,我没有找到使用 MediaStore 的解决方案。 (2认同)

小智 -1

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
Run Code Online (Sandbox Code Playgroud)

替换为:

   requireContext().getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)!!.absolutePath
Run Code Online (Sandbox Code Playgroud)