在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的更目录,并点击确认,如下图:

接着在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的文件工程删除。

这里我只是提供一个大概的流程,真正需要用到实际项目中的话这些代码还有待润色。需要做平台判断,Sdcard是否存在判断,提示用户做出正确的选择等。

Android 5.0+删除Sdcard文件的更多相关文章

  1. Android 7.0 之后相机/文件读写等权限获取方式改变,导致开启相机闪退

    在 Android 7.0 之前 Google 提供的动态申请权限的 API,可以调用相机拍照,访问SDcard等操作都只需要申请对应的权限,如下: <uses-permission andro ...

  2. Android创建或删除了文件,在电脑端查看的时候,却没有对应的变化,处理办法

    在Android应用中,碰到一个问题,在代码中执行创建或者删除某个文件后,在系统的文件管理器中能够相应地看到文件的变化,但是插在电脑上查看的时候,却看不到改文件的变化.同时,当创建文件后,在系统中的某 ...

  3. Android 6.0删除Apache HttpClient相关类的解决方法

    相应的官方文档如下: 上面文档的大致意思是,在Android 6.0(API 23)中,Google已经移除了Apache HttpClient相关的类,推荐使用HttpUrlConnection. ...

  4. 「NetworkOnMainThreadException」:Android 2.3到Android 4.0上传文件的问题

    我在百度知道上的提问: 『之前我用的一段文件上传的代码,配合服务器端的servlet,实现了上传手机上的文件的功能:但是后来我把手机的Android系统从2.3升级到了4.0 ,同样的代码,同样的配置 ...

  5. Android数据存储之Android 6.0运行时权限下文件存储的思考

    前言: 在我们做App开发的过程中基本上都会用到文件存储,所以文件存储对于我们来说是相当熟悉了,不过自从Android 6.0发布之后,基于运行时权限机制访问外置sdcard是需要动态申请权限,所以以 ...

  6. 使用 VirtualBox 虚拟机在电脑上运行 Android 4.0 系统,让电脑瞬间变安卓平板

    Ref: http://www.iplaysoft.com/android-v4-ics-for-virtualbox.html 随着 Android 手机的各种软件应用越来越多,很多没有购买的朋友都 ...

  7. Android 7.0 PopupWindow 的兼容问题

    Android7.0 PopupWindow的兼容问题    Android7.0 中对 PopupWindow 这个常用的控件又做了一些改动,修复了以前遗留的一些问题的同时貌似又引入了一些问题,本文 ...

  8. Android 9.0/P 开发问题及解决方案汇总

    一.使用 org.apache.http.legacy 库在Android 9.0上运行出现崩溃 日志内容: java.lang.NoClassDefFoundError: Failed resolu ...

  9. Android 7.0 PopupWindow 又引入新的问题,Google工程师也不够仔细么

    Android7.0 PopupWindow的兼容问题   Android7.0 中对 PopupWindow 这个常用的控件又做了一些改动,修复了以前遗留的一些问题的同时貌似又引入了一些问题,本文通 ...

随机推荐

  1. jQuery事件:bind、delegate、on的区别

    最近在AngularJS的开发中,遇到一个神奇的事情:我们用到livebox来预览评论列表中的图片, 然而评论列表是由Angular Resource动态载入的.不可思议的是,点击这些动态载入的图片仍 ...

  2. HotSpot模板解释器目标代码生成过程源码分析

    虽然说解释执行模式是逐字逐句翻译给目标平台运行的,但这样的过程未免太过缓慢,如果能把字节码说的话做成纸条,运行时只要把对应的纸条交给目标平台就可以了,这样,执行速度就会明显提升.JVM的Hotspot ...

  3. Python处理文件以及文件夹常用方法

    1.创建文件并且写入 2.多行读取文件的方式 readlines() 3.一次读取全部内容 4.文件的删除 5.shutil 模块实现文件的复制 6.文件的重命名 7.获取文件的后缀名 8.pytho ...

  4. Spring--初始化IOC容器的几种方式

    初始化beanfactory主要有以下的三种方式:    1.filesystemXml Resource resource = new FileSystemResource("beans. ...

  5. oracle 显示格式化

    sqlplus中:set wrap off; set pagesize 1000; set linesize 1000; col id format A20; //该字段最长显示20个字符 col n ...

  6. lnmp服务器的目录信息

    LNMP状态管理命令: LNMP状态管理: /root/lnmp {start|stop|reload|restart|kill|status}Nginx状态管理:/etc/init.d/nginx ...

  7. 三种CSS方法实现loadingh点点点的效果

    我们在提交数据的时候,在开始提交数据与数据提交成功之间会有一段时间间隔,为了有更好的用户体验,我们可以在这个时间段添加一个那处点点点的动画,如下图所示: 汇总了一下实现这种效果主要有三种方法: 第一种 ...

  8. [velocity] velocity详解

    (1)为什么要使用模版语言? 在服务器端可以使用 Velocity 处理模板和生成的动态内容(HTML.XML等).这和 JSP 技术的目标非常接近.但是,JSP 模型可以毫无阻碍地访问底层的 Ser ...

  9. Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试。

    Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试. 它是一个典型的教科书式的mvc ...

  10. (转)directx中丢失的设备(lost device)

      directx中丢失的设备(lost device) 丢失的设备 一个Microsoft? Direct3D?可以处于操作状态或丢失状态.操作状态是设备的正常状态,设备按预期运行并present所 ...