【问题标题】:Save .txt file on Android Q在 Android Q 上保存 .txt 文件
【发布时间】:2020-09-11 00:40:27
【问题描述】:

我正在尝试使用以下代码保存文本文件

try {
                FileOutputStream fos = new FileOutputStream(TXT_FILE_NAME, true);

                FileWriter fWriter;

                try {
                    fWriter = new FileWriter(fos.getFD());
                    fWriter.write(binding.tvExtractedResult.getText().toString());
                    fWriter.close();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    fos.getFD().sync();
                    fos.close();
                    Toast.makeText(this, "File Saved Successfully", Toast.LENGTH_LONG).show();
                }
            } catch (Exception e) {
                Toast.makeText(this, "Error while saving file", Toast.LENGTH_LONG).show();
                e.printStackTrace();
            }

但问题是此代码不适用于 Android Q。 在此之后,我尝试搜索解决方案并做到了这一点

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            ContentValues myContentValues = new ContentValues();
            myContentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, TXT_FILE_NAME);
            String myFolder = "Download/MY_PROJECT";
            myContentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, myFolder);
            myContentValues.put(MediaStore.MediaColumns.MIME_TYPE, "text/plain");
            myContentValues.put(MediaStore.MediaColumns.IS_PENDING, 1);

            Uri extVolumeUri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL);

            ContentResolver contentResolver = getContentResolver();
            Uri uri = contentResolver.insert(extVolumeUri, myContentValues);

            if (uri == null) {
                Log.e(TAG, "uri is null");
                return;
            }
            Log.e(TAG, "uri=" + uri);

            try {
                FileOutputStream fos = new FileOutputStream(new File(uri.toString()));

                fos.write(binding.tvExtractedResult.getText().toString().getBytes());
                fos.close();
            } catch (Exception e) {
                Log.e(TAG, "error occurred" + e.getMessage());
                e.printStackTrace();
            } finally {
                myContentValues.clear();
                myContentValues.put(MediaStore.MediaColumns.IS_PENDING, 0);
                contentResolver.update(uri, myContentValues, null, null);
            }

        }

在上面的代码中,我得到 uri == null

感谢您的帮助。 谢谢。

【问题讨论】:

  • 你在 Manifest 中添加了 android:requestLegacyExternalStorage = true 吗?
  • 同样的问题,即使 equestLegacyExternalStorage 始终为空

标签: android android-sdcard android-10.0


【解决方案1】:

请看一下这段代码,它将允许您保存文本文件 低于和更高版本 Android Q。。 p>

public static void saveFile(Context context, String fileName, String text, String extension) throws IOException{
    OutputStream outputStream;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

        ContentValues values = new ContentValues();

        values.put(MediaStore.MediaColumns.DISPLAY_NAME, fileName + extension);   // file name
        values.put(MediaStore.MediaColumns.MIME_TYPE, "text/plain");
        values.put(MediaStore.MediaColumns.RELATIVE_PATH, DIRECTORY);

        Uri extVolumeUri = MediaStore.Files.getContentUri("external");
        Uri fileUri = context.getContentResolver().insert(extVolumeUri, values);

        outputStream = context.getContentResolver().openOutputStream(fileUri);
    }
    else {
        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).toString() + FOLDER_NAME;
        File file = new File(path, fileName + extension);
        Log.d(TAG, "saveFile: file path - " + file.getAbsolutePath());
        outputStream = new FileOutputStream(file);
    }

    byte[] bytes = text.getBytes();
    outputStream.write(bytes);
    outputStream.close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多