【转】利用windowManager实现录屏

ScreenShotService.java

package com.screenshot.ui;


import android.annotation.SuppressLint;
import android.app.Service;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.view.View;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;


public class ScreenShotService extends Service {
    public static final boolean SSS_DEFAULT_START = false;
    public static final boolean SSS_START = true;
    public static final boolean SSS_STOP = false;
    public static final String TRANSCRIBE_TAG = "TRANSCRIBE_TAG";
    public static final long SSS_DELAY_MILLIS = 100L;
    public static final  String SSS_FILE_PATH = "/luzhi/";
    public static final int SSS_MSG_WHAT = 256;
    private ScreenShotServiceHandler handler;
    private boolean isStart = SSS_STOP;

    private View[] sortViews(View[] viewarray){
        if ((viewarray == null) || (viewarray.length < 0)) {
            return null;
        }
        int i = 0;
        View[] views = new View[viewarray.length];
        for (View v : viewarray) {
            views[i++] = v;
        }


        int[] arrayOfInt = new int[2];
        View localView;
        int j = 0;
        int length = views.length;
        for (i = 0; i < length; i++) {
            localView = views[i];
            localView.getLocationOnScreen(arrayOfInt);
            if ((arrayOfInt[0] > 0) || (arrayOfInt[1] > 0)) {
                for (j = i + 1; j < views.length; j++) {
                    views[j - 1] = views[j];
                }
                views[views.length - 1] = localView;
                length--;
                i--;
            }
        }
        return views;
    }
    
    private View[] getWindowDecorViewsDownApi15() throws Exception {
        Class<?> windowManager = Class
                .forName("android.view.WindowManagerImpl");
        Field viewsField = windowManager.getDeclaredField("mViews");
        Field instanceField = windowManager.getDeclaredField("mWindowManager");
        viewsField.setAccessible(true);
        instanceField.setAccessible(true);
        Object instance = instanceField.get(null);
        View[] viewarray = (View[]) viewsField.get(instance);
        return sortViews(viewarray);
    }
    
    private View[] getWindowDecorViewsApi14_16() throws Exception {
        Class<?> windowManager = Class
                .forName("android.view.WindowManagerImpl");        
        Field viewsField = windowManager.getDeclaredField("mViews");
        Field instanceField = windowManager.getDeclaredField("sWindowManager");
        viewsField.setAccessible(true);
        instanceField.setAccessible(true);
        Object instance = instanceField.get(null);
        View[] viewarray = (View[]) viewsField.get(instance);
        return sortViews(viewarray);
    }
    
    private View[] getWindowDecorViewsApiUp17() throws Exception {
        Class<?> windowManager = Class
                .forName("android.view.WindowManagerGlobal");        
        Field viewsField = windowManager.getDeclaredField("mViews");
        Field instanceField = windowManager.getDeclaredField("sDefaultWindowManager");
        viewsField.setAccessible(true);
        instanceField.setAccessible(true);
        Object instance = instanceField.get(null);
        View[] viewarray = (View[]) viewsField.get(instance);
        return sortViews(viewarray);
    }
    
    private View[] getWindowDecorViews() throws Exception {
        View[] views;
        if(android.os.Build.VERSION.SDK_INT >= 14 && android.os.Build.VERSION.SDK_INT  < 17 ){
            views = getWindowDecorViewsApi14_16();
        }else if(android.os.Build.VERSION.SDK_INT >= 17 ){
            views = getWindowDecorViewsApiUp17();
        }else{
            views = getWindowDecorViewsDownApi15();
        }
        return views;
    }

