应用内截屏
/**
* 进行截取屏幕
*
* @param pActivity
* @return bitmap
*/
public static Bitmap takeScreenShot(Activity pActivity) {
Bitmap bitmap;
View view = pActivity.getWindow().getDecorView();
// 设置是否可以进行绘图缓存
view.setDrawingCacheEnabled(true);
// 如果绘图缓存无法,强制构建绘图缓存
view.buildDrawingCache();
// 返回这个缓存视图
bitmap = view.getDrawingCache();
int width = pActivity.getWindowManager().getDefaultDisplay().getWidth();
int height = pActivity.getWindowManager().getDefaultDisplay().getHeight();
// 获取状态栏高度
Rect frame = new Rect();
// 测量屏幕宽和高
view.getWindowVisibleDisplayFrame(frame);
int stautsHeight = frame.top;
Log.d("jiangqq", "状态栏的高度为:" + stautsHeight);
bitmap = Bitmap.createBitmap(bitmap, 0, stautsHeight, width, height - stautsHeight);
return bitmap;
}
三部分,部分来源网络摘抄~后期改造
package com.example.myapplication;
import android.annotation.TargetApi;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.PixelFormat;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.Image;
import android.media.ImageReader;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.RequiresApi;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
public class Service1 extends Service {
private LinearLayout mFloatLayout = null;
private WindowManager.LayoutParams wmParams = null;
private WindowManager mWindowManager = null;
private LayoutInflater inflater = null;
private ImageButton mFloatView = null;
private static final String TAG = "MainActivity";
private SimpleDateFormat dateFormat = null;
private String strDate = null;
private String pathImage = null;
private String nameImage = null;
private MediaProjection mMediaProjection = null;
private VirtualDisplay mVirtualDisplay = null;
public static int mResultCode = 0;
public static Intent mResultData = null;
public static MediaProjectionManager mMediaProjectionManager1 = null;
private WindowManager mWindowManager1 = null;
private int windowWidth = 0;
private int windowHeight = 0;
private ImageReader mImageReader = null;
private DisplayMetrics metrics = null;
private int mScreenDensity = 0;
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
createFloatView();
createVirtualEnvironment();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
private void createFloatView() {
wmParams = new WindowManager.LayoutParams();
mWindowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE);
wmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
wmParams.format = PixelFormat.RGBA_8888;
wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
wmParams.gravity = Gravity.LEFT | Gravity.TOP;
wmParams.x = 0;
wmParams.y = 0;
wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
inflater = LayoutInflater.from(getApplication());
mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout, null);
mWindowManager.addView(mFloatLayout, wmParams);
mFloatView = (ImageButton) mFloatLayout.findViewById(R.id.float_id);
mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0,
View.MeasureSpec.UNSPECIFIED), View.MeasureSpec
.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
mFloatView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
wmParams.x = (int) event.getRawX() - mFloatView.getMeasuredWidth() / 2;
wmParams.y = (int) event.getRawY() - mFloatView.getMeasuredHeight() / 2 - 25;
mWindowManager.updateViewLayout(mFloatLayout, wmParams);
return false;
}
});
mFloatView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// hide the button
mFloatView.setVisibility(View.INVISIBLE);
Handler handler1 = new Handler();
handler1.postDelayed(new Runnable() {
public void run() {
//start virtual
startVirtual();
}
}, 500);
Handler handler2 = new Handler();
handler2.postDelayed(new Runnable() {
public void run() {
//capture the screen
startCapture();
}
}, 1500);
Handler handler3 = new Handler();
handler3.postDelayed(new Runnable() {
public void run() {
mFloatView.setVisibility(View.VISIBLE);
//stopVirtual();
}
}, 1000);
}
});
Log.i(TAG, "created the float sphere view");
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void createVirtualEnvironment() {
dateFormat = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");
strDate = dateFormat.format(new java.util.Date());
pathImage = Environment.getExternalStorageDirectory().getPath() + "/Pictures/";
nameImage = pathImage + strDate + ".png";
mMediaProjectionManager1 = (MediaProjectionManager) getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);
mWindowManager1 = (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
windowWidth = mWindowManager1.getDefaultDisplay().getWidth();
windowHeight = mWindowManager1.getDefaultDisplay().getHeight();
metrics = new DisplayMetrics();
mWindowManager1.getDefaultDisplay().getMetrics(metrics);
mScreenDensity = metrics.densityDpi;
mImageReader = ImageReader.newInstance(windowWidth, windowHeight, 0x1, 2); //ImageFormat.RGB_565
Log.i(TAG, "prepared the virtual environment");
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void startVirtual() {
if (mMediaProjection != null) {
Log.i(TAG, "want to display virtual");
virtualDisplay();
} else {
Log.i(TAG, "start screen capture intent");
Log.i(TAG, "want to build mediaprojection and display virtual");
setUpMediaProjection();
virtualDisplay();
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public void setUpMediaProjection() {
mResultData = ((ScreenShot) getApplication()).getIntent();
mResultCode = ((ScreenShot) getApplication()).getResult();
mMediaProjectionManager1 = ((ScreenShot) getApplication()).getMediaProjectionManager();
mMediaProjection = mMediaProjectionManager1.getMediaProjection(mResultCode, mResultData);
Log.i(TAG, "mMediaProjection defined");
}
@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");
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void startCapture() {
strDate = dateFormat.format(new java.util.Date());
nameImage = pathImage + strDate + ".png";
Image image = mImageReader.acquireLatestImage();
int width = image.getWidth();
int 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, 0, 0, width, height);
image.close();
Log.i(TAG, "image data captured");
if (bitmap != null) {
try {
/**
* 创建文件夹
*/
File file = new File(pathImage);
if(!file.exists()){
file.mkdirs();
}
File fileImage = new File(nameImage);
if (!fileImage.exists()) {
fileImage.createNewFile();
Log.i(TAG, "image file created");
}
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);
this.sendBroadcast(media);
Log.i(TAG, "screen image saved");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void tearDownMediaProjection() {
if (mMediaProjection != null) {
mMediaProjection.stop();
mMediaProjection = null;
}
Log.i(TAG, "mMediaProjection undefined");
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void stopVirtual() {
if (mVirtualDisplay == null) {
return;
}
mVirtualDisplay.release();
Log.i(TAG, "virtual display stopped");
}
@Override
public void onDestroy() {
// to remove mFloatLayout from windowManager
super.onDestroy();
if (mFloatLayout != null) {
mWindowManager.removeView(mFloatLayout);
}
tearDownMediaProjection();
Log.i(TAG, "application destroy");
}
}
Application
package com.example.myapplication;
import android.app.Application;
import android.content.Intent;
import android.media.projection.MediaProjectionManager;
/**
* Project_name: MyApplication2
* Date: 2017/5/2717:20
* Email: xiaoxilong5201314@163.com.
* Author: Aaron Empire
* Description: TODO
*/
public class ScreenShot extends Application {
private int result;
private Intent intent;
private MediaProjectionManager mMediaProjectionManager;
public int getResult() {
return result;
}
public Intent getIntent() {
return intent;
}
public MediaProjectionManager getMediaProjectionManager() {
return mMediaProjectionManager;
}
public void setResult(int result1) {
this.result = result1;
}
public void setIntent(Intent intent1) {
this.intent = intent1;
}
public void setMediaProjectionManager(MediaProjectionManager mMediaProjectionManager) {
this.mMediaProjectionManager = mMediaProjectionManager;
}
}
Activity
package com.example.myapplication;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.media.projection.MediaProjectionManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
public class MainActivity extends ActionBarActivity {
private int result = 0;
private Intent intent = null;
private int REQUEST_MEDIA_PROJECTION = 1;
private MediaProjectionManager mMediaProjectionManager;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMediaProjectionManager = (MediaProjectionManager)getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);
startIntent();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void startIntent(){
if(intent != null && result != 0){
((ScreenShot)getApplication()).setResult(result);
((ScreenShot)getApplication()).setIntent(intent);
Intent intent = new Intent(getApplicationContext(), Service1.class);
startService(intent);
}else{
startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
((ScreenShot)getApplication()).setMediaProjectionManager(mMediaProjectionManager);
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_MEDIA_PROJECTION) {
if (resultCode != Activity.RESULT_OK) {
return;
}else if(data != null && resultCode != 0){
result = resultCode;
intent = data;
((ScreenShot)getApplication()).setResult(resultCode);
((ScreenShot)getApplication()).setIntent(data);
Intent intent = new Intent(getApplicationContext(), Service1.class);
startService(intent);
// finish();
}
}
}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageButton
android:id="@+id/float_id"
android:layout_width="150dp"
android:background="@mipmap/ball"
android:layout_height="150dp" />
</LinearLayout>
运行结果