Android는 반사 호출을 통해 내장 저장소와 외장 sd 카드 루트 경로를 가져옵니다. (각 버전에 적용)

1818 단어
최근 프로젝트를 진행하면서 핸드폰 메모리와 메모리를 얻는 수요가 생겨서 여러 가지 방법이 마음에 들지 않았다. 핸드폰 메모리는 정상적으로 얻을 수 있지만 SD카드를 받을 때 경로, 권한 등 여러 가지 문제가 있었다.나중에 다방면으로 조회하여 마침내 블로그 한 편을 찾았는데, 써 보니 그래도 수요를 만족시켰다.링크를 올리려면 다음과 같이 하십시오.
https://blog.csdn.net/bit_kaki/article/details/69950910
다음은 원문 방법: 핵심은 메모리 관리자를 얻은 다음에 invoke로 모든 경로를 얻은 다음에 제거 가능(SD카드는 제거 가능, 메모리는 안 됨)에 따라 다른 경로를 얻는 것이다.구체적인 방법은 다음과 같습니다.
    /**
    *                sd    (  )
    *
    * @param mContext       
     * @param is_removale      ,false      ,true  
      sd 
    * @return
     */
 private static String getStoragePath(Context mContext, boolean 
 is_removale) {

 StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
 Class> storageVolumeClazz = null;
try {
    storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
    Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
    Method getPath = storageVolumeClazz.getMethod("getPath");
    Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
    Object result = getVolumeList.invoke(mStorageManager);
    final int length = Array.getLength(result);
    for (int i = 0; i < length; i++) {
        Object storageVolumeElement = Array.get(result, i);
        String path = (String) getPath.invoke(storageVolumeElement);
        boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
        if (is_removale == removable) {
            return path;
        }
    }
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
}
return null;
 }

좋은 웹페이지 즐겨찾기