1. 程式人生 > >Android 裝置區分sdcard路徑和OTG路徑

Android 裝置區分sdcard路徑和OTG路徑

試了好多種辦法,拿不到行動硬碟的地址,最後通過反射得到。。。。

public void getDiskInfo() {
        StorageManager mstorageManager = (StorageManager) this.getApplicationContext().getSystemService(Context.STORAGE_SERVICE);
        try {
            //DiskInfo
            Class<?> diskIndoClass = Class.forName("android.os.storage.DiskInfo");
            Method isUsb = diskIndoClass.getMethod("isUsb");
            Method isSd = diskIndoClass.getMethod("isSd");

            //VolumeInfo
            Class<?> volumeClass = Class.forName("android.os.storage.VolumeInfo");
            Method volumeDisk = volumeClass.getMethod("getDisk");
            Method fsUuid = volumeClass.getMethod("getFsUuid");
            Method path = volumeClass.getMethod("getPath");

            Method getVolumes = StorageManager.class.getDeclaredMethod("getVolumes");
            List volumeInfoList = (List) getVolumes.invoke(mstorageManager);
            for(int i= 0 ;i<volumeInfoList.size();i++){
                //反射得到diskInfo,並判斷是不是usb
                if(volumeDisk.invoke(volumeInfoList.get(i)) != null && (boolean)isUsb.invoke(volumeDisk.invoke(volumeInfoList.get(i)))){
                    String path_usb = "mnt/media_rw/"+fsUuid.invoke(volumeInfoList.get(i));
                    Log.e("willie","usb path::"+path_usb);
//                    Log.e("willie","sdcard path_path::"+path.invoke(volumeInfoList.get(i)));
                    tv_msg.setText("usb:"+path_usb);
                    Log.e("willie","fsUuid::"+fsUuid.invoke(volumeInfoList.get(i)));
                } else if(volumeDisk.invoke(volumeInfoList.get(i)) != null && (boolean)isSd.invoke(volumeDisk.invoke(volumeInfoList.get(i)))){
                    String path_sdcard =""+path.invoke(volumeInfoList.get(i));
                    Log.e("willie","sdcard path::"+path_sdcard);
                    tv_msg1.setText("sdcard:"+path_sdcard);
                    Log.e("willie","fsUuid::"+fsUuid.invoke(volumeInfoList.get(i)));
                } else{
                    Log.e("willie","other::"+path.invoke(volumeInfoList.get(i)));
                }
            }

        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }