▼Androidメモ▼
カメラの利用



カメラを利用するプログラムを作成する。


ソースコード

CameraEx.java
package net.npaka.cameraex;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

//カメラの制御
public class CameraEx extends Activity {
    //アクティビティ起動時に呼ばれる
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(new CameraView(this));
    }
}



CameraView.java
package net.npaka.cameraex;
import android.content.Context;
import android.hardware.Camera;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.FileOutputStream;

//カメラの制御
public class CameraView extends SurfaceView 
    implements SurfaceHolder.Callback,Camera.PictureCallback {
    private SurfaceHolder holder;//ホルダー
    private Camera        camera;//カメラ
    
    //コンストラクタ
    public CameraView(Context context) {
        super(context);
        
        //サーフェイスホルダーの生成
        holder=getHolder();
        holder.addCallback(this);
        
        //プッシュバッッファの指定
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    //サーフェイス生成イベントの処理
    public void surfaceCreated(SurfaceHolder holder) {
        //カメラの初期化
        try {
            camera=Camera.open();
            camera.setPreviewDisplay(holder);
        } catch (Exception e) {
        }
    }

    //サーフェイス変更イベントの処理
    public void surfaceChanged(SurfaceHolder holder,int format,int w,int h) {
        //カメラプレビューの開始
        camera.startPreview();
    }
    
    //サーフェイス解放イベントの処理
    public void surfaceDestroyed(SurfaceHolder holder) {
        //カメラのプレビュー停止
        camera.setPreviewCallback(null);
        camera.stopPreview();
        camera.release();
        camera=null;
    }
    
    //タッチ時に呼ばれる
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction()==MotionEvent.ACTION_DOWN) {
            //カメラのスクリーンショットの取得
            camera.takePicture(null,null,this); 
        }
        return true;
    }

    //写真撮影完了時に呼ばれる
    public void onPictureTaken(byte[] data,Camera camera) {
        //ファイル保存とギャラリーへの登録
        try {
            String path=Environment.
                getExternalStorageDirectory()+"/test.jpg";
            data2file(data,path);
        } catch (Exception e) {
        }
        //プレビュー再開
        camera.startPreview();
    }

    //バイトデータ→ファイル
    private void data2file(byte[] w,String fileName) 
        throws Exception {
        FileOutputStream out=null;
        try {
            out=new FileOutputStream(fileName);
            out.write(w);
            out.close();
        } catch (Exception e) {
            if (out!=null) out.close();
            throw e;
        }
    }

}


AndroidManifest.xml
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.npaka.cameraex"
    android:versionCode="1"
    android:versionName="1.0">
    <application 
        android:icon="@drawable/icon" 
        android:label="@string/app_name">
        <activity 
            android:name=".CameraEx"
            android:label="@string/app_name"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-sdk android:minSdkVersion="7" />

    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest> 


−戻る−