天天看點

Android判斷是否存在外置SD卡(擷取手機所有儲存設備的路徑)

擷取手機裡所有儲存設備盤符,首先需要得到挂載在手機上的有哪些盤符,這裡需要用到一個被系統隐藏的方法,
    即StorageManager下的getVolumePaths()方法。具體通過反射得到。
    方法傳回值為字元串數組,
    getVolumeList傳回所有相關資訊
     StorageVolume:
                   mStorageId=131073
                   mPath=/storage/external //盤符(路徑)
                   mDescriptionId=17040902
                   mPrimary=false
                   mRemovable=true //是否可解除安裝,内置SD卡無法解除安裝,外置SD卡可以解除安裝,據此可判斷是否存在外置SD卡,
                                   //這樣在某些APP中可以将某些資料優先存儲到外置SD卡,優化存儲空間資源的配置設定。如相機
                   mEmulated=false //是否是内置SD卡
                   mMtpReserveSpace=0
                   mAllowMassStorage=true
                   mMaxFileSize=0
                   mOwner=null
                   mUuid=4041-5DA0
                   mUserLabel=null
                   mState=mounted //是否已載入(可用)
    
           
public class StorageUtils {
    

    /*
    擷取全部儲存設備資訊封裝對象
     */
    public static ArrayList<Volume> getVolume(Context context) {
        ArrayList<Volume> list_storagevolume = new ArrayList<Volume>();

        StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);

        try {
            Method method_volumeList = StorageManager.class.getMethod("getVolumeList");

            method_volumeList.setAccessible(true);

            Object[] volumeList = (Object[]) method_volumeList.invoke(storageManager);
            if (volumeList != null) {
                Volume volume;
                for (int i = 0; i < volumeList.length; i++) {
                    try {
                        volume = new Volume();
                        volume.setPath((String) volumeList[i].getClass().getMethod("getPath").invoke(volumeList[i]));
                        volume.setRemovable((boolean) volumeList[i].getClass().getMethod("isRemovable").invoke(volumeList[i]));
                        volume.setState((String) volumeList[i].getClass().getMethod("getState").invoke(volumeList[i]));
                        list_storagevolume.add(volume);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (NoSuchMethodException e) {
                        e.printStackTrace();
                    }

                }
            } else {
                Log.e("null", "null-------------------------------------");
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }

        return list_storagevolume;
    }

   

    /*
     儲存設備資訊封裝類
     */
    public static class Volume {
        protected String path;
        protected boolean removable;
        protected String state;

        public String getPath() {
            return path;
        }

        public void setPath(String path) {
            this.path = path;
        }

        public boolean isRemovable() {
            return removable;
        }

        public void setRemovable(boolean removable) {
            this.removable = removable;
        }

        public String getState() {
            return state;
        }

        public void setState(String state) {
            this.state = state;
        }
    }
}

           
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ArrayList<StorageUtils.Volume> list_volume = StorageUtils.getVolume(this);
        for (int i=0;i<list_volume.size();i++){
            Log.e(i+"","path:"+list_volume.get(i).getPath()+"----"+
                        "removable:"+list_volume.get(i).isRemovable()+"---"+
                        "state:"+list_volume.get(i).getState());
        }
    }
}
           

記得添權重限:

小辣椒4.4.4:

Android判斷是否存在外置SD卡(擷取手機所有儲存設備的路徑)

華為6.0:

Android判斷是否存在外置SD卡(擷取手機所有儲存設備的路徑)

發現外置SD卡路徑不一緻,隻怪手機廠商喜歡瞎折騰疼自以為創新。得到路徑以後就可以像手機自帶的檔案系統浏覽器一樣将手機所有檔案列出來。

不管是内置SD卡還是外置SD卡其實都是手機的外部存儲,手機的内部存儲和外部存儲共享同一個裝置。

内部存儲路徑:

所有安裝至手機的應用都會在data/data目錄下生成一個包名檔案夾,這個檔案夾就是内部存儲的路徑

應用隻能在自己的包名檔案夾中讀寫檔案

使用路徑api讀寫檔案

getFilesDir()得到的file對象的路徑是data/data/包名/files

存放在這個路徑下的檔案,隻要你不删,它就一直在

getCacheDir()得到的file對象的路徑是data/data/包名/cache

存放在這個路徑下的檔案,是緩存檔案,當記憶體不足時,有可能被删除

系統管理應用界面的清除緩存,會清除cache檔案夾下的東西,清除資料,會清除整個包名目錄下的東西

參考:Android 存儲

歡迎聯系、指正、批評

Github:https://github.com/AnJiaoDe

CSDN:https://blog.csdn.net/confusing_awakening

OpenCV入門教程:https://blog.csdn.net/confusing_awakening/article/details/113372425

ffmpeg入門教程:https://blog.csdn.net/confusing_awakening/article/details/102007792

微信公衆号

Android判斷是否存在外置SD卡(擷取手機所有儲存設備的路徑)

QQ群

Android判斷是否存在外置SD卡(擷取手機所有儲存設備的路徑)