【问题标题】:Storing android adb shell screencap as variable将 android adb shell screencap 存储为变量
【发布时间】:2014-07-08 05:06:25
【问题描述】:

目前正在制作一个供我个人使用的应用程序(root),它需要从屏幕上获取某些像素颜色。我试图通过运行时来实现这一点。

Process p = Runtime.getRuntime().exec("screencap");
p.waitFor();
InputStream is = p.getInputStream()
BitmapFactory.decodeStream(is);

我得到工厂返回 null。

但如果我通过 adb -d shell screencap /sdcard/ss.dump 将进程转储到我的 SD 卡并从我的应用程序访问它

BitmapFactory.decodeFile("/sdcard/ss.dump");

一切顺利。

所以无论如何都可以将流直接转储到我的应用程序中的 BitmapFactory 中?

谢谢,请原谅示例代码的一般懒惰/快捷方式。

【问题讨论】:

    标签: android shell root


    【解决方案1】:

    如果离您的预期路径不太远,这可能会有所帮助。 (我认为您正在使用节点/javascript)。我生成了生成流的 ADB.EXE 命令(并且在 Windows 上被“监禁”,程序必须转换流以考虑换行结束的差异。因此,我正在执行以下操作:

    exports.capture = function(filename) {
    
        // you'll need to map your requirement (decodeStream) instead 
        // of streaming to a file
    
        var strm = fs.createWriteStream(path);  
        var cv = new Convert();
        cv.pipe(strm);
    
        var capture = spawn(cmd, args);
    
        capture.stdout.on('data', function(data) {
            cv.write(data);
        });
        capture.stdout.on('exit', function(data) {
            cv.end();
        });
    }
    

    为了解释这个过程,spawn 正在运行 ADB 命令,在 Windows 上,插入 CR-LF(作为 PNG 流),并且流通过 fs 转换进行分块/管道传输。网络上的其他人将该过程描述为 adb.exe shell screencap -p | sed 's/\r$//' > output.file.它确实有效。需要明确的是,对于我们被关押的鸟来说,转换是 CR-CR-LF => LF。如果您不想实现 SED 并且不使用 javascript 正则表达式转换二进制->字符串->二进制,您可以按照我的路径。可能还有更简单的方法,就是不知道是什么……

    因此,Convert() 是一个具有动态转换字节流的方法的对象。

    查看 codewind 博客链接是:http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html 来构建您的转换。

    【讨论】:

      【解决方案2】:

      在应用程序内部使用screencap 时,您必须使用su,即root。当您通过 adb 执行此操作时,它会在不同的用户 ID 下运行,该用户 ID 比普通的 Android 应用拥有更多权限。

      有几个示例如何使用屏幕截图,例如here.

      【讨论】:

        猜你喜欢
        • 2014-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 2018-11-06
        • 2022-12-13
        相关资源
        最近更新 更多