Android通過反射調(diào)用獲取內(nèi)置存儲和外置sd卡根路徑(全版本適配)

model如下,功能一目了然:

public class FileInfo {
    // id value in DB
    public long id;
    // true if file is a directory
    public boolean isDir;
    // true if file is hidden
    public boolean isHidden;
    // full name of the file
    public String fileName;
    // the path which the file in
    public String filePath;
    // file size in bytes
    public long fileSize;
    // last modified timestamp
    public long modifiedTimeMillis;
    // icon (adoptable)
    public Drawable icon;
    public boolean hasThumb;
    //if isDir is true, get file count in this dir
    public int fileCount;
    //resolution of pictures
    public int height = 0;
    public int width = 0;

    public static FileInfo createInfo(File file, final boolean includeHidden) {
        FileInfo info = new FileInfo();
        if (file == null) {
            return info;
        }
        try {
            info.filePath = file.getCanonicalPath();
        } catch (IOException e) {
            e.printStackTrace();
            info.filePath = file.getAbsolutePath();
        }
        info.fileName = file.getName();
        info.fileSize = file.length();
        info.modifiedTimeMillis = file.lastModified();
        info.isDir = file.isDirectory();
        info.isHidden = file.isHidden();
        info.fileCount = 0;
        if (info.isDir) {
            File[] list = file.listFiles(new FilenameFilter() {
                @Override
                public boolean accept(File dir, String filename) {
                    if (!includeHidden && filename.startsWith(".")) {
                        return false;
                    }
                    return true;
                }
            });
            if (list != null) {
                info.fileCount = list.length;
            }
        } else {
            info.hasThumb = ThumbUtils.getThumbnailType(file) != null;
        }
        return info;
    }
}

獲取內(nèi)外置存儲卡,OTG路徑的方法(使用反射):

private List<FileInfo> goGetStorages() {
        List<FileInfo> list = new ArrayList<>();
        StorageManager sm = (StorageManager) mApplication.getSystemService(Context.STORAGE_SERVICE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Class<?> klass = StorageVolume.class;
            try {
                Method method = klass.getMethod("getPathFile");
                List<StorageVolume> volumes = sm.getStorageVolumes();
                for (StorageVolume volume : volumes) {
                    FileInfo info = FileInfo.createInfo((File) method.invoke(volume), true);
                    info.fileName = volume.getDescription(mApplication);
                    list.add(info);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            try {
                Class<?> klass = StorageManager.class;
                Method method = klass.getMethod("getVolumePaths");
                String[] paths = (String[]) method.invoke(sm);
                if (paths != null) {
                    for (String path : paths) {
                        list.add(FileInfo.createInfo(new File(path), true));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return list;
    }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容