読者です 読者をやめる 読者になる 読者になる

【Android】スクリーンショットを外部ストレージに保存する

 

スクリーンショットを外部ストレージに保存するまでの説明です。

 

キーワード

・DisplayMetrics

・MediaProjection

・ImageReader

・VirtualDisplay

 

実装

private MediaProjectionManager mpm;
private MediaProjection mp;
private ImageReader ir;
private VirtualDisplay vd;
private int screenDensity;
private int displayWidth;
private int displayHeight;

 

 

private void setDisplayMetrics() {
  //画面の縦横サイズを取得
  DisplayMetrics dm = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(dm);
  screenDensity = dm.densityDpi;
  displayWidth = dm.widthPixels;
  displayHeight = dm.heightPixels;
}

private void setMediaProjection(int resultCode, Intent intent) {
  mpm =  (MediaProjectionManager)getSystemService(MEDIA_PROJECTION_SERVICE);
  mp = mpm.getMediaProjection(resultCode, intent);
}

private void setVirtualDisplay() {
  ir = ImageReader.newInstance(displayWidth, displayHeight, PixelFormat.RGBA_8888, 2);
  vd = mp.createVirtualDisplay(
     "ScreenShot",
     displayWidth,
     displayHeight,
     screenDensity,
     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
     ir.getSurface(),
     null,
     null);
}

private void getScreenshotMain() {
  Image image = ir.acquireLatestImage();
  if (image != null) {
    Image.Plane[] planes = image.getPlanes();
    ByteBuffer buffer = planes[0].getBuffer();
    int pixelStride = planes[0].getPixelStride();
    int rowStride = planes[0].getRowStride();
    int rowPadding = rowStride - pixelStride * displayWidth;
    //バッファからBitmapを生成
    Bitmap bitmap = Bitmap.createBitmap(
        displayWidth + rowPadding / pixelStride,
        displayHeight,
        Bitmap.Config.ARGB_8888);
    bitmap.copyPixelsFromBuffer(buffer);
    image.close();

    saveImage(bitmap);
  }
}

private File saveImage(Bitmap bitmap) {
  //画像を外部ストレージに保存
  DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
  Date date = new Date(System.currentTimeMillis());
  String timeStamp = df.format(date);
  String name = timeStamp + ".png";
  File imageFile = getImageDir(name);
  try {
    FileOutputStream out = new FileOutputStream(imageFile);
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.close();
  } catch (Exception e) {
    e.printStackTrace();
  }

  //ContentResolverは端末の起動時に更新されるので
  //スクリーンショット取得時にContentResolverを更新する

  String imagePath = imageFile.getAbsolutePath();
  String imageName = imageFile.getName();
  String imageTitle = imageName.substring(0, imageName.indexOf("."));
  ContentResolver cr = getContentResolver();
  ContentValues values = new ContentValues();
  values.put(MediaStore.Images.ImageColumns.DATA, imagePath);
  values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, imageName);
  values.put(MediaStore.Images.ImageColumns.TITLE, imageTitle);
  values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/png");
  cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  return imageFile;
}

public File getImageDir(String imageName) {
  File imagefile = new File("/storage/emulated/0/Pictures/Screenshots/" + imageName);
  try {
    imagefile.createNewFile();
  } catch (IOException e) {
    e.printStackTrace();
  }
  return imagefile;
}

 

以上です。