android 反射调用API中@hide的方法失败,请大神指教

杨小扬 2014-04-03 02:32:44
代码如下:
public Bitmap screenshot(int widht, int height) {
Class cl;
Bitmap shot = null;
try {
cl = Class.forName("android.view.Surface");
Object invoker = cl.newInstance();
Method screenShot = cl.getMethod("screenshot",new Class[]{int.class, int.class});
// screenShot.setAccessible(true);
Object result = screenShot.invoke(invoker, new Object[]{widht,height});
shot = (Bitmap) result;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return shot;
}

调用方法如下:android.view.Surface
/**
* Like {@link #screenshot(int, int, int, int)} but includes all
* Surfaces in the screenshot.
*
* @hide
*/
public static Bitmap screenshot(int width, int height) {
// TODO: should take the display as a parameter
IBinder displayToken = getBuiltInDisplay(BUILT_IN_DISPLAY_ID_MAIN);
return nativeScreenshot(displayToken, width, height, 0, 0, true);
}

报错信息:
04-03 10:17:19.732: W/System.err(28374): java.lang.NoSuchMethodException: screenshot [int, int]
04-03 10:17:19.733: W/System.err(28374): at java.lang.Class.getConstructorOrMethod(Class.java:472)
04-03 10:17:19.733: W/System.err(28374): at java.lang.Class.getMethod(Class.java:864)
...全文
1059 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
杨小扬 2016-10-18
  • 打赏
  • 举报
回复
多年后回来结贴,想想应该是系统权限问题,如果提高到系统权限应该就可以截图了,猜测
潇洒蓝桥 2016-08-10
  • 打赏
  • 举报
回复
同求解决方法
满满的全是爱 2015-03-30
  • 打赏
  • 举报
回复
遇到了同样的问题,怎么解决?
逍遥笑 2014-05-05
  • 打赏
  • 举报
回复
同求啊,刚有做了好几个反射调用,都不得行,都报这个异常
杨小扬 2014-05-05
  • 打赏
  • 举报
回复
引用 4 楼 zyongsheng83 的回复:
既然再API里hide了而没有开放出来,说明google可能随时在后面版本的API里删掉这个方法。 你要看下不可以用的机器系统版本,API里应已经删掉了。 所以catch到NoSuchMethodException也是正常的,catch后换一种处理方式,这算是处理兼容了,不意外。 很多为了兼容会case不同的os版本写不同的代码,有时候这也是难免的。 最后也可能实在处理不了了,也要给个友好的提示,系统不支持之类的。e.printStackTrace()肯定不是解决之道。
我不认为会删掉,大量的底层都是hide的,应该是Google不想被调用,要删掉直接@Deprecated就好了。 确认手机版本是有这个方法的,因为安卓中uiautomator调用的就是这个方法,能正常执行。 你的建议也很好,以后会注意catch,谢谢。
奋斗并快乐着 2014-04-30
  • 打赏
  • 举报
回复
既然再API里hide了而没有开放出来,说明google可能随时在后面版本的API里删掉这个方法。 你要看下不可以用的机器系统版本,API里应已经删掉了。 所以catch到NoSuchMethodException也是正常的,catch后换一种处理方式,这算是处理兼容了,不意外。 很多为了兼容会case不同的os版本写不同的代码,有时候这也是难免的。 最后也可能实在处理不了了,也要给个友好的提示,系统不支持之类的。e.printStackTrace()肯定不是解决之道。
杨小扬 2014-04-30
  • 打赏
  • 举报
回复
引用 1 楼 aihujianfei 的回复:
我也刚用了反射方法,调用screenshot,但是只是在个别的机子上可以用。
我的机器不可以使用,这是什么原因,是否是手机制造商封住了? 确认在个别机子上可以使用吗,那样也许还会有解决办法的
aihujianfei 2014-04-18
  • 打赏
  • 举报
回复
再补一句,而且,在Manifest文件中,要写 android.uid.sytem。
aihujianfei 2014-04-18
  • 打赏
  • 举报
回复
我也刚用了反射方法,调用screenshot,但是只是在个别的机子上可以用。

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