zoukankan      html  css  js  c++  java
  • 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的更目录,并点击确认,如下图:

    接着在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是否存在判断,提示用户做出正确的选择等。

  • 相关阅读:
    文档中心 FetchURL Sina App Engine
    GroovyHelp使用指南 蛟龍居 BlogJava
    北京个人ADSL和企业ADSL有什么区别啊?
    手动编译cppserv0.1.99 @ apache2.2
    漫谈Web Service工作原理及.NET平台的实现机制
    Servlet与模板模式那些事
    [跟着hsp步步学习系统]oracle培训学习集锦全360度扫描(5)
    诺基亚死于大数据时代 上海唯一旗舰店关门
    苹果iPad强于分销渠道:平板领域将继续强势
    用友放弃野蛮生长战略 转型平台软件商
  • 原文地址:https://www.cnblogs.com/zqlxtt/p/5462383.html
Copyright © 2011-2022 走看看