▼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.graphics.SurfaceTexture;
import android.hardware.Camera;
import android.media.MediaScannerConnection;
import android.os.Environment;
import android.view.MotionEvent;
import android.view.TextureView;
import android.widget.Toast;
import java.io.FileOutputStream;

//カメラとギャラリー
public class CameraView extends TextureView
implements TextureView.SurfaceTextureListener,Camera.PictureCallback {
private Camera camera;//カメラ

//コンストラクタ
public CameraView(Context context) {
super(context);

//テクスチャービューのリスナーの指定
setSurfaceTextureListener(this);
}

//サーフェイステクスチャ有効化時に呼ばれる
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface,int width,int height) {
//カメラの初期化
try {
camera=Camera.open();
camera.setPreviewTexture(surface);
camera.startPreview();
} catch (Exception e) {
}
}

//サーフェイステクスチャサイズ変更時に呼ばれる
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface,int width,int height) {
}

//サーフェイステクスチャ更新時に呼ばれる
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}

//サーフェイステクスチャ破棄時に呼ばれる
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
//カメラのプレビュー停止
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera=null;
return true;
}

//タッチ時に呼ばれる
@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 {
//SDカードへの保存
String path=Environment.getExternalStorageDirectory()+
"/test.jpg";
saveToSD(data,path);

//ギャラリーへの登録
MediaScannerConnection.scanFile(this.getContext(),
new String[]{path},
new String[]{"image/jpeg"},
null);
toast("撮影完了");
} catch (Exception e) {
toast(e.toString());
}

//プレビュー再開
camera.startPreview();
}

//SDカードへの保存
private void saveToSD(byte[] w,String path)
throws Exception {
FileOutputStream out=null;
try {
out=new FileOutputStream(path);
out.write(w);
out.close();
} catch (Exception e) {
if (out!=null) out.close();
throw e;
}
}

//トーストの表示 
private void toast(String text) {
Toast.makeText(getContext(),text,Toast.LENGTH_LONG).show();
}
}

AndroidManifest.xml
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.npaka.cameraex"
android:versionCode="1"
android:versionName="1.0">

<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="17" />

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

<application android:label="@string/app_name"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:theme="@style/AppTheme">

<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>

</manifest>


−戻る−