使用方式

mMediaProjection获取方式

mMediaProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);        startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), 1);    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        mResultCode = resultCode;        mResultData = data;        mMediaProjection = mMediaProjectionManager.getMediaProjection(mResultCode, mResultData);    }
view.setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                Log.i(TAG, "view.setOnLongClickListener");                new Handler().postDelayed(new Runnable() {                    @Override                    public void run() {                        captureUtil = new CaptureUtil().setUpMediaProjection(mContext, mMediaProjection);                        new Handler().postDelayed(new Runnable() {                            @Override                            public void run() {                                try {                                    captureUtil.startCapture();                                } catch (NullPointerException r) {                                    r.printStackTrace();                                }                            }                        }, 500);                    }                }, 500);                return false;            }        }
public class CaptureUtil {    private static final String TAG = "CaptureUtil";    private SimpleDateFormat dateFormat = null;    private String strDate = null;    private String pathImage = null;    private String nameImage = null;    private ImageReader mImageReader = null;    private MediaProjection mMediaProjection = null;    private VirtualDisplay mVirtualDisplay = null;    private int windowWidth = 0;    private int windowHeight = 0;    private int mScreenDensity = 0;    private DisplayMetrics metrics = null;    private WindowManager mWindowManager = null;    Context context;    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    public CaptureUtil setUpMediaProjection(Context context, MediaProjection mediaProjection) {        if (mediaProjection == null) {            Log.i(TAG, "MediaProjection null");            return null;        }        this.context = context;        mMediaProjection = mediaProjection;        createVirtualEnvironment();        virtualDisplay();        return CaptureUtil.this;    }    private void createVirtualEnvironment() {        dateFormat = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");        strDate = dateFormat.format(new java.util.Date());        Log.i(TAG, "pathImage : " + MApplication.getApplication().getExternalCacheDir().getPath() + "/Pictures/");        pathImage = MApplication.getApplication().getExternalCacheDir().getPath() + "/Pictures/";        nameImage = pathImage + strDate + ".png";        mWindowManager = (WindowManager) MApplication.getApplication().getSystemService(Context.WINDOW_SERVICE);        windowWidth = mWindowManager.getDefaultDisplay().getWidth();        windowHeight = mWindowManager.getDefaultDisplay().getHeight();        metrics = new DisplayMetrics();        mWindowManager.getDefaultDisplay().getMetrics(metrics);        mScreenDensity = metrics.densityDpi;        mImageReader = ImageReader.newInstance(windowWidth, windowHeight, 0x1, 2); //ImageFormat.RGB_565        if (mImageReader == null) {            Log.i(TAG, "ImageReader.newInstance null");        }        Log.i(TAG, "prepared the virtual environment");    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    private void virtualDisplay() {        mVirtualDisplay = mMediaProjection.createVirtualDisplay("screen-mirror",                windowWidth, windowHeight, mScreenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,                mImageReader.getSurface(), null, null);        Log.i(TAG, "virtual displayed");    }    //ImageReader.newInstance 不能直接调用acquireLatestImage.可能会出现null 需要加一定延迟    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    public Bitmap startCaptureBitmap() throws NullPointerException {        return startCaptureBitmap(0, 0, 0, 0);    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    public Bitmap startCaptureBitmap(int x, int y, int mWidth, int mHeight) throws NullPointerException {        strDate = dateFormat.format(new java.util.Date());        nameImage = pathImage + strDate + ".png";        Image image = mImageReader.acquireLatestImage();        long startTime = System.currentTimeMillis();        int num = 0;        //最好先创建captureUtil 示例 300ms后 在调用否则可能检查为空        if (image == null) {            for (; ; ) {                image = mImageReader.acquireLatestImage();                num++;                if (image != null || num > 30000)                    break;            }        }        long endTime = System.currentTimeMillis();        Log.e(TAG, endTime - startTime + "  time  num :" + num);        int width = 0;        int height = 0;        if (mWidth == 0 || mHeight == 0) {            width = image.getWidth();            height = image.getHeight();        }        final Image.Plane[] planes = image.getPlanes();        final ByteBuffer buffer = planes[0].getBuffer();        int pixelStride = planes[0].getPixelStride();        int rowStride = planes[0].getRowStride();        int rowPadding = rowStride - pixelStride * width;        Bitmap bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888);        bitmap.copyPixelsFromBuffer(buffer);        bitmap = Bitmap.createBitmap(bitmap, x<0?x:0, y<0?y:0, width, height);        image.close();        Log.i(TAG, "image data captured");        return bitmap;    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    public File startCapture() throws NullPointerException {        Bitmap bitmap = startCaptureBitmap();        return startCapture(bitmap);    }    @TargetApi(Build.VERSION_CODES.LOLLIPOP)    public File startCapture(Bitmap bitmap) throws NullPointerException {        File fileImage = null;        if (bitmap != null) {            try {                fileImage = new File(nameImage);                if(fileImage.getParentFile().exists()||fileImage.getParentFile().mkdirs()){                    if (!fileImage.exists()) {                        fileImage.createNewFile();                        Log.i(TAG, "image file created");                    }                }else {                    return null;                }                FileOutputStream out = new FileOutputStream(fileImage);                if (out != null) {                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);                    out.flush();                    out.close();                    Intent media = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);                    Uri contentUri = Uri.fromFile(fileImage);                    media.setData(contentUri);                    context.sendBroadcast(media);                    Log.i(TAG, "screen image saved");                }            } catch (FileNotFoundException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }        }        return fileImage;    }}

更多相关文章

  1. Android定时发送短信完整详细示例
  2. Android(安卓)cmwap网络方式下使用 webview
  3. Android拆分Bitmap完整示例
  4. BottomNavigationView+ViewPager打造底部导航栏
  5. Http 以post方式获取数据
  6. Android(安卓)RatingBar 使用示例
  7. JNI示例及讲解
  8. android获取网页数据的几种方式
  9. Android与Javascript交互示例(二)

随机推荐

  1. Android菜单详解(一)——理解Android中的Me
  2. 【Android(安卓)Developer】2.Android的
  3. Android(安卓)***测试学习手册(二)准备实验
  4. Android(安卓)核心分析(13) -----Android
  5. 关于 Android(安卓)程序员最近的状况
  6. android之Menu
  7. Android(安卓)Linux 内核介绍
  8. Android将允许纯C/C++开发应用
  9. android:layout_gravity 和 android:grav
  10. android升级adt和sdk之后无法识别SDK Loc