Android API 29 以下如何将照片移动到选定文件夹?
2024-03-22 08:22:51
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_STORAGE
和WRITE_EXTERNAL_STORAGE
)。 - 由于这些方法涉及写入外部存储,因此应在运行时请求权限。
- 建议在主线程之外执行文件移动操作,以避免阻塞 UI 线程。
常见问题解答
1. 我应该使用哪种方法?
最佳方法取决于应用程序的特定需求和开发者的偏好。
2. 这些方法是否适用于所有类型的文件?
这些方法适用于任何类型的文件,但需要注意,对于某些文件类型(如视频),可能需要使用特定的 API 或第三方库。
3. 我可以在外部存储中的任何位置保存文件吗?
否,访问外部存储的权限是受限的。开发者只能访问应用程序的特定文件夹,通常是应用程序特定的文件夹或公共媒体文件夹。
4. 这些方法在所有 Android 设备上都受支持吗?
这些方法受支持的范围从 Android 4.4(API 19)到 API 29。对于较旧版本的 Android,需要探索替代方法,如使用文件系统 API。
5. 如果我遇到问题该怎么办?
请检查以下内容:
- 权限是否已正确授予。
- 文件路径是否正确。
- 存储空间是否充足。
如果问题仍然存在,请寻求技术支持社区的帮助。