代码之家  ›  专栏  ›  技术社区  ›  Viks

拯救Android Q上的txt文件

  •  0
  • Viks  · 技术社区  · 5 年前

    我试图用下面的代码保存文本文件

    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==空

    感谢您的帮助。 谢谢

    0 回复  |  直到 5 年前
        1
  •  1
  •   Sheikh Hasib    4 年前

    请查看此代码,它将允许您 保存文本文件 低于或高于 的版本 Android Q

    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();
    }