【问题标题】:Programmatic screencapture on mobile device移动设备上的程序化截屏
【发布时间】:2010-08-27 08:49:39
【问题描述】:

我想为 Android 实现某种远程协助工具(如 vnc)。是否可以在设备上以编程方式捕获屏幕?

【问题讨论】:

    标签: android screenshot


    【解决方案1】:

    类似的东西可能对你有用:

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

    【讨论】:

    • 谢谢,这正是我所需要的!我有一个类似的问题,但我只想要我的应用程序的位图,而不是操作系统 UI 等
    【解决方案2】:

    android-developers 对此进行了长时间的讨论,但简短的回答是:目前您无法以编程方式截取 Android 设备的屏幕截图,除非

    1. 您对该手机具有 root 访问权限,或者
    2. 您的应用程序是系统应用程序

    Android Manifest 权限 READ_FRAME_BUFFER 存在(请参阅 api 文档here),但目前只能由系统应用程序使用。造成这种情况的原因有很多,其中之一是它存在安全风险。如果后台可以随时截取手机屏幕的屏幕截图,那么人们可以使用 OCR 技术在用户输入密码时嗅探用户的密码以及其他私人信息。

    所以不,目前没有 root 用户无法使用 VNC 应用程序。要从您的计算机截取屏幕截图(当手机通过 USB 插入时),您可以使用DDMS

    【讨论】:

    • 根据你所说的,听起来系统应用程序可以通过非库存恢复安装,不一定需要ROM本身root。即使在您发布此答案 1.75 年后,我也没有听说过任何 VNC 系统应用程序。那里有很多自定义 ROM 用户,似乎那里有相当大的空白等待有人提供一个好的 VNC 应用程序。
    • 关于第 2 点:您必须不仅仅是一个系统应用程序(即在系统文件夹中),您必须通过 OS 密钥签名,这更具限制性。这是“signatureOrSystem”和“signature”权限之间的区别。
    【解决方案3】:

    您可以尝试以下库: http://code.google.com/p/android-screenshot-library/ Android 屏幕截图库 (ASL) 能够以编程方式从 Android 设备捕获屏幕截图,而无需拥有 root 访问权限。相反,ASL 使用在后台运行的本机服务,每次设备启动时通过 Android 调试桥 (ADB) 启动一次。

    【讨论】:

    • 您的回答对我来说非常有用,但是当我使用这个库时,它不断向我显示“未找到本机服务”的祝酒词。如果遇到这样的问题,请帮帮我。谢谢
    【解决方案4】:

    我认为它可以在 kitkat 中使用 adb 命令进行屏幕截图。 您可以使用此命令将屏幕录制为视频

    adb shell screenrecord /sdcard/demo.mp4
    

    您可以找到更多详情here

    您可以在您的应用中执行 adb 命令。 查看答案here

    【讨论】:

    • 不。在 getRuntime().exec() 方法上执行:'screenrecord --verbose --time-limit 5 /sdcard/recvid.mp4'...进程确实运行,但是我收到错误:“Permission Denial: broadcast要求以用户 -1 的身份运行,但从用户 0 调用;这需要 android.permission.INTERACt_ACROSS_USERS_FULL.." 但是我已经能够运行 'screenrecord --help' 就好了!
    【解决方案5】:

    把它放在 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);
        }
    }
    

    【讨论】:

      【解决方案6】:

      “某些”android 设备(主要是三星)确实存在 VNC 类型的远程 tol:
      TeamViewer 快速支持
      https://play.google.com/store/apps/details?id=com.teamviewer.quicksupport.market
      有谁知道该工具如何获取屏幕捕获,以及为什么它只支持有限的设备集?

      【讨论】:

        猜你喜欢
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        • 2019-11-13
        • 1970-01-01
        • 2017-05-31
        相关资源
        最近更新 更多