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

來源:互聯網
上載者:User

標籤: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());        }    }}

記得添加許可權:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

小辣椒4.4.4:

華為6.0:

發現外置SD卡路徑不一致,只怪手機廠商喜歡瞎折騰疼自以為創新。得到路徑以後就可以像手機內建的檔案系統瀏覽器一樣將手機所有檔案列出來。
不管是內建SD卡還是外置SD卡其實都是手機的外部儲存,手機的內部儲存和外部儲存共用同一個裝置。
內部儲存路徑:

所有安裝至手機的應用都會在data/data目錄下產生一個包名檔案夾,這個檔案夾就是內部儲存的路徑
應用只能在自己的包名檔案夾中讀寫檔案
使用路徑api讀寫檔案
getFilesDir()得到的file對象的路徑是data/data/包名/files
存放在這個路徑下的檔案,只要你不刪,它就一直在
getCacheDir()得到的file對象的路徑是data/data/包名/cache

存放在這個路徑下的檔案,是快取檔案,當記憶體不足時,有可能被刪除
系統管理應用介面的清除緩衝,會清除cache檔案夾下的東西,清除資料,會清除整個包名目錄下的東西

參考:Android 儲存

GitHub

CSDN

簡書

公眾號

QQ群

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.