前回作成したsurfaceviewを利用して、今度は画面にカメラの画像を表示したいと思います。
カメラを利用する為に、マニフェストを追加します。
<uses-permission android:name="android.permission.CAMERA" />
surfaceviewを継承したクラスを作成する。
package in.andante.camerapre; import android.content.Context; import android.hardware.Camera; import android.view.SurfaceHolder; import android.view.SurfaceView; public class CameraView extends SurfaceView implements SurfaceHolder.Callback{ private Camera myCamera; public CameraView(Context context){ super(context); getHolder().addCallback(this); getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } public void surfaceCreated(SurfaceHolder holder){ myCamera = Camera.open(); try { myCamera.setPreviewDisplay(holder); } catch (Exception e) { e.printStackTrace(); } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){ Camera.Parameters parameters = myCamera.getParameters(); parameters.setPreviewSize(width, height); myCamera.setParameters(parameters); myCamera.startPreview(); } public void surfaceDestroyed(SurfaceHolder holder){ myCamera.release(); myCamera = null; } }
上記でカメラを表示するViewを作成できました。
package in.andante.camerapre; import android.app.Activity; import android.os.Bundle; public class CameraPre extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CameraView view = new CameraView(this); setContentView(view); //setContentView(R.layout.main); } protected void onResume(){ super.onResume(); } protected void onStop(){ super.onStop(); } public void onDestroy(){ super.onDestroy(); } }
上記を実行すれば、画面にカメラのプレビューを表示したアプリができます。
ですが、なぜか撮影している画像が90度回転しています。
これは、アンドロイドのアプリのカメラが横画面を基準に作成がされているからです。
なので画面のモードを変更する為に、画面の向きを変更します。
の記事で、触れていますが、画面の向きを変更する為には
android:screenOrientation="landscape"
を設定します。(manifestです)
マニフェストのxmlは下記のようになりました。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="in.andante.camerapre" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.CAMERA"></uses-permission> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".CameraPre" 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>
以上です。
今回はpreviewの表示だったので、次は撮影をしてみたいと思います。