此刻制作应用程序供个人使用(已植根),并且需要从屏幕获取某些像素颜色。我试图通过运行时完成此任务。
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中?
非常感谢,请原谅示例代码的一般懒惰/快捷方式。
答案 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