-1

On Android I can get list of running applications by executing getRunningAppProcesses on activity manager:

        ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

But I want something more, when I open system task manager, there are screenshots of running applications, like on Screenshot Can I get those screenshots in my own application? How to get image representing contents of given window?

Endriu

2 Answers2

0

take screenshot without needs root access:

@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
            }
        }

    }

Source: ScreentShotUtil.java

Lucas
  • 431
  • 3
  • 7
  • This is not exactly what I meant. I don't want to have screenshot of current screen, I have screenshots/previews of minimized applications, exactly as on attached image (built in task manager somehow can get them). – Andrzej Poniedziałek Jan 25 '16 at 14:18
0

SystemServicesProxy class has getThumbnail method to get required task thumbnail through its id. Before that you need to get running apps ids using getRecentTasks. You can read more about it here.

Acuna
  • 1,741
  • 17
  • 20