移动设备上的程序化屏幕截图

13

我想要为Android实现某种远程协助工具(类似于vnc)。是否有可能在设备上通过编程来截取屏幕?

6个回答

17

你可以尝试类似这样的代码:

View v = view.getRootView();
v.setDrawingCacheEnabled(true);
Bitmap b = v.getDrawingCache();

2
谢谢,这正是我需要的!我有一个类似的问题,但我只想要我的应用程序的位图,而不是操作系统的用户界面等。 - Waleed Amjad

12

关于这个问题有一篇长篇讨论,在android-developers上,但简短的答案是:目前无法以编程方式拍摄安卓设备屏幕的截图,除非

  1. 您在该手机上获取了root权限,或者
  2. 您的应用程序是系统应用程序

Android清单权限READ_FRAME_BUFFER存在(请参见api文档此处),但目前只能由系统应用程序使用。其中各种原因之一是它存在安全风险。如果后台可以随时拍摄手机屏幕的截图,那么人们就可以使用OCR技术来嗅探用户输入的密码和其他私人信息。

因此,目前没有没有root权限的情况下VNC应用程序是不可能的。要从计算机中获取截图(当手机通过USB连接时),您可以使用DDMS


根据你在这里所说的,似乎可以通过非官方恢复模式安装系统应用程序,而不必将ROM破解。即使是你发布答案1.75年后,我也没有听说过任何VNC系统应用程序。有很多自定义ROM用户存在,看起来等待某个出色的VNC应用程序填补这个空缺。 - Emmaly
2
关于第二点:你必须不仅仅是一个系统应用程序(即在系统文件夹中),还必须由操作系统密钥签名,这更具限制性。这就是“signatureOrSystem”和“signature”权限之间的区别。 - Rupert Rawnsley

7
你可以尝试下面的库: http://code.google.com/p/android-screenshot-library/ Android Screenshot Library (ASL) 可以使我们在没有root权限的情况下,通过编程从Android设备中截取屏幕截图。ASL利用了一个本地服务在后台运行,每次设备启动时通过Android Debug Bridge (ADB) 启动。

你的回答对我非常有用,但是当我使用这个库时,它一直显示一个 toast,上面写着“未找到本地服务”。如果你遇到过这样的问题,请帮助我。谢谢。 - Ravi K. Sharma

3

我认为在KitKat系统中,可以使用ADB命令进行屏幕截图。你可以使用这个命令将屏幕录制成视频。

adb shell screenrecord /sdcard/demo.mp4

您可以在这里找到更多详细信息:链接

您可以从您的应用程序中执行ADB命令。 在这里查看答案:链接


1
不行。在使用getRuntime().exec()方法执行' screenrecord --verbose --time-limit 5 /sdcard/recvid.mp4'之后... 进程确实运行了,但是我收到了错误消息:"权限拒绝:广播要求以用户-1身份运行,但从用户0调用;这需要android.permission.INTERACt_ACROSS_USERS_FULL..." 然而,我已经成功运行了'screenrecord --help'! - giannileuani

1
将它放在 onClick 中。
Bitmap bitmap = takeScreenshot();
saveBitmap(bitmap);

编写函数...

public Bitmap takeScreenshot() {
   View rootView = findViewById(android.R.id.content).getRootView();
   rootView.setDrawingCacheEnabled(true);
   return rootView.getDrawingCache();
}

public void saveBitmap(Bitmap bitmap) {
    File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png");
    FileOutputStream fos;
    try {
        fos = new FileOutputStream(imagePath);
        bitmap.compress(CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();
    } catch (FileNotFoundException e) {
        Log.e("GREC", e.getMessage(), e);
    } catch (IOException e) {
        Log.e("GREC", e.getMessage(), e);
    }
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接