• Android为TV端助力 关于4.0之后不能直接获取SD卡外部存储路径的问题


    Environment.getExternalStorageDirectory()是Android 2.x时代的产物,那时Android主流设备只有很小的内置存储器,然后都会外置一张sd卡,那时这个方法返回的就是外置sd卡的根路径。

    但随着Android进入4.x时代,大部分Android设备都已经内置一个较大存储卡,甚至不提供外置存储卡插槽了,此时Environment.getExternalStorageDirectory()返回的路径其实是由内置存储卡虚拟出来的一个目录,用户在这一目录下有全部权限。

    按理说Android应该继续提供其他的方法来返回其他的外置存储卡的路径,但这一次Android却没有,因为Android系统开发者们发现之前直接允许程序任意访问sd卡的做法导致sd卡上垃圾文件的不可管理性,尤其在程序被卸载后,由于不知道那些文件是由这一程序创建的,所以无法关联删除,因此Android 4.0并不给程序开发者提供外置存储卡的路径,而是提供了诸如getExternalFilesDirs()和getExternalCacheDirs()这样的方法,直接给开发者提供一个限制内的存储文件的空间,这个空间是与程序关联的,因此在卸载程序时这两个目录下的文件也会被关联删除。

    闲话到此,主要是为了说明Android 4.0之后,系统不希望开发者直接访问sd卡,所以也没有提供查询多sd卡路径的方法(在2.x和3.x时代末期我们都以为4.0会提供这样的查询接口)。

    但是,Android系统不提供并不意味着就没有办法了,Android说到底还是Linux系统,因此外置sd卡必然是按照Linux的挂载方式挂载到系统中的。因此目前比较主流的方法就是绕过Android直接去读取Linux底层的挂载文件来找到系统中挂载的外置存储器。

    参考代码:(这个代码是从网上找的,跟我之前写的思路差不多,参考这个改改吧,其实不用这么复杂,返回一个Set或者List把所有路径都返回就好了)

    1.    /** 
    2.      * 获取外置SD卡路径 
    3.      * @return  应该就一条记录或空 
    4.      */  
    5.     public List<String> getExtSDCardPath()  
    6.     {  
    7.         List<String> lResult = new ArrayList<String>();  
    8.         try {  
    9.             Runtime rt = Runtime.getRuntime();  
    10.             Process proc = rt.exec("mount");  
    11.             InputStream is = proc.getInputStream();  
    12.             InputStreamReader isr = new InputStreamReader(is);  
    13.             BufferedReader br = new BufferedReader(isr);  
    14.             String line;  
    15.             while ((line = br.readLine()) != null) {  
    16.                 if (line.contains("extSdCard"))  
    17.                 {  
    18.                     String [] arr = line.split(" ");  
    19.                     String path = arr[1];  
    20.                     File file = new File(path);  
    21.                     if (file.isDirectory())  
    22.                     {  
    23.                         lResult.add(path);  
    24.                     }  
    25.                 }  
    26.             }  
    27.             isr.close();  
    28.         } catch (Exception e) {  
    29.         }  
    30.         return lResult;  
    31.     }  
  • 相关阅读:
    如何使用KeyChain保存和获取UDID
    ios 使用keychain来存储token
    关于button中设置文字不显示的问题
    实现uitable cell中点击button设置当前cell为选中状态
    setImageEdgeInsets 和 setImage配合使用达到button区域大并可调节其上图片显示区域大小的效果
    C#之Action的实际应用例子
    ConcurrentQueue队列的基本使用方式
    【转】C#中base关键字的几种用法
    C# Activator和new的区别
    C#回调浅析(委托、接口回调)
  • 原文地址:https://www.cnblogs.com/xiaoxiaing/p/6550557.html
Copyright © 2020-2023  润新知