关闭

Android 使用反射调用StorageManager中 Hide方法getVolumeList、getVolumeState

标签: android反射
790人阅读 评论(1) 收藏 举报
分类:

Environment.getExternalStorageDirectory()不可用来判断内、外置存储

判断Android系统是内置还是外置存储,使用Environment.getExternalStorageDirectory()
接口是不能判断出来的,因为有的机器上该方法返回的是内置存储路径。

使用android.os.storage.StorageManager的getVolumeList方法

getVolumeList方法源码如下:

Returns list of all mountable volumes.
Hide:
568
569    public StorageVolume[] More ...getVolumeList() {
570        if (mMountService == null) return new StorageVolume[0];
571        try {
572            Parcelable[] list = mMountService.getVolumeList();
573            if (list == null) return new StorageVolume[0];
574            int length = list.length;
575            StorageVolume[] result = new StorageVolume[length];
576            for (int i = 0; i < length; i++) {
577                result[i] = (StorageVolume)list[i];
578            }
579            return result;
580        } catch (RemoteException e) {
581            Log.e(TAG, "Failed to get volume list", e);
582            return null;
583        }
584    }

使用反射调用getVolumeList()

从getVolumeList源码可知,该方法为Hide方法,对外不可见,所以需要使用反射调用。
反射调用代码

public static StorageVolume[] getVolumeList(StorageManager storageManager){
        try {
            Class clz = StorageManager.class;
            Method getVolumeList = clz.getMethod("getVolumeList", null);
            StorageVolume[] result = (StorageVolume[]) getVolumeList.invoke(storageManager, null);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

使用反射调用getVolumeState()

getVolumeState()源码如下:

Gets the state of a volume via its mountpoint.
Hide:
554
555    public String More ...getVolumeState(String mountPoint) {
556         if (mMountService == null) return Environment.MEDIA_REMOVED;
557        try {
558            return mMountService.getVolumeState(mountPoint);
559        } catch (RemoteException e) {
560            Log.e(TAG, "Failed to get volume state", e);
561            return null;
562        }
563    }

反射调用代码

public static String getVolumeState(StorageManager storageManager, String path){
        String result = "";
        if(null == storageManager || TextUtils.isEmpty(path)){
            return result;
        }
        try {
            Class clz = StorageManager.class;
            Method getVolumeList = clz.getMethod("getVolumeState", String.class);
            result = (String) getVolumeList.invoke(storageManager, path);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

StorageVolume这个类中提供了一个isRemovable()接口,可以移除的就是外置存储,不可移除的是内置存储。

1
0
查看评论

Android获得所有存储设备位置最佳方式

本方式可以获得内部存储设备地址、SD卡地址、USB设备地址,兼容性能达到99%(别问我为什么这么保证,因为是借鉴了Android设置->存储页面的源码)。 由于调用了几个被@hide的方法,所以采用了反射。具体代码如下: public static List getAllExternalS...
  • baidu_28136669
  • baidu_28136669
  • 2017-03-08 18:17
  • 1868

Android学习——利用反射调用@Hide隐藏函数

2014-02-27 导语:本意想在代码中实现设置动态壁纸的功能。 正文: 1、查看Android源码WallpaperManager.java中有个方法 /** @hide */ public IWallpaperManager getIWallpaperManager() { ...
  • You_and_Me12
  • You_and_Me12
  • 2014-02-27 15:17
  • 11516

Android:利用Java反射调用@hide的API

设置使用3G数据功能: 从源代码看到隐藏的API(ConnectivityManager.java): /** * Sets the persisted value for enabling/disabling Mobile data. * * @param ...
  • annkie
  • annkie
  • 2013-01-04 23:11
  • 9372

获取Android设备上的所有存储设备

Android系统提供了Environment.getExternalStorageDirectory()接口获得存储设备的路径,但是这个接口往往给出的结果并不是我们想要的,在某些设备上它返回的是手机内部存储,某些设备上返回的手机外部存储。还有就是某些Android设备支持扩展多个sdcard,这个...
  • wangsf1112
  • wangsf1112
  • 2016-05-16 18:08
  • 3291

android 如何引用@hide(隐藏)的类,方法和常量?

最近在处理SD卡的读写问题,本地Elipse能跑的程序提交到服务器上的时候,报错,找不到import的类,还有一些方法也是找不到,利用sourceInsight搜了源码发现都是用了@hide标记的类和方法。 /** * Description of a storage volume and it...
  • lisineng
  • lisineng
  • 2015-03-20 17:26
  • 5105

Android开发之通过反射获取到Android隐藏的方法

感恩原创:http://www.cnblogs.com/liyiran/p/5296756.html在PackageManger中,有些方法被隐藏了,无法直接调用,需要使用反射来获取到该方法。比如方法:getPackageSizeInfo(),通过这个方法可以获取到apk的CacheSize,Cod...
  • qq_34329508
  • qq_34329508
  • 2017-08-19 09:57
  • 127

利用反射调用android隐藏函数getVolumePaths

今天做工程时遇到这么一个问题: 手机有2张储存卡,如何获取两张卡的路径,便于寻找某个文件呢? 参考了一些文档,得到以下信息: 1、各种android设备的存储器路径,是不一样的.比如T卡路径,可能是/mnt/sdcard、/mnt/extsd、/mnt/external_sd或者/mn...
  • LilySea2012
  • LilySea2012
  • 2013-11-26 17:05
  • 5041

在android apk中调用@hide方法

在android应用开发过程中我们经常会遇到不能使用,但却可以在源码中查到的方法,这些方法大多有/**@hide*/标记,如果想要调用hide方法或类我们就要重新打包sdk。如果有源码的话,可以去掉源码中的@hide标记,使方法可见,然后重新编译android.jar: $make update-...
  • yuanzihui
  • yuanzihui
  • 2015-06-18 13:55
  • 1446

Android之 MTP框架和流程分析 (1)

本文的目的是介绍Android系统中MTP的一些相关知识。主要的内容包括:
  • kv110
  • kv110
  • 2014-09-21 20:43
  • 5537

android中使用反射获取隐藏类

通过类名获取类。 Class serviceManager = Class.forName("android.os.ServiceManager"); 获取方法 Method method = serviceManager.getMethod("g...
  • Hknock
  • Hknock
  • 2015-03-30 14:53
  • 5799
    个人资料
    • 访问:183305次
    • 积分:3104
    • 等级:
    • 排名:第13261名
    • 原创:112篇
    • 转载:37篇
    • 译文:2篇
    • 评论:70条
    最新评论