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

置使用3G数据功能:

从源代码看到隐藏的API(ConnectivityManager.java):

查看文本打印?

  1. /**

  2. * Sets the persisted value for enabling/disabling Mobile data.

  3. *

  4. * @param enabled Whether the mobile data connection should be

  5. *            used or not.

  6. * @hide

  7. */

  8. public void setMobileDataEnabled(boolean enabled) {

  9. try {

  10. mService.setMobileDataEnabled(enabled);

  11. } catch (RemoteException e) {

  12. }

  13. }

通过java
reflection功能来实现该功能,即调用

查看文本打印?

  1. mService.setMobileDataEnabled(enabled);

代码如下:

查看文本打印?

  1. private void EnableMobileData(boolean enable)

  2. {

  3. ConnectivityManager connectivitymanager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  4. try

  5. {

  6. // Get mService

  7. // android.net.ConnectivityManager.mService;

  8. Field field = Class.forName(ConnectivityManager.class.getName())

  9. .getDeclaredField("mService");

  10. field.setAccessible(true);

  11. /*

  12. // 权限修饰符

  13. int mo = field.getModifiers();

  14. String priv = Modifier.toString(mo);

  15. // 属性类型

  16. Class<?> type = field.getType();

  17. Log.i(TAG, priv + " " + type.getName() + " " + field.getName()

  18. + ";");

  19. */

  20. // get Object of mService

  21. Object obj = field.get(connectivitymanager);// connectivitymanager.mService

  22. // get IConnectivityManager class

  23. Class myClass = Class.forName(obj.getClass().getName());

  24. Log.i(TAG, "class3:" + obj.getClass().getName());// IConnectivityManager

  25. // get android.net.IConnectivityManager

  26. // public void setMobileDataEnabled(boolean enabled) throws

  27. // android.os.RemoteException;

  28. Method method = myClass.getDeclaredMethod("setMobileDataEnabled",

  29. boolean.class);
  30. /*

  31. String pstr = "";

  32. Class<?>[] parameters = method.getParameterTypes();

  33. int count = parameters.length;

  34. Log.i(TAG, "count:" + count);

  35. if (count > 0)

  36. {

  37. for (Class<?> p : parameters)

  38. {

  39. pstr += p.getName() + ",";

  40. }

  41. pstr = pstr.substring(0, pstr.length() - 1);

  42. Log.i(TAG, "pstr:" + pstr);

  43. }

  44. Log.i(TAG, Modifier.toString(method.getModifiers()) + " "

  45. + method.getReturnType().getName() + " " + method.getName()

  46. + "(" + pstr + ");");

  47. */

  48. method.setAccessible(true);

  49. method.invoke(obj, enable);
  50. }

  51. catch (Exception e)

  52. {

  53. // TODO Auto-generated catch block

  54. e.printStackTrace();

  55. }
  56. }

注意添加相应的permission:

查看文本打印?

  1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

  2. <uses-permission android:name="android.permission.INTERNET" />

  3. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

补充一个网上利用java
reflection解析APK软件包信息的代码:

