由于getExternalStoragePublicDirectory已在中弃用Android Q,建议使用其他方式。那么我们如何指定我们要将相机应用程序生成的照片存储到DCIM文件夹或文件夹中的自定义子文件夹中DCIM呢?
文档指出,接下来的3个选项是新的首选替代品:
选项1不存在,因为这意味着如果卸载该应用程序,照片将被删除。
选项3也不是一个选择,因为它将要求用户通过SAF文件浏览器选择位置。
我们只剩下选项2,即MediaStore;但是没有文档说明如何使用它代替Android Q中的getExternalStoragePublicDirectory。
我想将使用我的应用程序录制的 mp3 文件存储到带有 MediaStore 的 Music 文件夹中,用于 Android 10 的新“范围存储”。
此方法效果很好,但文件以时间戳命名(例如 1576253519449),没有.mp3扩展名。
如果我使用文件管理器手动添加扩展名,则文件会被正确记录。
我如何fileName + ".mp3"用来命名文件?
String fileName; //Obtained by intent
MediaRecorder audioRecorder;
Uri audiouri;
ParcelFileDescriptor file;
private void startRecording() throws IOException {
ContentValues values = new ContentValues(4);
values.put(MediaStore.Audio.Media.TITLE, fileName);
values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (System.currentTimeMillis() / 1000));
values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/mp3");
values.put(MediaStore.Audio.Media.RELATIVE_PATH, "Music/Recordings/");
audiouri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, values);
file = getContentResolver().openFileDescriptor(audiouri, "w");
if (file != null) {
audioRecorder = new MediaRecorder();
audioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
audioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
audioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
audioRecorder.setOutputFile(file.getFileDescriptor());
audioRecorder.setAudioChannels(1);
audioRecorder.prepare();
audioRecorder.start();
}
}
Run Code Online (Sandbox Code Playgroud)
另一个问题: …
我正在尝试在我的 Android 10 (API 29) 设备上获得MANAGE_EXTERNAL_STORAGE权限。
https://developer.android.com/training/data-storage/manage-all-files
显现:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
主要活动:
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
结果是:
No Activity found to handle Intent { act=android.settings.MANAGE_APP_ALL_FILES_ACCESS_PERMISSION }
Run Code Online (Sandbox Code Playgroud)
好的,这种行为是可能的。医生说:
In some cases, a matching Activity may not exist, so ensure you safeguard against this.
Run Code Online (Sandbox Code Playgroud)
但是我怎样才能获得那个许可呢?
我正在使用以下代码在存储中创建目录/文件。
File file = new File(Environment.getExternalStorageDirectory().toString(), "/MyDirectory");
Run Code Online (Sandbox Code Playgroud)
在 android 10 中更新目标 SDK 版本 29 后,它无法正常工作。
谁能建议如何在应用程序范围之外创建文件夹?
在我的应用程序中,我需要创建一个外部目录并将文档文件存储在子目录中。到 Android Pie,API 28,它进展顺利。从 Android 10 开始,它发生了变化,在范围存储中,我如何在外部存储中创建目录并授予对整个目录的权限?我想使用 uri 将文件下载到这些目录,我想稍后使用他们的 uri 读取它们。
我的应用程序需要在下载文件夹中的文本文件中保存一个字符串。目前(目标:API 29 (Q) 我正在使用 FILE API 和:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)
但是对于 API 30 (R),如果我理解得很好,我必须将其迁移到作用域存储 (MediaStore.Downloads)。
在这里,我有点失落。我在下载中找不到显示如何创建文本文件的好的文档或片段。如果有人可以解释或展示如何做到这一点,我会很高兴吗?
Mkdirs() 函数在 Android 11 上不起作用。在 Android 10 及更低版本上一切正常。
代码:
***String path =Environment.getExternalStorageDirectory().getAbsolutePath() + "/My_directory/";
File temp_file = new File(path);
if (!temp_file.exists()){
Boolean can_create= temp_file.mkdir();
}***
Run Code Online (Sandbox Code Playgroud)
如果 Android 10 或更低版本,以上代码将返回 true。但在 Android 11 中返回 false。清单权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)
请注意,运行时权限被视为相同(READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE)。
清单应用:
<application
android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)
我能够在外部存储中写入的唯一方法是使用,getExternalFilesDir()但这不是根目录。
根据这个开发者网站,我们不能再在根目录中创建文件夹了!
检查后到目前为止的问题:
1-是否确认在Android 11中我们无法在根目录上创建任何文件夹?有解决办法吗?
2-如果是,将数据保存在外部存储中的方法是什么,不包括getExternalFilesDir()?
3-为什么android:requestLegacyExternalStorage="true"不工作?
android ×7
android-10.0 ×2
file ×2
mediastore ×2
file-manager ×1
firebase ×1
mkdirs ×1
storage ×1