将android adb shell screencap存储为变量

时间:2014-07-08 05:06:26

标签: android shell 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中?

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

2 个答案:

答案 0 :(得分:1)

如果距离预期路径不太远,这可能会有所帮助。 (我认为你正在使用node / 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 $ $' >输出文件。它确实有效。要清楚,转换是CR-CR-LF => LF为我们窗户监禁了鸟类。如果您不想实现SED而不使用javascript正则表达式转换binary-> strings->二进制,您可以遵循我的路径。可能有一种更简单的方法,我只是不知道它是什么......

因此,Convert()是一个对象,其方法可以即时转换字节流。

请参阅codewind博客链接:http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html以构建您的转换。

答案 1 :(得分:0)

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

有几个例子如何使用screencap,例如here