遇到Scoped Storage问题:如何用Java在应用目录写入纯文本文件?
API 30 Scoped Storage 应用目录写入纯文本文件适配方案
核心适配逻辑说明
针对应用专属目录(内部/外部存储下归属应用的私有目录,卸载应用时同步删除),API 30+ 仍然支持直接使用FileWriter操作,仅需修改路径获取方式,无需申请任何存储权限。如果你的原有逻辑是硬编码公共存储路径,替换为Context提供的专属目录API即可完成适配。
专属目录写入Java实现示例
import android.content.Context; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class AppDirFileWriter { /** * 写入纯文本到应用内部存储专属目录 * @param fileName 目标文件名 * @param content 待写入的文本内容 * @return 写入是否成功 */ public boolean writeToInternalDir(Context context, String fileName, String content) { // 获取内部存储专属目录路径,无需权限 File targetFile = new File(context.getFilesDir(), fileName); return writeFile(targetFile, content); } /** * 写入纯文本到应用外部存储专属目录 * @param fileName 目标文件名 * @param content 待写入的文本内容 * @return 写入是否成功 */ public boolean writeToExternalDir(Context context, String fileName, String content) { // 获取外部存储专属目录路径,API 19+无需权限 File externalDir = context.getExternalFilesDir(null); if (externalDir == null) { // 外部存储不可用 return false; } File targetFile = new File(externalDir, fileName); return writeFile(targetFile, content); } private boolean writeFile(File targetFile, String content) { FileWriter fileWriter = null; try { fileWriter = new FileWriter(targetFile); fileWriter.write(content); fileWriter.flush(); return true; } catch (IOException e) { e.printStackTrace(); return false; } finally { if (fileWriter != null) { try { fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
公共目录写入可选方案
如果需要将文件保存到公共目录(如下载、文档目录,卸载应用不删除),需使用MediaStore API实现,示例如下:
import android.content.ContentValues; import android.content.Context; import android.os.Build; import android.os.Environment; import android.provider.MediaStore; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; public class PublicDirFileWriter { public boolean writeToPublicDownload(Context context, String fileName, String content) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { // 低于Android 10可申请存储权限后用原FileWriter逻辑实现 return false; } ContentValues contentValues = new ContentValues(); contentValues.put(MediaStore.Downloads.DISPLAY_NAME, fileName); contentValues.put(MediaStore.Downloads.MIME_TYPE, "text/plain"); contentValues.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS); try { OutputStream outputStream = context.getContentResolver().openOutputStream( context.getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, contentValues) ); if (outputStream == null) return false; OutputStreamWriter writer = new OutputStreamWriter(outputStream); writer.write(content); writer.flush(); writer.close(); outputStream.close(); return true; } catch (IOException e) { e.printStackTrace(); return false; } } }
内容的提问来源于stack exchange,提问作者Pink Jazz
相关产品推荐
相关产品推荐

