Android开发中怎样使用隐藏的API

Android应用中有时为了实现某些特殊的功能或效果,往往需要使用一些谷歌隐藏的API(加有@hide标记的public类、方法或常量),例如PolicyManager。

使用Android隐藏的API主要有两种办法:1.利用Java反射机制,使用反射的方法得到隐藏API;2.使用源码编译时生成的全编译过的classes.jar包。

举例说明,下面的代码如果直接使用会报错。

mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);          mWindow = PolicyManager.makeNewWindow(mContext);          mWindow.setWindowManager(mWindowManager, nullnull);  

1,使用Java反射机制,改为以下代码,就可以正常使用了。

mWindowManager = (WindowManager) mContext                   .getSystemService(Context.WINDOW_SERVICE);           // using reflect mechanism to invoke hide api            String POLICYMANAGER_CLASS_NAME = "com.android.internal.policy.PolicyManager";           try {               Class policyClass;               policyClass = Class.forName(POLICYMANAGER_CLASS_NAME);               Log.i(TAG, policyClass.toString());               Method meths[] = policyClass.getMethods();               Method makenewwindow = null;               // Method makenewwindow = policyClass.getMethod("makeNewWindow");                for (int i = 0; i < meths.length; i++) {                   if (meths[i].getName().endsWith("makeNewWindow"))                       makenewwindow = meths[i];               }               Log.i(TAG, makenewwindow.toString());               mWindow = (Window) makenewwindow.invoke(null, mContext);               } catch (Exception e) {               e.printStackTrace();           }           mWindow.setWindowManager(mWindowManager, nullnull);  

2,如果不想修改代码,就需要使用第二种方法:导入全编译的classes.jar包。编译Android框架源码后,将生成全编译的classes.jar导入到工程中。使用Eclipse,Android工程添加library(BuildPath -> Add Libraries->User Library->New User Library),将.jar文件加入添加到library,同时勾选“SystemLibrary”选项, 以避免产生“java.lang.OutOfMemoryError:Java Heap Space”错误。如果已经正确导入了jar库,却仍然找不到隐藏的API。原因可能是Buildclass path order不正确,即android.jar和classes.jar的导入顺序不对,具体调节Buildclass path order,选择Build Path-> Config Build Path->Order and Export,调整自定义的library与android.jar的顺序。

此时,本文最开始的那段代码不需要再做改动就可以生效了。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyzyjw.html