zoukankan      html  css  js  c++  java
  • 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.     }  
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
  • 原文地址:https://www.cnblogs.com/xiaoxiaing/p/6550557.html
Copyright © 2011-2022 走看看