问题描述
我花了很多时间,但在将文件写入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();
}
}
}