751 views
この記事は最終更新から 1129日 が経過しています。
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);
}
}
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2026-04-19: 1回 2026-04-18: 0回 2026-04-17: 2回 2026-04-16: 0回 2026-04-15: 0回 2026-04-14: 0回 2026-04-13: 0回
