相关疑难解决方法(0)

getExternalStoragePublicDirectory在Android Q中已弃用

由于getExternalStoragePublicDirectory已在中弃用Android Q,建议使用其他方式。那么我们如何指定我们要将相机应用程序生成的照片存储到DCIM文件夹或文件夹中的自定义子文件夹中DCIM呢?

文档指出,接下来的3个选项是新的首选替代品:

  1. Context#getExternalFilesDir(String)
  2. 媒体商店
  3. 意图#ACTION_OPEN_DOCUMENT

选项1不存在,因为这意味着如果卸载该应用程序,照片将被删除。

选项3也不是一个选择,因为它将要求用户通过SAF文件浏览器选择位置。

我们只剩下选项2,即MediaStore;但是没有文档说明如何使用它代替Android Q中的getExternalStoragePublicDirectory。

android

14
推荐指数
2
解决办法
5973
查看次数

Android Q,如何用正确的文件名保存MediaStore的录音?

我想将使用我的应用程序录制的 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 file audio-recording mediastore scoped-storage

9
推荐指数
1
解决办法
3437
查看次数

如何获得 MANAGE_EXTERNAL_STORAGE 权限

我正在尝试在我的 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)

但是我怎样才能获得那个许可呢?

android android-permissions scoped-storage

9
推荐指数
1
解决办法
1万
查看次数

Android 10 如何在所有应用程序都可以访问的文件管理器中创建文件/文件夹

我正在使用以下代码在存储中创建目录/文件。

   File file  = new File(Environment.getExternalStorageDirectory().toString(), "/MyDirectory");
Run Code Online (Sandbox Code Playgroud)

在 android 10 中更新目标 SDK 版本 29 后,它无法正常工作。

谁能建议如何在应用程序范围之外创建文件夹?

android file-manager android-10.0

5
推荐指数
1
解决办法
3000
查看次数

如何使用范围存储创建外部目录并授予对目录 android 的访问权限

在我的应用程序中,我需要创建一个外部目录并将文档文件存储在子目录中。到 Android Pie,API 28,它进展顺利。从 Android 10 开始,它发生了变化,在范围存储中,我如何在外部存储中创建目录并授予对整个目录的权限?我想使用 uri 将文件下载到这些目录,我想稍后使用他们的 uri 读取它们。

android file firebase android-10.0 scoped-storage

5
推荐指数
0
解决办法
1170
查看次数

Android R – 使用 Scoped 存储 (MediaStore.Downloads) 在下载文件夹中创建一个文本文件

我的应用程序需要在下载文件夹中的文本文件中保存一个字符串。目前(目标: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)。

在这里,我有点失落。我在下载中找不到显示如何创建文本文件的好的文档或片段。如果有人可以解释或展示如何做到这一点,我会很高兴吗?

android mediastore scoped-storage

3
推荐指数
1
解决办法
3403
查看次数

Android mkdirs() 在 Android 11 上使用 Environment.getExternalStorageDirectory() 返回 false

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"不工作?

storage android android-sdcard mkdirs

3
推荐指数
1
解决办法
5396
查看次数