Android(compileSdk=32):将PDF字节数组存至公共Downloads目录的最简方案
最简实现:将PDF字节数组存储到公共Downloads目录
MediaStore 完全支持存储PDF这类非媒体文件,无需担心兼容性问题。下面是直接利用MediaStore将字节数组写入公共Downloads目录的最简实现:
核心思路
通过MediaStore的Downloads集合创建文件条目,获取可写入的输出流后直接写入PDF字节数组,无需手动处理文件路径或复杂的权限适配(Android 10+)。
Kotlin 实现代码
fun savePdfToDownloads(context: Context, pdfBytes: ByteArray, fileName: String) { val contentValues = ContentValues().apply { put(MediaStore.Downloads.DISPLAY_NAME, fileName) put(MediaStore.Downloads.MIME_TYPE, "application/pdf") put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS) } val uri = context.contentResolver.insert( MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues ) ?: return context.contentResolver.openOutputStream(uri)?.use { outputStream -> outputStream.write(pdfBytes) } }
Java 实现代码
public void savePdfToDownloads(Context context, byte[] pdfBytes, String fileName) { ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Downloads.DISPLAY_NAME, fileName); contentValues.put(MediaStore.Downloads.MIME_TYPE, "application/pdf"); contentValues.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS); Uri uri = context.getContentResolver().insert( MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues ); if (uri == null) return; try (OutputStream outputStream = context.getContentResolver().openOutputStream(uri)) { if (outputStream != null) { outputStream.write(pdfBytes); } } catch (IOException e) { e.printStackTrace(); } }
注意事项
- 调用时确保文件名包含
.pdf后缀,避免系统无法识别文件类型 - Android 9(API 28)及以下设备,需在Manifest中添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,并动态申请该权限 - Android 10(API 29)及以上无需申请存储权限,系统通过MediaStore自动处理存储访问
内容的提问来源于stack exchange,提问作者Waldmann
相关产品推荐
相关产品推荐

