如何调用Android隐藏API

 我来答
后面小三别打我
2016-12-22 · TA获得超过475个赞
知道小有建树答主
回答量:463
采纳率:83%
帮助的人:225万
展开全部
对于这个问题,一般可以用Java Reflect技术来解决。(一)访问隐藏public类 例如PolicyManager就是个隐藏类,如果非要在App层访问它,那么就可以使用reflect技术: try { Class policyClass = Class.forName("com.android.internal.policy.PolicyManager"); } catch (Exception e) { e.printStackTrace();
}(二)访问隐藏类的static方法 因为没有隐藏类的对象实例,所以只能用null去访问它的static方法或成员: try { Method makenewwindow = policyClass.getMethod("makeNewWindow", new Class[] {Context.class});
Window win = (Window)makenewwindows.invoke(null, context); } catch (Exception e) {
e.printStackTrace();
}(三)访问public类的私有成员变量 try { Field f = WebSettings.class.getDeclaredField("mBuiltInZoomControls");
f.setAccessible(true); //关闭访问检查 f.setBoolean(wSettings, false); //wSettings是WebSettings对象
} catch(Exception e) {
Log.i(LOGTAG, e.toString());
} (四)访问public类的私有成员变量 try { Method m = WebSettings.class.getDeclaredMethod("getCurrentUserAgent");
m.setAccessible(true); //关闭访问检查 m.invoke(wSettings); //wSettings是WebSettings对象
} catch(Exception e) {
Log.i(LOGTAG, e.toString());
} (五)访问public类的@hide的public成员 try { Object[] args = {Integer.valueOf(5)}; Method m = WebSettings.class.getMethod("setPageCacheCapacity", new Class[]{int.class});
m.invoke(wSettings, args); //wSettings是WebSettings对象
} catch(Exception e) {
Log.i(LOGTAG, e.toString());} try {Method m = WebView.class.getMethod("getWebChromeClient");
Object ob = m.invoke(mSubView); WebChromeClient client = (WebChromeClient) ob;
} 利用反射技术的优点是灵活,能解决一些访问限制的问题,能够在不兼容的系统捕获异常,而使程序不至于崩溃;缺点是步骤比较多,需要熟悉要调用的类、方法名称访问属性,大量使用反射会大大增加代码,对代码的健壮性不利。一般被hide的类或成员可能还不太成熟稳定,所以不便公开。 另外一种解决以上访问问题的方法是导入全编译的classes.jar包,这种方法比较简单。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式