diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 160c466..75b22a4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,9 +17,6 @@ android:supportsRtl="true" android:theme="@style/Theme.Acanthus" android:usesCleartextTraffic="true"> - diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/MainActivity.java b/app/src/main/java/org/ntlab/acanthus_client/views/MainActivity.java index b56eb3c..fc7e634 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/MainActivity.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/MainActivity.java @@ -3,18 +3,11 @@ import android.content.Intent; import android.os.Bundle; import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Button; import com.google.android.material.bottomnavigation.BottomNavigationView; -import org.ntlab.acanthus_client.Acanthus; import org.ntlab.acanthus_client.R; import org.ntlab.acanthus_client.databinding.ActivityMainBinding; -import org.ntlab.acanthus_client.views.main_menu_ui.mypage.MyPageFragment; -import org.ntlab.acanthus_client.views.paint.SendScreenShotActivity; -import org.ntlab.acanthus_client.views.userpage.UserPageActivity; import androidx.appcompat.app.AppCompatActivity; import androidx.navigation.NavController; diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java index 0f67059..8259980 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java @@ -9,8 +9,7 @@ import android.view.View; import android.widget.Button; import android.widget.TextView; - -import com.google.android.material.bottomnavigation.BottomNavigationView; +import android.widget.Toast; import org.ntlab.acanthus_client.Acanthus; import org.ntlab.acanthus_client.R; @@ -22,6 +21,7 @@ private PaintCanvas paintCanvas; private PaintToolBar paintToolBar; + private PaintScreenShot paintScreenShot; private ActivityPaintBinding binding; private PaintViewModel paintViewModel; @@ -31,6 +31,7 @@ public void onDestroy() { super.onDestroy(); paintViewModel.stop(); + paintScreenShot.onDestroy(); } //----------------------------------------------------------------- @@ -40,11 +41,13 @@ init(); initView(); + paintScreenShot.onCreate(); + Button button = findViewById(R.id.button_keep); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent intent = new Intent(getApplication(), SendScreenShotActivity.class); + Intent intent = new Intent(getApplication(), PaintScreenShot.class); startActivity(intent); } }); @@ -97,6 +100,7 @@ paintCanvas = (PaintCanvas) findViewById(R.id.myCanvas); paintCanvas.setPaintViewModel(paintViewModel); + paintScreenShot = new PaintScreenShot(this); paintToolBar = new PaintToolBar(this, paintCanvas); } @@ -121,5 +125,9 @@ } //------------------------------------------------------------------ - + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + paintScreenShot.onActivityResult(requestCode, resultCode, data); + } } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintScreenShot.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintScreenShot.java new file mode 100644 index 0000000..67cd22d --- /dev/null +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintScreenShot.java @@ -0,0 +1,141 @@ +package org.ntlab.acanthus_client.views.paint; + +import androidx.appcompat.app.AppCompatActivity; + +import android.app.Activity; +import android.graphics.ImageFormat; +import android.os.Bundle; +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.util.DisplayMetrics; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.Toast; + +import com.google.android.material.bottomnavigation.BottomNavigationView; + +import org.ntlab.acanthus_client.R; + +import java.nio.ByteBuffer; + +import static android.app.Activity.RESULT_OK; +import static android.content.Context.MEDIA_PROJECTION_SERVICE; +import static android.graphics.ImageFormat.JPEG; + + +public class PaintScreenShot { + + private AppCompatActivity appCompatActivity; + private MediaProjectionManager mpManager; + private MediaProjection mProjection; + private static final int REQUEST_MEDIA_PROJECTION = 1001; + + private int displayWidth, displayHeight; + private ImageReader imageReader; + private VirtualDisplay virtualDisplay; + private int screenDensity; + private ImageView imageView; + + public PaintScreenShot(AppCompatActivity appCompatActivity) { + this.appCompatActivity = appCompatActivity; + } + + public void onCreate() { + + Button button = appCompatActivity.findViewById(R.id.capture); + // ボタンタップでスクリーンショットを撮る + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + getScreenshot(); + } + }); + + // 撮影したスクリーンを表示するImageView + imageView = appCompatActivity.findViewById(R.id.image); + + // 画面の縦横サイズとdpを取得 + DisplayMetrics displayMetrics = new DisplayMetrics(); + appCompatActivity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + screenDensity = displayMetrics.densityDpi; + displayWidth = displayMetrics.widthPixels; + displayHeight = displayMetrics.heightPixels; + + mpManager = (MediaProjectionManager) + appCompatActivity.getSystemService(MEDIA_PROJECTION_SERVICE); + + // permissionを確認するintentを投げ、ユーザーの許可・不許可を受け取る + if(mpManager != null){ + appCompatActivity.startActivityForResult(mpManager.createScreenCaptureIntent(), + REQUEST_MEDIA_PROJECTION); + } + } + + // ユーザーの許可を受け取る + public void onActivityResult(int requestCode, int resultCode, Intent data) { + + if (REQUEST_MEDIA_PROJECTION == requestCode) { + if (resultCode != RESULT_OK) { + // 拒否された + Toast.makeText(appCompatActivity, + "User cancelled", Toast.LENGTH_LONG).show(); + return; + } + // 許可された結果を受け取る + setUpMediaProjection(resultCode, data); + } + } + + private void setUpMediaProjection(int code, Intent intent) { + mProjection = mpManager.getMediaProjection(code, intent); + setUpVirtualDisplay(); + } + + private void setUpVirtualDisplay() { + imageReader = ImageReader.newInstance( + displayWidth, displayHeight, 0x1, 2); + + virtualDisplay = mProjection.createVirtualDisplay("ScreenCapture", + displayWidth, displayHeight, screenDensity, + DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, + imageReader.getSurface(), null, null); + } + + private void getScreenshot() { + // ImageReaderから画面を取り出す + Log.d("debug", "getScreenshot"); + + Image image = imageReader.acquireLatestImage(); + 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(); + + imageView.setImageBitmap(bitmap); + } + + public void onDestroy() { + if (virtualDisplay != null) { + Log.d("debug","release VirtualDisplay"); + virtualDisplay.release(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/SendScreenShotActivity.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/SendScreenShotActivity.java deleted file mode 100644 index a98df51..0000000 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/SendScreenShotActivity.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.ntlab.acanthus_client.views.paint; - -import androidx.appcompat.app.AppCompatActivity; - -import android.app.Activity; -import android.graphics.ImageFormat; -import android.os.Bundle; -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.util.DisplayMetrics; -import android.util.Log; -import android.view.View; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.Toast; - -import org.ntlab.acanthus_client.R; - -import java.nio.ByteBuffer; - -import static android.graphics.ImageFormat.JPEG; - - -public class SendScreenShotActivity extends Activity { - - private MediaProjectionManager mpManager; - private MediaProjection mProjection; - private static final int REQUEST_MEDIA_PROJECTION = 1001; - - private int displayWidth, displayHeight; - private ImageReader imageReader; - private VirtualDisplay virtualDisplay; - private int screenDensity; - private ImageView imageView; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_send_screen_shot); - - Button button = findViewById(R.id.capture); - // ボタンタップでスクリーンショットを撮る - button.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - getScreenshot(); - } - }); - - // 撮影したスクリーンを表示するImageView - imageView = findViewById(R.id.image); - - // 画面の縦横サイズとdpを取得 - DisplayMetrics displayMetrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); - screenDensity = displayMetrics.densityDpi; - displayWidth = displayMetrics.widthPixels; - displayHeight = displayMetrics.heightPixels; - - mpManager = (MediaProjectionManager) - getSystemService(MEDIA_PROJECTION_SERVICE); - - // permissionを確認するintentを投げ、ユーザーの許可・不許可を受け取る - if(mpManager != null){ - startActivityForResult(mpManager.createScreenCaptureIntent(), - REQUEST_MEDIA_PROJECTION); - } - } - - // ユーザーの許可を受け取る - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - - if (REQUEST_MEDIA_PROJECTION == requestCode) { - if (resultCode != RESULT_OK) { - // 拒否された - Toast.makeText(this, - "User cancelled", Toast.LENGTH_LONG).show(); - return; - } - // 許可された結果を受け取る - setUpMediaProjection(resultCode, data); - } - } - - private void setUpMediaProjection(int code, Intent intent) { - mProjection = mpManager.getMediaProjection(code, intent); - setUpVirtualDisplay(); - } - - private void setUpVirtualDisplay() { - imageReader = ImageReader.newInstance( - displayWidth, displayHeight, 0x1, 2); - - virtualDisplay = mProjection.createVirtualDisplay("ScreenCapture", - displayWidth, displayHeight, screenDensity, - DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, - imageReader.getSurface(), null, null); - } - - private void getScreenshot() { - // ImageReaderから画面を取り出す - Log.d("debug", "getScreenshot"); - - Image image = imageReader.acquireLatestImage(); - 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(); - - imageView.setImageBitmap(bitmap); - } - - @Override - protected void onDestroy() { - if (virtualDisplay != null) { - Log.d("debug","release VirtualDisplay"); - virtualDisplay.release(); - } - super.onDestroy(); - } -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_paint.xml b/app/src/main/res/layout/activity_paint.xml index 9fb5a4c..e0165b2 100644 --- a/app/src/main/res/layout/activity_paint.xml +++ b/app/src/main/res/layout/activity_paint.xml @@ -103,5 +103,42 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="1.0" /> +