返回

Android API 29 以下如何将照片移动到选定文件夹?

Android

API 29 以下将照片移动到选定文件夹的指南

背景

将照片保存到特定文件夹在 Android 10(API 29)及更高版本中很容易,得益于 MediaStore.Images.Media.RELATIVE_PATH 的引入。然而,在较低版本的 Android 系统中,这种方法不再可行,从而限制了开发者在存储照片时的灵活性。

原因

这种限制源于 API 29 以下存储权限的变化。与早期版本相比,应用程序现在需要明确请求访问外部存储的权限,而且它们只能访问特定的文件夹,而不是整个外部存储空间。

解决方案

尽管存在限制,但仍有几种方法可以在 API 29 以下将照片移动到选定文件夹:

1. 使用 Intent

Intent 允许开发者创建文档并在外部存储中选择一个位置来保存它。以下代码展示了如何使用 Intent 将照片保存到选定文件夹:

Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_TITLE, "photo.jpg");
startActivityForResult(intent, REQUEST_CODE_CREATE_DOCUMENT);

2. 使用 MediaStore API

MediaStore API 提供了一种将照片插入外部存储的替代方法。以下代码演示了如何使用 MediaStore API 将照片保存到选定文件夹:

ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, "photo.jpg");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");

Uri uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

3. 使用第三方库

Glide、Picasso 和 ImageLoader 等第三方库提供了一种简化的解决方案,使开发者可以在 API 29 以下将照片移动到选定文件夹。以下代码使用 Glide 实现:

Glide.with(this)
    .load(uri)
    .apply(RequestOptions.diskCacheStrategyOf(DiskCacheStrategy.NONE))
    .apply(RequestOptions.skipMemoryCacheOf(true))
    .into(new SimpleTarget<Drawable>() {
        @Override
        public void onResourceReady(Drawable resource, Transition<? super Drawable> transition) {
            // 保存照片到选定文件夹
        }
    });

注意

在实现这些方法时,请记住以下几点:

  • 确保拥有必要的存储权限(READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE)。
  • 由于这些方法涉及写入外部存储,因此应在运行时请求权限。
  • 建议在主线程之外执行文件移动操作,以避免阻塞 UI 线程。

常见问题解答

1. 我应该使用哪种方法?

最佳方法取决于应用程序的特定需求和开发者的偏好。

2. 这些方法是否适用于所有类型的文件?

这些方法适用于任何类型的文件,但需要注意,对于某些文件类型(如视频),可能需要使用特定的 API 或第三方库。

3. 我可以在外部存储中的任何位置保存文件吗?

否,访问外部存储的权限是受限的。开发者只能访问应用程序的特定文件夹,通常是应用程序特定的文件夹或公共媒体文件夹。

4. 这些方法在所有 Android 设备上都受支持吗?

这些方法受支持的范围从 Android 4.4(API 19)到 API 29。对于较旧版本的 Android,需要探索替代方法,如使用文件系统 API。

5. 如果我遇到问题该怎么办?

请检查以下内容:

  • 权限是否已正确授予。
  • 文件路径是否正确。
  • 存储空间是否充足。

如果问题仍然存在,请寻求技术支持社区的帮助。