package com.example.ndh.floatingball.sdk.screenshot;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
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.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.Surface;
import android.widget.Toast;
import com.example.ndh.floatingball.R;
import com.example.ndh.floatingball.util.PermissionUtils;
import com.example.ndh.floatingball.util.Utils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
/**
* Created by ndh on 17/1/9.
*/
public class ScreenShotActivity extends Activity implements PermissionUtils.PermissionGrant {
private MediaProjectionManager mManager;
private ImageReader mImageReader;
private Image mImage;
VirtualDisplay mVirtualDisplay;
private Surface mSurface;
private static final int SUCESS = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//6.0 动态权限
getWindow().setStatusBarColor(Color.TRANSPARENT);
super.onCreate(savedInstanceState);
if (!PermissionUtils.checkPermission(ScreenShotActivity.this, PermissionUtils.CODE_WRITE_EXTERNAL_STORAGE, "请先授予存储空间权限")) {
return;
}
mManager = (MediaProjectionManager) getApplicationContext().getSystemService(Context.MEDIA_PROJECTION_SERVICE);
Intent intent = mManager.createScreenCaptureIntent();
startActivityForResult(intent, 0);
mImageReader = ImageReader.newInstance(Utils.getScreenSize(this).x, Utils.getScreenSize(this).y, 0x1, 2);
mSurface = mImageReader.getSurface();
}
@Override
protected void onActivityResult(int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Toast.makeText(this, "正在生成截图...", Toast.LENGTH_SHORT).show();
new Thread() {
@Override
public void run() {
savePic(resultCode, data);
}
}.start();
}
private void savePic(int resultCode, Intent data) {
final MediaProjection mediaProjection = mManager.getMediaProjection(resultCode, data);
if (mediaProjection == null) {
Log.e("@@", "media projection is null");
return;
}
//ImageFormat.RGB_565
mVirtualDisplay = mediaProjection.createVirtualDisplay("ndh",
Utils.getScreenSize(this).x, Utils.getScreenSize(this).y, Utils.getScreenInfo(this).densityDpi, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC,
mSurface, null, null);
Handler handler2 = new Handler(getMainLooper());
handler2.postDelayed(new Runnable() {
public void run() {
//capture the screen
mImage = mImageReader.acquireLatestImage();
if (mImage == null) {
Log.d("ndh--", "img==null");
return;
}
int width = mImage.getWidth();
int height = mImage.getHeight();
final Image.Plane[] planes = mImage.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);
mImage.close();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");
String strDate = dateFormat.format(new java.util.Date());
String pathImage = Environment.getExternalStorageDirectory().getPath() + "/DCIM/";
String nameImage = pathImage + strDate + ".png";
if (bitmap != null) {
try {
File dir = new File(pathImage);
if (!dir.exists() && !dir.mkdirs()) {
//最多创建两次文件夹
dir.mkdirs();
}
File fileImage = new File(nameImage);
if (!fileImage.exists() && !fileImage.createNewFile()) {
fileImage.createNewFile();
}
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);
ScreenShotActivity.this.sendBroadcast(media);
Toast.makeText(ScreenShotActivity.this, "图片保存成功:" + nameImage, Toast.LENGTH_SHORT).show();
mediaProjection.stop();
finish();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
finish();
}
}
}
}, 50);
}
@Override
public void onPermissionGranted(int requestCode) {
switch (requestCode) {
case SUCESS:
break;
}
}
}