Android 5.0+删除Sdcard文件

简介:

在Android5.0往后的平台上,你想通过单纯的调用File.delete()或着ContentResolver.delete()来删除Sdcard上的文件会删除失败。前者提示没有权限,后者仅仅删除数据库文件对应的信息,但物理文件还存在,手机重启后MediaScanner会重新将其信息扫描进数据库。

那既然如此,有没有什么办法可以删除Sdcard上的文件呢?

root?

将apk放在system下?

这些都太小题大做了,下面介绍一个在非root情况下使用平台正规api删除sdcard文件的方法。

Documents

在Android平台中,提供了一个名为DocumenstProvider的内容提供者,当然要使用它就必需继承它。它的作用就是帮助开发者构件一棵Documents树,树的根节点及文件目录的根结点。底下的文件或文件夹就是这棵树的枝叶。说了这么多,我们来介绍一下今天的主角:ExternalStorageProvider,他是继承自DocumenstProvider的一个平台类,通过它我们就能间接的删除Sdcard上的文件了。

获取读写权限

final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);startActivityForResult(intent, 42);

首先通过上面的代码打开系统的DocumentsUI界面,并选择Sdcard的更目录,并点击确认,如下图:
device-2016-05-05-155754.png

device-2016-05-05-155811.png

接着在onActivityResult中获取sdcard在ExternalStorageProvider中对应的uri

 Uri data = intent.getData();//data:content://com.android.externalstorage.documents/tree/0C3D-8650%3A

其中0C3D-8650%3A为sdcard的唯一标示符,也可看作ID,我们这里记作SDCARD_UUID,并且把上面的Uri data记作SDCARD_URI

接下来获取读写权限:

getContentResolver().takePersistableUriPermission(data,Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

到这里我们已经拿到删除Sdcard文件的权限了,接下来就是怎么去删了。

删除文件

//SDCARD_URI上面获得的//SDCARD_UUID也是上面获得的//filePath为文件在Sdcard下的相对路径Uri uri = DocumentsContract.buildDocumentUriUsingTree(SDCARD_URI, SDCARD_UUID + ":" + filePath);
DocumentsContract.deleteDocument(mContentResolver, uri);

OK,Sdcard的文件工程删除。



本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1928054,如需转载请自行联系原作者

相关文章
|
Java API Android开发
【错误记录】Android 注解处理器报错 ( 非法的类文件开始 , 请删除该文件或确保该文件位于正确的类路径子目录中。 )
【错误记录】Android 注解处理器报错 ( 非法的类文件开始 , 请删除该文件或确保该文件位于正确的类路径子目录中。 )
700 0
【错误记录】Android 注解处理器报错 ( 非法的类文件开始 , 请删除该文件或确保该文件位于正确的类路径子目录中。 )
|
XML JSON Java
Android RecyclerVIew 列表实现 编辑、单选、全选、删除、动画效果(附源码)
Android RecyclerVIew 列表实现 编辑、单选、全选、删除、动画效果(附源码)
520 0
Android RecyclerVIew 列表实现 编辑、单选、全选、删除、动画效果(附源码)
|
Android开发 数据安全/隐私保护
Android带有删除按钮的EditText:EditTextWithDeleteButton
 Android带有删除按钮的EditText:EditTextWithDeleteButton 在现在常见的APP涉及到用户输入时候(输入用户名、密码、账号信息等等)的输入框时候,虽然这是一个典型的Android EditText,但是考虑到用户时常输入可能产生错误,进而需要清掉刚才输入的内容,继而进行一次全新的输入,因此,众多的APP设计时候,通常会在EditText输入框的右边加上一个叉子按钮,为用户提供删除输入内容的便捷入口。
916 0
|
Java 开发工具 Android开发
Android Studio运行报错:无法访问XXX......请删除该文件或确保该文件位于正确的类路径子目录中
今天运行一个项目发现运行不起来了,报错 错误: 无法访问XXX 错误的类文件: C:\Users\xxx\.gradle\caches\transforms-2\files-2.1\xxx\xxx(xxx/xxx/xxx.class) 错误的 RuntimeInvisibleParameterAnnotations 属性: xxxx 请删除该文件或确保该文件位于正确的类路径子目录中。
1458 0
|
存储 测试技术 文件存储
【Android 文件管理】分区存储 ( 修改与删除图片文件 )(二)
【Android 文件管理】分区存储 ( 修改与删除图片文件 )(二)
326 0
【Android 文件管理】分区存储 ( 修改与删除图片文件 )(二)
|
存储 数据库 Android开发
【Android 文件管理】分区存储 ( 修改与删除图片文件 )(一)
【Android 文件管理】分区存储 ( 修改与删除图片文件 )(一)
249 0
【Android 文件管理】分区存储 ( 修改与删除图片文件 )(一)
|
Java Android开发
Android studio自动删除没有用到的包
Android studio自动删除没有用到的包
139 0
Android studio自动删除没有用到的包
|
Android开发
Android RecyclerView单点、批量数据元素项目item的增加、删除和移动
Android RecyclerView单点、批量数据元素项目item的增加、删除和移动 前文附录1,2介绍了基本的Android RecyclerView单点、批量元素项目的更新。
1948 0