    private void savePic(Bitmap paramBitmap, String paramString) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(paramString);
            if (null != fos) {
                paramBitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
                fos.flush();
                fos.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    private void screenShot() {
        try {
            View[] arrayOfView = getWindowDecorViews();
            Bitmap localBitmap = view2Bitmap(arrayOfView);
            new saveFileThread(localBitmap).start();
        } catch (Exception localException) {
            localException.printStackTrace();
        }
    }


    private Bitmap view2Bitmap(View paramView) {
        Log.e("saveFileThread view2Bitmap(View view)");
        paramView.setDrawingCacheEnabled(true);
        paramView.buildDrawingCache();
        Bitmap localBitmap1 = paramView.getDrawingCache();
        Bitmap localBitmap2 = null;
        if (localBitmap1 != null) {
            localBitmap2 = Bitmap.createBitmap(localBitmap1);
        }
        paramView.destroyDrawingCache();
        return localBitmap2;
    }


    private Bitmap view2Bitmap(View[] paramArrayOfView) {
        Canvas localCanvas = null;
        Paint localPaint = null;
        Bitmap newbitmap = null;
        int[] arrayOfInt = new int[2];


        for (View localView : paramArrayOfView) {
            Bitmap localBitmap = view2Bitmap(localView);
            localView.getLocationOnScreen(arrayOfInt);
            if (localBitmap != null) {
                if (localCanvas == null) {
                    newbitmap = Bitmap.createBitmap(localView.getWidth(),
                            localView.getHeight(), Config.ARGB_8888);// 创建一个新的和SRC
                    localCanvas = new Canvas(newbitmap);
                    localPaint = new Paint();
                }
                localCanvas.drawBitmap(localBitmap, arrayOfInt[0],
                        arrayOfInt[1], localPaint);
                localBitmap.recycle();
                localBitmap = null;
            }
        }
        if (localCanvas != null) {
            localCanvas.save(Canvas.ALL_SAVE_FLAG);// 保存
            localCanvas.restore();// 存储
        }
        return newbitmap;
    }


    public IBinder onBind(Intent paramIntent) {
        return null;
    }


    public void onCreate() {
        super.onCreate();
        Log.e("ScreenShotService onCreate");
        handler = new ScreenShotServiceHandler();
    }


    public void onStart(Intent paramIntent, int paramInt) {
        super.onStart(paramIntent, paramInt);
        Log.e("ScreenShotService onStart -----start----");
        String str = TRANSCRIBE_TAG;
        boolean localstart = paramIntent
                .getBooleanExtra(str, SSS_DEFAULT_START);
        if (this.isStart != localstart) {
            this.isStart = localstart;
            if (this.isStart == SSS_START) {
                handler.sendEmptyMessageDelayed(SSS_MSG_WHAT, SSS_DELAY_MILLIS);
            } else {
                handler.removeMessages(SSS_MSG_WHAT);
            }
        }
    }


    @SuppressLint({ "HandlerLeak", "HandlerLeak" })
    private class ScreenShotServiceHandler extends Handler {
        public void handleMessage(Message paramMessage) {
            if (paramMessage.what == SSS_MSG_WHAT) {
                ScreenShotService.this.screenShot();
                if (ScreenShotService.this.isStart) {
                    ScreenShotService.this.handler.sendEmptyMessageDelayed(
                            SSS_MSG_WHAT, SSS_DELAY_MILLIS);
                }
            }
        }
    }


    private class saveFileThread extends Thread {
        private Bitmap mbitmap;


        public saveFileThread(Bitmap arg2) {
            this.mbitmap = arg2;
        }


        public void run() {
            if (this.mbitmap == null) {
                Log.e("saveFileThread run mbitmap is null ");
            }
            File localFile1 = Environment.getExternalStorageDirectory();
            File localFile2 = new File(localFile1, SSS_FILE_PATH);
            if (!localFile2.exists()) {
                localFile2.mkdirs();
            }
            String filename = localFile2.getAbsolutePath() + "/"
                    + System.currentTimeMillis() + ".png";
            Log.e("saveFileThread run picPath = " + filename);
            ScreenShotService.this.savePic(mbitmap, filename);
            this.mbitmap.recycle();
            this.mbitmap = null;
        }
    }
}

PlayActivity.java

package com.screenshot.ui;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;

import com.screenshot.R;

public class PlayActivity extends Activity {
    private PlayActivityHandler mHandler;
    private ImageView play_iv;
    private File[] arrayOfFile2;

    private File[] getFileList() {
        File localFile1 = Environment.getExternalStorageDirectory();
        File localFile2 = new File(localFile1, ScreenShotService.SSS_FILE_PATH);
        File[] arrayOfFile;
        if (!localFile2.exists()) {
            return null;
        }
        arrayOfFile = localFile2.listFiles();
        Arrays.sort(arrayOfFile, new Comparator<File>() {

            @Override
            public int compare(File paramFile1, File paramFile2) {
                long file1name = Long.valueOf(getFileNameNoEx(paramFile1
                        .getName()));
                long file2name = Long.valueOf(getFileNameNoEx(paramFile2
                        .getName()));
                return (int) (file1name - file2name);
            }

        });
        return arrayOfFile;
    }

    private void play() {
        arrayOfFile2 = getFileList();
        mHandler.setCount(0);
        mHandler.sendEmptyMessageDelayed(ScreenShotService.SSS_MSG_WHAT,
                ScreenShotService.SSS_DELAY_MILLIS);
    }

    public String getExtensionName(String paramString) {
        if ((paramString != null) && (paramString.length() > 0)) {
            int i = paramString.lastIndexOf(‘.‘);
            if (i > -1) {
                int j = paramString.length() + -1;
                if (i < j) {
                    int k = i + 1;
                    paramString = paramString.substring(k);
                }
            }
        }
        return paramString;
    }

    public String getFileNameNoEx(String paramString) {
        if ((paramString != null) && (paramString.length() > 0)) {
            int i = paramString.lastIndexOf(‘.‘);
            if (i > -1) {
                int j = paramString.length();
                if (i < j)
                    paramString = paramString.substring(0, i);
            }
        }
        return paramString;
    }

    protected void onCreate(Bundle paramBundle) {
        super.onCreate(paramBundle);
        // 设置无标题
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        // 设置全屏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.play);
        this.play_iv = (ImageView) findViewById(R.id.play_iv);
        mHandler = new PlayActivityHandler();
        play();
    }

    private class PlayActivityHandler extends Handler {
        private int count = 0;
        //private Bitmap localBitmap;
        public void setCount(int vaule) {
            count = vaule;
        }

        @Override
        public void handleMessage(Message msg) {
            if (arrayOfFile2 != null && count < arrayOfFile2.length) {                
                Bitmap localBitmap = BitmapFactory
                        .decodeFile(arrayOfFile2[count++].getAbsolutePath());
                play_iv.setImageBitmap(localBitmap);
                mHandler.sendEmptyMessageDelayed(
                        ScreenShotService.SSS_MSG_WHAT,
                        ScreenShotService.SSS_DELAY_MILLIS);                
            }
        }

    }
}

 

【转】利用windowManager实现录屏

上一篇:grunt对象之api


下一篇:Inno 设置文件或注册表ACL(访问控制权限)