查看文本打印?

    1. // Ref:http://blog.csdn.net/sodino/article/details/6215224

    2. // <strong>利用</strong><strong>反射</strong>机制<strong>调用</strong>android @hide的API进行解析

    3. public static void ExtractApkInfoExt(String apkPath, DownloadTask task)

    4. {

    5. String PATH_PackageParser = "android.content.pm.PackageParser";

    6. String PATH_AssetManager = "android.content.res.AssetManager";

    7. try

    8. {

    9. // apk包的文件路径

    10. // 这是一个Package 解释器, 是隐藏的

    11. // 构造函数的参数只有一个, apk文件的路径

    12. // PackageParser packageParser = new PackageParser(apkPath);

    13. Class pkgParserCls = Class.forName(PATH_PackageParser);

    14. Class[] typeArgs = new Class[1];

    15. typeArgs[0] = String.class;

    16. Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);

    17. Object[] valueArgs = new Object[1];

    18. valueArgs[0] = apkPath;

    19. Object pkgParser = pkgParserCt.newInstance(valueArgs);

    20. if (Constants.DEBUG_MODE)

    21. Log.d(TAG, "pkgParser:" + pkgParser.toString());

    22. // 这个是与显示有关的, 里面涉及到一些像素显示等等, 我们使用默认的情况

    23. DisplayMetrics metrics = new DisplayMetrics();

    24. metrics.setToDefaults();

    25. // PackageParser.Package mPkgInfo = packageParser.parsePackage(new

    26. // File(apkPath), apkPath,

    27. // metrics, 0);

    28. typeArgs = new Class[4];

    29. typeArgs[0] = File.class;

    30. typeArgs[1] = String.class;

    31. typeArgs[2] = DisplayMetrics.class;

    32. typeArgs[3] = Integer.TYPE;

    33. Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod(

    34. "parsePackage", typeArgs);

    35. valueArgs = new Object[4];

    36. valueArgs[0] = new File(apkPath);

    37. valueArgs[1] = apkPath;

    38. valueArgs[2] = metrics;

    39. valueArgs[3] = 0;

    40. Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser,

    41. valueArgs);

    42. if (pkgParserPkg == null)

    43. {

    44. return;

    45. }

    46. // 应用程序信息包, 这个公开的, 不过有些函数, 变量没公开

    47. // ApplicationInfo info = mPkgInfo.applicationInfo;

    48. Field appInfoFld = pkgParserPkg.getClass().getDeclaredField(

    49. "applicationInfo");

    50. ApplicationInfo info = (ApplicationInfo) appInfoFld

    51. .get(pkgParserPkg);
    52. // get VersionCode

    53. Field versionCodeFld = pkgParserPkg.getClass().getDeclaredField(

    54. "mVersionCode");

    55. int versionCode = ((Integer) versionCodeFld.get(pkgParserPkg))

    56. .intValue();
    57. // get VersionName

    58. Field versionNameFld = pkgParserPkg.getClass().getDeclaredField(

    59. "mVersionName");
    60. String versionName = (String) versionNameFld.get(pkgParserPkg);
    61. // uid 输出为"-1",原因是未安装,系统未分配其Uid。

    62. if (Constants.DEBUG_MODE)

    63. Log.d(TAG, "pkg:" + info.packageName + " uid=" + info.uid);

    64. // Resources pRes = getResources();

    65. // AssetManager assmgr = new AssetManager();

    66. // assmgr.addAssetPath(apkPath);

    67. // Resources res = new Resources(assmgr, pRes.getDisplayMetrics(),

    68. // pRes.getConfiguration());
    69. Class assetMagCls = Class.forName(PATH_AssetManager);

    70. Constructor assetMagCt = assetMagCls.getConstructor((Class[]) null);

    71. Object assetMag = assetMagCt.newInstance((Object[]) null);

    72. typeArgs = new Class[1];

    73. typeArgs[0] = String.class;

    74. Method assetMag_addAssetPathMtd = assetMagCls.getDeclaredMethod(

    75. "addAssetPath", typeArgs);

    76. valueArgs = new Object[1];

    77. valueArgs[0] = apkPath;

    78. assetMag_addAssetPathMtd.invoke(assetMag, valueArgs);

    79. Resources res = mContext.getResources();

    80. typeArgs = new Class[3];

    81. typeArgs[0] = assetMag.getClass();

    82. typeArgs[1] = res.getDisplayMetrics().getClass();

    83. typeArgs[2] = res.getConfiguration().getClass();

    84. Constructor resCt = Resources.class.getConstructor(typeArgs);

    85. valueArgs = new Object[3];

    86. valueArgs[0] = assetMag;

    87. valueArgs[1] = res.getDisplayMetrics();

    88. valueArgs[2] = res.getConfiguration();

    89. res = (Resources) resCt.newInstance(valueArgs);

    90. CharSequence label = null;

    91. if (info.labelRes != 0)

    92. {

    93. label = res.getText(info.labelRes);

    94. // if (label == null) {

    95. // label = (info.nonLocalizedLabel != null) ?

    96. // info.nonLocalizedLabel

    97. // : info.packageName;

    98. // }

    99. task.setTitle(String.valueOf(label));

    100. }
    101. if (Constants.DEBUG_MODE)

    102. Log.d(TAG, "label=" + label);

    103. // 这里就是读取一个apk程序的图标

    104. if (info.icon != 0)

    105. {

    106. Drawable icon = res.getDrawable(info.icon);

    107. task.setIcon(((BitmapDrawable) icon).getBitmap());

    108. // ImageView image = (ImageView) findViewById(R.id.appicon);

    109. // image.setVisibility(View.VISIBLE);

    110. // image.setImageDrawable(icon);

    111. }

    112. if (versionName != null)

    113. {

    114. task.setVersionName(versionName);

    115. }

    116. task.setVersionCode(versionCode);

    117. task.setPackageName(info.packageName);

    118. if (info.processName == null)

    119. {

    120. info.processName = info.packageName;

    121. }

    122. task.setProcessName(info.processName);

    123. }

    124. catch (Exception e)

    125. {

    126. e.printStackTrace();

    127. }

    128. }

