如何调用Android隐藏API
2个回答
2016-04-15 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
关注
展开全部
对于这个问题,一般可以用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包,这种方法比较简单。
}(二)访问隐藏类的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包,这种方法比较简单。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询