Android演習

8.実機で実行
8-1 カメラ・録音関係
1.写真の撮影
A. マニフェストの設定
【AndroidManifest.xml】
・・・
</application>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE" />"
</manifest>
B.関連クラス
クラス
概
要
android.hardware.Cameraクラス
static Camera open()
void setPreviewDisplay(SurfaceHolder sh)
void startPreview()
void stopPreview()
void takePicture(Camera.ShutterCallback shutter,
Camera.PictureCallback raw,
PictureCallback jpeg)
void release()
void setParameters(Camera.Parameter pr)
カメラをオープンする
サーフェースをプレビュー画面に設
定する
プレビューを開始する。
プレビューを停止する。
JPEG保存時の処理を指定して撮影を
行う。
カメラを解放する。
パラメータを設定する。
C.サーフェスビュー(SurfaceView)の作成と処理方法
①サーフェースが作成されたとき(surfaceCreate)
カメラをオープンし、画像サイズを設定する。
②サーフェースが変更されたとき(surfaceChanged)
プレビュー画面を設定して、プレビューを開始する。
③サーフェースが破棄されたとき(surfaceDestroy)
プレビューを停止し、カメラを解放する。
D.プログラム例(その1)
package jp.camera;
import
import
import
import
import
import
import
import
import
java.io.*;
java.util.*;
android.app.*;
android.os.*;
android.view.*;
android.view.View.*;
android.widget.*;
android.hardware.*;
android.hardware.Camera.*;
D.プログラム例(その2)
public class CameraActivity extends Activity {
Button button;
SurfaceView surfaceV;
SurfaceHolder surfaceH;
Camera camera;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout LL=new LinearLayout(this);
LL.setOrientation(LinearLayout.VERTICAL);
setContentView(LL);
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN);
button=new Button(this);
button.setText("撮影");
D.プログラム例(その3)
surfaceV=new SurfaceView(this);
surfaceH=surfaceV.getHolder();
surfaceH.addCallback(new cameraSurfaceHolderCallback());
//surfaceH.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
LL.addView(button);
LL.addView(surfaceV);
button.setOnClickListener(new cameraClickListener());
}
class cameraSurfaceHolderCallback implements
SurfaceHolder.Callback{
@Override
public void surfaceChanged(SurfaceHolder holder,
int format, int width, int height) {
D.プログラム例(その3)
try {
WindowManager windowM =
(WindowManager)getSystemService(WINDOW_SERVICE);
Display display=windowM.getDefaultDisplay();
int rot=display.getRotation();
int deg=0;
switch(rot){
case Surface.ROTATION_0 : deg= 90; break;
case Surface.ROTATION_90 : deg= 0; break;
case Surface.ROTATION_180 : deg=270; break;
case Surface.ROTATION_270 : deg=180; break;
}
camera.setDisplayOrientation(deg);
camera.setPreviewDisplay(surfaceV.getHolder());
Camera.Parameters param=camera.getParameters();
param.setPreviewSize(width, height);
camera.setParameters(param);
D.プログラム例(その4)
camera.startPreview();
}catch(Exception e){}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
Camera.Parameters param=camera.getParameters();
List<Size> psize=param.getSupportedPictureSizes();
Size s=psize.get(0);
param.setPictureSize(s.width,s.height);
camera.setParameters(param);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
}
}
D.プログラム例(その5)
class cameraClickListener implements OnClickListener{
@Override
public void onClick(View v) {
camera.takePicture(null, null, new cameraPictureCallback());
}
class cameraPictureCallback implements PictureCallback{
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try{
File dir =new File(
Environment.getExternalStorageDirectory(),
"cameraSample");
if(!dir.exists())dir.mkdir();
File f=new File(dir, "sample.jpeg");
FileOutputStream stream=new FileOutputStream(f);
stream.write(data);
D.プログラム例(その6)
Toast.makeText(getApplicationContext(),
"写真を保存しました", Toast.LENGTH_LONG);
stream.close();
camera.startPreview();
}catch(Exception e){}
}
}
}
}
2.音声の録音
A. マニフェストの設定
【AndroidManifest.xml】
・・・
</application>
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name=
"android.permission.RECORD_AUDIO" />
</manifest>
B. 音声録音の順序
オーディオソース(マイク)の設定
出力フォーマット(3GPP)設定
オーディオエンコーダ(AMR_NB)設定
C.関連クラス
クラス
概
要
android.media.MediaRecorderクラス
MediaRecorder()
void prepare()
void start()
void stop()
void reset()
void release()
void setAudioSource(int source)
void setOutputFormat(int format)
void setAudioEncode(int coder)
void setOutputFile(String path)
android.os.Environmentクラス
メディアレコーダ作成
準備
録音開始
録音停止
初期化
開放
オーディオソースの設定
出力フォーマット設定
オーディオエンコーダ設定
出力ファイル設定
static File getExternalStorageDirectory()
外部記憶のディレクトリ取得
D.プログラム例(その1)
package jp.Audio;
import java.io.*;
import android.app.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;
import android.media.*;
import android.media.MediaPlayer.*;
public class RecodeAudioActivity extends Activity {
Button[] button=new Button[3];
MediaPlayer mediaPlay;
MediaRecorder mediaRec;
File dir,file;
/** Called when the activity is first created. */
@Override
プログラム例(その2)
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout LL=new LinearLayout(this);
LL.setOrientation(LinearLayout.VERTICAL);
setContentView(LL);
button[0].setText("開始");button[0].setEnabled(true);
button[1].setText("停止");button[1].setEnabled(false);
button[2].setText("開始");button[2].setEnabled(true);
File dir=
new File(Environment.getExternalStorageDirectory(),
"AudioSample");
if(!dir.exists()) dir.mkdir();
file=new File(dir,"Audio.3gp");
for(int i=0;i<button.length;i++) LL.addView(button[i]);
button[0].setOnClickListener(new StartClickListener());
button[1].setOnClickListener(new PauseClickListener());
button[2].setOnClickListener(new PlayClickListener());
}
プログラム例(その3)
public void onResume()
{
super.onResume();
mediaPlay= new MediaPlayer();
mediaRec=new MediaRecorder();
mediaPlay.setOnCompletionListener(new AudioCompletionListener());
}
public void onPause(){
super.onPause(); mediaPlay.release(); mediaRec.release();
}
class AudioCompletionListener implements OnCompletionListener{
public void onCompletion(MediaPlayer mp){
button[0].setEnabled(true);
button[1].setEnabled(false);
button[2].setEnabled(true);
}
}
プログラム例(その4)
class StartClickListener implements OnClickListener
{ public void onClick(View v){
button[0].setEnabled(false); button[1].setEnabled(true);
button[2].setEnabled(false);
try{
mediaPlay.reset();
mediaRec.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRec.setOutputFormat(
MediaRecorder.OutputFormat.THREE_GPP);
mediaRec.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
String path = file.getAbsolutePath();
mediaRec.setOutputFile(path); mediaRec.prepare();
mediaPlay.setDataSource(path);
}catch(Exception e){}
mediaRec.start();
}
}
プログラム例(その5)
class PauseClickListener implements OnClickListener
{ public void onClick(View v){
button[0].setEnabled(true); button[1].setEnabled(false);
button[2].setEnabled(true);
mediaRec.stop(); mediaRec.reset();
}
}
class PlayClickListener implements OnClickListener
{ public void onClick(View v){
button[0].setEnabled(false); button[1].setEnabled(false);
button[2].setEnabled(false);
try{ mediaPlay.prepare();
}catch(Exception e){}
mediaPlay.start();
}
}
}
3.ビデオの撮影
A. マニフェストの設定
【AndroidManifest.xml】
・・・
</application>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
B. ビデオ撮影の順序
ビデオソース(カメラ)の設定
オーディオソース(マイク)の設定
出力フォーマット(3GPP)設定
オーディオエンコーダ(AMR_NB)設定
フレームレート(30)の設定
画像サイズ(幅と高さ)の設定
ビデオエンコーダ(MPEG_4_SP)設定
C.関連クラス
クラス
概
要
android.media.MediaRecorderクラス
void
void
void
void
setVideoSource(int source)
setVideoEncode(int coder)
setVideoFrameRate(int rate)
setVideoSize(int width, int height)
ビデオソースの設定
ビデオエンコーダ設定
フレームレート設定
ビデオサイズ設定
D.プログラム例(その1)
package jp.video;
import java.io.*;
import java.util.*;
import android.app.*;
import android.content.pm.*;
import android.os.*;
import android.view.*;
import android.view.View.*;
import android.widget.*;
import android.hardware.*;
import android.hardware.Camera.*;
import android.media.*;
public class VideoActivity extends Activity {
Button[] button=new Button[2];
SurfaceView surfaceV; SurfaceHolder surfaceH;
MediaRecorder mediaR; File dir, file;
Camera camera;
プログラム例(その2)
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout LL=new LinearLayout(this);
LL.setOrientation(LinearLayout.VERTICAL);
setContentView(LL);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
dir=new File(
Environment.getExternalStorageDirectory(),"VideoSample");
if(!dir.exists())dir.mkdir();
file=new File(dir, "VideoSample.3gp");
surfaceV=new SurfaceView(this);
surfaceH=surfaceV.getHolder();
プログラム例(その3)
for(int i=0;i<button.length; i++) button[i]=new Button(this);
button[0].setText("録画"); button[0].setEnabled(true);
button[1].setText("停止"); button[1].setEnabled(false);
mediaR=new MediaRecorder();
mediaR.setPreviewDisplay(surfaceH.getSurface());
for(int i=0;i<button.length;i++) LL.addView(button[i]);
button[0].setOnClickListener(new ClickListener0());
button[1].setOnClickListener(new ClickListener1());
}
public void onDestroy(){
super.onDestroy(); mediaR.release();
}
class ClickListener0 implements OnClickListener{
public void onClick(View v) {
button[0].setEnabled(false);
button[1].setEnabled(true);
プログラム例(その4)
try{mediaR.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaR.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaR.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mediaR.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
String path =file.getAbsolutePath();
camera =Camera.open();
Camera.Parameters param=camera.getParameters();
List<Size> psize=param.getSupportedPictureSizes();
Size s=psize.get(0);
camera.release();
mediaR.setVideoSize(s.width, s.height);
mediaR.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
mediaR.prepare();
mediaR.start();
}catch(Exception e){}
}
}
プログラム例(その5)
class ClickListener1 implements OnClickListener{
public void onClick(View arg0) {
try{
mediaR.stop();
button[0].setEnabled(true);
button[1].setEnabled(false);
}catch(Exception e){}
}
}
}