关于如何在SD卡(
android 5及以上版本)中编写(和重命名)文件的大量调查结果后,我认为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权限.
解决方法
让用户选择“SD卡”甚至“内部存储”SAF根目录,使您的应用程序可以访问相应的存储,但只能通过SAF API,而不能直接通过文件系统.例如,您可以将代码翻译成以下内容:
public void writeFile(DocumentFile pickedDir) { try { DocumentFile file = pickedDir.createFile("image/jpeg","try2.jpg"); OutputStream out = getContentResolver().openOutputStream(file.getUri()); try { // write the image content } finally { out.close(); } } catch (IOException e) { throw new RuntimeException("Something went wrong : " + e.getMessage(),e); } }
在最新版本的Android中,使用java.io.File访问应用程序外部的数据几乎完全被弃用.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。