经过一番探索,我发现在Android 5及以上版本中如何写入(和重命名)SD卡文件,我认为需要使用Android提供的新SAF来获取用户写入SD卡文件的权限。
我在这个文件管理应用程序ES文件浏览器中看到,最初它以以下方式获取读写权限,如图片所示。
选择SD卡后,将授予写入权限。
所以我尝试使用SAF,但在重命名文件时失败了。我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rename = (Button) findViewById(R.id.rename);
startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), 42);
}
@Override
public void onActivityResult(int requestCode,int resultCode,Intent resultData) {
if (resultCode != RESULT_OK)
return;
Uri treeUri = resultData.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
grantUriPermission(getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
public void renameclick(View v) {
File ff = new File("/storage/sdcard1/try1.jpg");
try {
ff.createNewFile();
} catch (Exception e) {
Log.d("error", "creating");
e.printStackTrace();
}
}
尽管我已经运行了代码,但仍然收到EAacces权限被拒绝的提示。
takePersistableUriPermission()
并将URI存储在某个地方,以便在应用程序启动时检索它,就无需每次询问用户。 - bwtcreateFile
只接受MimeType
和名称作为参数的情况下访问所选目录的子目录?我们如何将java.io.file
类型的路径转换为DocumentFile
? - EftekhariDocumentFile pickedTree = DocumentFile.fromFile(App.getContext(), uriTree); for (DocumentFile file : pickedTree.listFiles()) { if (file.isDirectory()) file.createFile(mimeType, fileName); }
意思是从uriTree
创建一个DocumentFile
对象,然后遍历该对象下的所有文件和文件夹。如果当前项是一个文件夹,则创建一个新的文件,并以mimeType
和fileName
命名。 - Ruslan Berozov