原文:http://www.verydemo.com/demo_c89_i35812.html

时间: 2024-12-12 03:55:52

Android:利用Java反射调用@hide的API的相关文章

Android利用Java反射机制修改Android System Language

private void updateLanguage(Locale locale) { try { Object objIActMag, objActMagNative; Class clzIActMag = Class.forName("android.app.IActivityManager"); Class clzActMagNative = Class.forName("android.app.ActivityManagerNative"); Method

利用Java反射实现JavaBean对象相同属性复制并初始化目标对象为空的属性的BeanUtils

有时遇到将数据传输对象转换成JSON串会将属性值为空的属性去掉,利用Java反射实现JavaBean对象数据传输对象的相同属性复制并初始化数据传输对象属性为空的属性,然后转换成JSON串 package com.banksteel.util; import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Arrays;import java.ut

Android中Java反射技术的使用示例

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * Android中Java反射技术的使用示例 * 在Java中描述字节码文件(xxx.class)的类叫Class * 反射的过程可视为剖析Class的过

利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换

作者:54dabang 在spring的学习过程之中,我们可以看出通过配置文件来动态管理bean对象的好处(松耦合 可以让零散部分组成一个整体,而这些整体并不在意之间彼此的细节,从而达到了真正的物理上的疏散耦合,而非逻辑,有了IOC之后,我们可以让SPRING充当各框架中的整合器,把技术框架进行完美的结合). Spring实现的一个重要的机制是通过反射(java.lang.reflect)读取配置文件,通过配置文件来动态生成配置文件中的类对象.Java动态加载类主要是为了不改变主程序代码,通过修

java反射调用方法

1:Class类中的方法 public Method getDeclaredMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException 参数: name - 方法名 parameterTypes - 参数数组 返回: 该类与指定名和参数相匹配的方法的 Method 对象 2:Method类中的方法; public Object invoke(Object obj,

Java 反射调用私有域和方法(setAccessible)

Java 反射调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了AccessibleObject类,该基类有两个setAccessible方法能在运行时压制Java语言访问控制检查(Java language access control checks),从而能任意调用被私有化保护的方法.域和构造方法 public class AccessibleObjectextends

利用Java反射机制和泛型,全自动解析json

有啦这个简直,太爽啦, 利用Java 反射机制,利用Class 就可以得到 类的 变量  Field[] fields=cls.getDeclaredFields(); 还可以通过类中 的方法名字 去执行这个方法 m1 = cls.getDeclaredMethod(getMothodName(fields[j].getName()), String.class); m1.invoke(result,json.getString(fields[j].getName()) ); 利用泛型 去获取这

利用Java反射机制完成XML到对象的解析

对于一些小批量的数据,如果采用数据库来存取的话,未免有点大题小作,使用XML文件是个不错的方法,尤其是在一些Web应用中,经常需要缓存一部分数据,如果将这些数据形成XML文件,解析后放入一个Hashtable,那就能大大加快访问的速度. 由于工作的需要,写了一个解析工具,将XML解析成相应的对象列表.以下是源代码,希望对大家有所帮助,更希望大家帮我来改进这个工具. package com.sp.util; /* * author:hingwu * email:[email protected]

利用java 反射机制来实现一个servlet处理多种请求

如果我们想在一个servlet中处理多种请求(比如新闻的添加.删除),简单的可以在jsp提交表单的action路径中添加一个键值对,然后再servlet中接收后根据不同的值来调用不同的方法. jsp端 1 <form action="newsServlet?method=add" method="post"> 2 <input type="text" ..> 3 <input type="submit&qu