如何在Android 11上将文件写入共享位置?

问题描述

我花了很多时间,但在将文件写入Android 11上的共享存储(例如下载)时仍然遇到问题。我尝试使用OS文件选择器并获取Uri,但随后没有机会创建包含内容文件。我总是收到找不到文件的异常“打开失败:ENOENT(没有这样的文件或目录)”。 尝试使用内容解析器,但未成功。有没有人有简短的Java示例,当您拥有Uri时如何创建带有某些内容的txt或pdf文件

 @Override
   protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

 Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
                    intent.addCategory(Intent.CATEGORY_OPENABLE);
                    intent.setType("application/pdf");
                    intent.putExtra(Intent.EXTRA_TITLE,"test.pdf");

                    startActivityForResult(intent,33333);
}



@Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data) {
        super.onActivityResult(requestCode,resultCode,data);

    if (requestCode == 33333 && resultCode == RESULT_OK) {
            // The result data contains a URI for the document or directory that
            // the user selected.
            Uri uri = null;
            if (data != null) {
                uri = data.getData();
                // Perform operations on the document using its URI.
                saveFile(uri);
              }

      }
}

private void saveFile(Uri sourceuri)
    {
        try {
            FileOutputStream f = new FileOutputStream(sourceuri.getPath());
            f.write(content.getBytes());
            f.close();
        }

        catch (IOException ex) {
            //result = "Error code 011: " + ex.toString();
            Log.e("SIGNAL",ex.toString());
        }

    }

解决方法

我将您的代码粘贴到活动中,然后找出解决方案。

我在Emulator API 30(Android 11)中测试此代码,并在下载文件夹中创建文件test.pdf。而且我注意到,在没有征得任何许可的情况下,它会在我的存储设备中创建文件。?

private void saveFile(Uri sourceuri) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
        try {
            InputStream inputStream = getContentResolver().openInputStream(sourceuri);
            OutputStream outputStream = getContentResolver().openOutputStream(sourceuri);

            // get the content in bytes
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
            byte[] byteArray = new byte[1024];
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            try {
                byte bytes = (byte) bufferedInputStream.read(byteArray);
                if (bytes >= 0) {
                    bufferedOutputStream.write(byteArray,bytes);
                    bufferedOutputStream.flush();
                }
                inputStream.close();
                outputStream.close();
                bufferedOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}