269 views
この記事は最終更新から 575日 が経過しています。
1. やりたいこと
自作の Androidアプリの中でカメラを起動して写真撮影し、そのデータを取得&自由に処理したい。
メモリ上の Bitmapデータとして取得できるそうなので、これをやってみたい。
2. やってみる
(1) AndroidManifest.xml
カメラの使用許可設定をする。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.CAMERA" /> <queries> <intent> <action android:name="android.media.action.IMAGE_CAPTURE" /> </intent> </queries> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules"
(2) MainActivity.java #1 カメラ起動ボタンを押下時の処理
※actResultLauncher は後述する。
public void onPushCameraButton(View view){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); actResultLauncher.launch(intent); }
(3) MainActivity.java #2 カメラ撮影完了時の処理
※saveImage は後述する。
private final ActivityResultLauncher<Intent> actResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); if(data != null) { // 撮影した画像データを Bitmapで取得する。 Bundle extras = data.getExtras(); bmpImg = (Bitmap)extras.get("data"); // 撮影した画像データを画面上に表示する。 ImageView iv = findViewById(R.id.iv_pic); iv.setImageBitmap(bmpImg); // 撮影した画像データをファイルに保存する。 saveImage(bmpImg); } } });
(4) MainActivity.java #3 Bitmapデータを画像ファイル保存する処理
private void saveImage(Bitmap bitmap) { // アプリ専用の内部ストレージのディレクトリに画像ファイルを保存する。 File appDir = getFilesDir(); String filePath = String.format("%s/myimg.jpg", appDir.toString()); // ファイルオープンし、JPEG最高品質(100)で画像ファイル出力する。 try(FileOutputStream fos = new FileOutputStream(new File(filePath))){ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); } catch (Exception e) { e.printStackTrace(); } }
(5) MainActivity.java #4 画像ファイルをロードし、ImageViewに表示する。
private void loadImageToView(){ // アプリ専用の内部ストレージのディレクトリ内の画像ファイル名を作成 File appDir = getFilesDir(); String filePath = String.format("%s/myimg.jpg", appDir.toString()); // Bitmapオプションを設定 BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; // 画像ファイルを Bitmapで読み出す。 Bitmap bitmap = BitmapFactory.decodeFile(filePath, options); // Bitmap画像データを ImageViewに表示する。 ImageView iv = findViewById(R.id.iv_pic); iv.setImageBitmap(bitmap); }
3. 付録 : 動作確認済みの全コードは以下の通り。
package com.example.testcamera; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.widget.ImageView; import java.io.File; import java.io.FileOutputStream; public class MainActivity extends AppCompatActivity { private Bitmap bmpImg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loadImageToView(); } public void onPushCameraButton(View view){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); actResultLauncher.launch(intent); } private final ActivityResultLauncher<Intent> actResultLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); if(data != null) { // 撮影した画像データを Bitmapで取得する。 Bundle extras = data.getExtras(); bmpImg = (Bitmap)extras.get("data"); // 撮影した画像データを画面上に表示する。 ImageView iv = findViewById(R.id.iv_pic); iv.setImageBitmap(bmpImg); // 撮影した画像データをファイルに保存する。 saveImage(bmpImg); } } }); private void saveImage(Bitmap bitmap) { // アプリ専用の内部ストレージのディレクトリに画像ファイルを保存する。 File appDir = getFilesDir(); String filePath = String.format("%s/myimg.jpg", appDir.toString()); // ファイルオープンし、JPEG最高品質(100)で画像ファイル出力する。 try(FileOutputStream fos = new FileOutputStream(new File(filePath))){ bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); } catch (Exception e) { e.printStackTrace(); } } private void loadImageToView(){ // アプリ専用の内部ストレージのディレクトリ内の画像ファイル名を作成 File appDir = getFilesDir(); String filePath = String.format("%s/myimg.jpg", appDir.toString()); // Bitmapオプションを設定 BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; // 画像ファイルを Bitmapで読み出す。 Bitmap bitmap = BitmapFactory.decodeFile(filePath, options); // Bitmap画像データを ImageViewに表示する。 ImageView iv = findViewById(R.id.iv_pic); iv.setImageBitmap(bitmap); } }