获取android上其他正在运行的应用程序的屏幕截图
在Android上,我可以通过在activity manager上执行GetRunningAppProcess来获取正在运行的应用程序列表:获取android上其他正在运行的应用程序的屏幕截图,android,process,screenshot,Android,Process,Screenshot,在Android上,我可以通过在activity manager上执行GetRunningAppProcess来获取正在运行的应用程序列表: ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunni
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();
ActivityManager am=(ActivityManager)getSystemService(Context.ACTIVITY_服务);
列表
我可以在自己的应用程序中获得这些截图吗?如何获取表示给定窗口内容的图像
Endriu无需root访问即可拍摄屏幕截图:
@SuppressLint("NewApi")
public void takeScreenshot(Context context, String fileFullPath)
{
if(fileFullPath == ""){
format = new SimpleDateFormat("yyyyMMddHHmmss");
String fileName = format.format(new Date(System.currentTimeMillis())) + ".png";
fileFullPath = "/data/local/tmp/" + fileName;
}
if(ShellUtils.checkRootPermission()){
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH){
ShellUtils.execCommand("/system/bin/screencap -p "+ fileFullPath,true);
}
}
else {
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR2 && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH){
wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mDisplay = wm.getDefaultDisplay();
mDisplayMatrix = new Matrix();
mDisplayMetrics = new DisplayMetrics();
// We need to orient the screenshot correctly (and the Surface api seems to take screenshots
// only in the natural orientation of the device :!)
mDisplay.getRealMetrics(mDisplayMetrics);
float[] dims =
{
mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels
};
float degrees = getDegreesForRotation(mDisplay.getRotation());
boolean requiresRotation = (degrees > 0);
if (requiresRotation){
// Get the dimensions of the device in its native orientation
mDisplayMatrix.reset();
mDisplayMatrix.preRotate(-degrees);
mDisplayMatrix.mapPoints(dims);
dims[0] = Math.abs(dims[0]);
dims[1] = Math.abs(dims[1]);
}
Bitmap mScreenBitmap = screenShot((int) dims[0], (int) dims[1]);
if (requiresRotation) {
// Rotate the screenshot to the current orientation
Bitmap ss = Bitmap.createBitmap(mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels,
Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(ss);
c.translate(ss.getWidth() / 2, ss.getHeight() / 2);
c.rotate(degrees);
c.translate(-dims[0] / 2, -dims[1] / 2);
c.drawBitmap(mScreenBitmap, 0, 0, null);
c.setBitmap(null);
mScreenBitmap = ss;
if (ss != null && !ss.isRecycled()) {
ss.recycle();
}
}
// If we couldn't take the screenshot, notify the user
if (mScreenBitmap == null){
Toast.makeText(context, "screen shot fail", Toast.LENGTH_SHORT).show();
}
// Optimizations
mScreenBitmap.setHasAlpha(false);
mScreenBitmap.prepareToDraw();
saveBitmap2file(context, mScreenBitmap, fileFullPath); // save image file
}
}
}
@SuppressLint(“NewApi”)
公共void截图(上下文上下文,字符串fileFullPath)
{
如果(fileFullPath==“”){
格式=新的SimpleDataFormat(“yyyyMMddHHmmss”);
字符串文件名=format.format(新日期(System.currentTimeMillis())+“.png”;
fileFullPath=“/data/local/tmp/”+文件名;
}
if(ShellUtils.checkRootPermission()){
if(android.os.Build.VERSION.SDK\u INT>=android.os.Build.VERSION\u code.ICE\u三明治){
execCommand(“/system/bin/screencap-p”+fileFullPath,true);
}
}
否则{
if(android.os.Build.VERSION.SDK_INT=android.os.Build.VERSION_code.ICE_三明治){
wm=(WindowManager)context.getSystemService(context.WINDOW\u服务);
mDisplay=wm.getDefaultDisplay();
mDisplayMatrix=新矩阵();
mDisplayMetrics=新的DisplayMetrics();
//我们需要正确定位屏幕截图(Surface api似乎可以截图)
//仅在设备的自然方向:!)
getRealMetrics(mDisplayMetrics);
浮动[]变暗=
{
mDisplayMetrics.widthPixels、mDisplayMetrics.heightPixels
};
float degrees=getDegreesForRotation(mDisplay.getRotation());
布尔要求旋转=(度>0);
如果(需要轮换){
//获取设备在其本机方向上的尺寸
mDisplayMatrix.reset();
mDisplayMatrix.预旋转(-度);
mDisplayMatrix.mapPoints(dims);
dims[0]=Math.abs(dims[0]);
dims[1]=数学abs(dims[1]);
}
位图mScreenBitmap=屏幕截图((int)dims[0],(int)dims[1]);
如果(需要轮换){
//将屏幕截图旋转到当前方向
位图ss=Bitmap.createBitmap(mDisplayMetrics.widthPixels、mDisplayMetrics.heightPixels、,
位图.Config.ARGB_8888);
画布c=新画布(ss);
c、 translate(ss.getWidth()/2,ss.getHeight()/2);
c、 旋转(度);
c、 平移(-dims[0]/2,-dims[1]/2);
c、 drawBitmap(mScreenBitmap,0,0,null);
c、 setBitmap(空);
mScreenBitmap=ss;
如果(ss!=null&&!ss.isRecycled()){
ss.recycle();
}
}
//如果我们无法拍摄屏幕截图,请通知用户
如果(mScreenBitmap==null){
Toast.makeText(上下文,“屏幕截图失败”,Toast.LENGTH_SHORT.show();
}
//优化
mScreenBitmap.setHasAlpha(false);
mScreenBitmap.prepareToDraw();
saveBitmap2file(上下文、mScreenBitmap、fileFullPath);//保存图像文件
}
}
}
来源:您需要查看应用程序内部的屏幕截图吗?或者你只想在你的设备上制作其他应用程序的屏幕截图?我想在我的应用程序中看到它们。这不是我的意思。我不想有当前屏幕的截图,我有最小化应用程序的截图/预览,就像附加的图像一样(内置任务管理器可以获得它们)。