亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android獲得所有存儲(chǔ)設(shè)備位置的最佳方法

 更新時(shí)間:2018年08月01日 11:21:54   作者:徒步青云  
今天小編就為大家分享一篇Android獲得所有存儲(chǔ)設(shè)備位置的最佳方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

本方式可以獲得內(nèi)部存儲(chǔ)設(shè)備地址、SD卡地址、USB設(shè)備地址,兼容性能達(dá)到99%(別問我為什么這么保證,因?yàn)槭墙梃b了Android設(shè)置->存儲(chǔ)頁(yè)面的源碼)。

由于調(diào)用了幾個(gè)被@hide的方法,所以采用了反射。

具體代碼如下:

public static List<HomeDirBean> getAllExternalStorage(Context context) {
  List<HomeDirBean> storagePath = new ArrayList<>();
  StorageManager storageManager = (StorageManager) context.getSystemService(STORAGE_SERVICE);
  StorageVolume[] storageVolumes;
  try {
   Method getVolumeList = StorageManager.class.getDeclaredMethod("getVolumeList");
   storageVolumes = (StorageVolume[]) getVolumeList.invoke(storageManager);
   Method getVolumeState = StorageManager.class.getDeclaredMethod("getVolumeState", String.class);
   for (StorageVolume storageVolume : storageVolumes) {
    String desc = storageVolume.getDescription(context);
    Log.i(TAG, "storageVolume name--->" + desc);
    Method getPath = StorageVolume.class.getMethod("getPath");
    String path = (String) getPath.invoke(storageVolume);
    Log.i(TAG, "StoragePath--->" + path);
    //這里需要用StorageManager反射調(diào)用getVolumeState函數(shù),而不應(yīng)該用StorageVolume的getState方法,因?yàn)榭赡軙?huì)報(bào)錯(cuò)
    String state = (String) getVolumeState.invoke(storageManager, path);
    Log.i(TAG, "storageVolume State--->" + state);
    if (Environment.MEDIA_MOUNTED.equals(state)) {
     HomeDirBean bean = new HomeDirBean(path, desc);
     storagePath.add(bean);
    }
   }
  } catch (Exception e) {
   Log.e(TAG, e.getMessage());
  }
  return storagePath;
 }

這里需要注意,可能有小伙伴會(huì)問,既然StorageVolume類有g(shù)etState方法,為啥還要用StorageManager反射調(diào)用getVolumeState方法,并傳入path地址,而在源碼里,StorageManager的getVolumeState的方法的實(shí)現(xiàn),也是將path重新創(chuàng)建為StorageVolume類,然后再調(diào)用其getState方法,我們這樣做成這不是多此一舉嗎?

源碼截圖如下:

答案當(dāng)然不是了,不然我也不會(huì)放棄性能去反射那個(gè)方法去裝這個(gè)逼了。主要原因是@hide的這個(gè)方法里,mountPoint被重新打包成StorageVolume時(shí),這相當(dāng)于系統(tǒng)去創(chuàng)建的一個(gè)StorageVolume實(shí)例,自然可以執(zhí)行它的所有方法。而如果是應(yīng)用直接調(diào)用,在被打包時(shí),很多方法被隱藏了,比如這個(gè)getState方法,這時(shí)候應(yīng)用就會(huì)報(bào)錯(cuò),找不到該方法。

先簡(jiǎn)單寫到這,以后有補(bǔ)充再添加。

以上這篇Android獲得所有存儲(chǔ)設(shè)備位置的最佳方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論