Transcript pptx
カメラと録音
6/22
前回の内容
データベースの利用
検索のオプション
ファイルの有無の確認
本日の内容
実機でアプリを動かす方法(端末側の設定)
カメラ機能
◦ パーミッションの設定
◦ 実機でアプリを動かす方法(eclipse側の設
定)
音声の録音
実機でアプリを動かす方法
自分の端末でアプリを動かすにはいく
つか設定が必要です
端末側の操作
自分の持っているAndroid端末を起動
しましょう
端末側の設定
設定画面を開きます
情報科学部の端末を使ってる人
はmenuボタンを押しSettingsを押
す
※端末により操作が異なるかもしれません
端末側の設定
アプリケーション
を選択します
アプリケーションの許可
提供元不明のアプリ
にチェックを入れま
す
さらに開発を押しま
す
USBデバッグの許可
USBデバッグに
チェックを入れます
これで端末側の設定は終わりです
カメラ機能
アプリケーションからカメラ機能を呼
び出し、実際に撮影することが出来ま
す
パーミッションの設定について
SDカードのデータを保存したり、カ
メラ機能を使ったりする場合は、パー
ミッション(権限の許可)の設定が必
要です
新しくプロジェクトを作る
CameraTestというプロ
ジェクトを作り自分の
端末のAPIレベルと同じ
か低いものを指定しま
す
情報科学部の端末を使
う人は1.6
プロジェクトが出来たら
CameraTestActivity.javaをコ
ピーしてください
パーミッションの設定
プロジェクトを開き、
AndroidManifest.xmlを開きます
パーミッションの設定について
下にある”許可”を押し、下のような画
面になることを確認します
パーミッションの設定について
追加を押すと下のような画面が出るの
でUserPermissionを選択しOKを押しま
す
パーミッションの設定について
右のメニューから
android.permission.CAMERAを選びます
パーミッションの設定について
選んだ状態で保存をすると左側の欄に
反映されます
これでアプリがカメラ機能を使えるようになりました
パーミッションの設定について
同じ要領でSDカードへの書き込みの
許可の設定をします
Eclipse側の設定
適当なプロジェクトを右クリックして
実行->実行の構成と選択します
実行する端末の選択方法の変更
ターゲットタブを開き、実行する端末
の選択を自動からマニュアルに変更し、
実行を押します
実行先の指定
すると実行時に、どの端末で実行する
か表示されるようになるので、自分の
端末を選びます
ソースコード
Button bt;
SurfaceView sv;
SurfaceHolder sh;
Camera cm;
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);
bt = new Button(this);
bt.setText("撮影");
sv = new SurfaceView(this);
sh = sv.getHolder();
sh.addCallback(new SampleSurfaceHolderCallback());
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
ll.addView(bt);
ll.addView(sv);
bt.setOnClickListener(new SampleClickListener());
}
①
ソースコード
class SampleSurfaceHolderCallback implements SurfaceHolder.Callback {
public void surfaceCreated(SurfaceHolder holder) {
②
cm = Camera.open();
Camera.Parameters pr = cm.getParameters();
Size s;
List<Size> supportedSizes = Reflect.getSupportedPreviewSizes(pr);
if (supportedSizes != null && supportedSizes.size() > 0) {
s = supportedSizes.get(0);
pr.setPreviewSize(s.width, s.height);
cm.setParameters(pr);
}
}
③
ソースコード
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {
②
try {
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
Display dp = wm.getDefaultDisplay();
int rt = Reflect.getRotation(dp);
int d = 0;
switch (rt) {
case Surface.ROTATION_0: d = 90; break;
case Surface.ROTATION_90: d = 0; break;
case Surface.ROTATION_180: d = 270; break;
case Surface.ROTATION_270: d = 180; break;
}
Reflect.setDisplayOrientation(cm, d);
cm.setPreviewDisplay(sv.getHolder());
Camera.Parameters pr = cm.getParameters();
pr.setPreviewSize(width, height);
cm.setParameters(pr);
cm.startPreview();
} catch (Exception e) {}
}}
④
ソースコード
class SampleClickListener implements OnClickListener {
public void onClick(View v) {
⑤
⑥
cm.takePicture(null, null, new SamplePictureCallback());
}
class SamplePictureCallback implements PictureCallback {
public void onPictureTaken(byte[] data, Camera c) {
try {
File dir = new File(Environment.getExternalStorageDirectory(),"CameraTest");
if (dir.exists() == false) {
dir.mkdir();
⑦
}
File f = new File(dir, "pic.jpg");
FileOutputStream fos = new FileOutputStream(f);
fos.write(data);
Toast.makeText(getApplicationContext(), "写真を保存しました。",
Toast.LENGTH_LONG).show();
fos.close();
cm.startPreview();
} catch (Exception e) {
}
}
}
}
①サーフェイスビューの生成
カメラのプレビューを表示するには
サーフェイスビューを作成する必要が
あります
SurfaceView sv;
SurfaceHolder sh;
sv = new SurfaceView(this);
sh = sv.getHolder();
sh.addCallback(new SampleSurfaceHolderCallback());
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
②サーフェイスビューを設定す
るメソッド
void surfaceCreated(SurfaceHolder)
◦ サーフェイス 生成時に呼び出される
カメラを起動し画像サイズを設定する
void surfaceChanged(SurfaceHolder, int, int, int)
◦ サーフェイスのサイズ等が変更された時に呼び
出される
プレビュー画面を設定して開始する
void surfaceDestroyed(SurfaceHolder)
◦ サーフェイス破棄時に呼び出される
プレビューを停止しカメラを解放する
③カメラの初期設定
サーフェイスビューを生成したらカメ
ラを起動し、画面のサイズを取得しま
す
cm = Camera.open();
//カメラの起動
Camera.Parameters pr = cm.getParameters();//初期パラメータの取得
pr.setPreviewSize(s.width, s.height);
cm.setParameters(pr);
//画面の大きさの設定
//パラメータの設定
④プレビューサイズや向きの変更
プレビューサイズなどが変更になった場
合は、SurfaceChangedメソッド内で動的
に変更されます
Reflect.setDisplayOrientation(cm, d);
//向きの変更
cm.setPreviewDisplay(sv.getHolder());
//プレビューの設定
Camera.Parameters pr = cm.getParameters();//パラメータの取得
pr.setPreviewSize(width, height);
//画面サイズの設定
cm.setParameters(pr);
//パラメータの設定
cm.startPreview();
//プレビューの開始
※Android2.0以前ではカメラは横向き専用らしい?
⑤ボタンを押した時の処理
撮影はtakePictureメソッドで実行され
ます
この例では撮影ボタンを押すと
SamplePicturecallbackクラスを呼び出し
ます
class SampleClickListener implements OnClickListener {
public void onClick(View v) {
cm.takePicture(null, null, new SamplePictureCallback());
}
⑥写真の撮影
写真を撮影するとonPictureTakenメソッドが
呼び出されます
撮影したデータはbyteの配列で保持されま
す
class SamplePictureCallback implements PictureCallback {
public void onPictureTaken(byte[] data, Camera c) {
}
}
⑦データの保存
撮ったデータは外部ストレージ(SD
カード)に保存します SDカードを指定するメソッド
File dir = new File(Environment.getExternalStorageDirectory(),
"CameraTest");
if (dir.exists() == false) {
dir.mkdir();
}
File f = new File(dir, "pic.jpg");
FileOutputStream fos = new FileOutputStream(f);
fos.write(data);
fos.close();
音声の録音
アプリで自分の音声を録音して再生す
ることも可能です
パーミッションの設定
プロジェクトを作成し図のように
WRITE_EXTERNAL_STORAGEと
RECORD_AUDIOを許可しましょう
実行結果
AudioTestActivity.javaを実
行してみましょう
開始を押し、停止を押す
までの間、録音ができま
す
録音した音声は再生を押
すと聞くことが出来ます
※音量に注意
ソースコード
MediaPlayer mp;
①
MediaRecorder mr;
File dir, f;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
setContentView(ll);
for (int i = 0; i < bt.length; i++) {
bt[i] = new Button(this);
}
bt[0].setText("開始");
bt[1].setText("停止");
bt[2].setText("再生");
bt[0].setEnabled(true);
bt[1].setEnabled(false);
bt[2].setEnabled(true);
File dir = new File(Environment.getExternalStorageDirectory(),"AudioTest");
if (dir.exists() == false) {
dir.mkdir();
}
f = new File(dir, "Sample.3gp");
②
ソースコード
public void onResume() {
super.onResume();
mp = new MediaPlayer();
mr = new MediaRecorder();
mp.setOnCompletionListener(new SampleCompletionListener());
}
③
public void onPause() {
super.onPause();
mp.release();
mr.release();
}
④
class SampleCompletionListener implements OnCompletionListener {
public void onCompletion(MediaPlayer mp) {
bt[0].setEnabled(true);
bt[1].setEnabled(false);
bt[2].setEnabled(true);
}
}
⑤
ソースコード
if (v == bt[0]) {
bt[0].setEnabled(false);
bt[1].setEnabled(true);
bt[2].setEnabled(false);
try {
mp.reset();
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
String path = f.getAbsolutePath();
⑥
mr.setOutputFile(path);
mr.prepare();
mp.setDataSource(path);
mr.start();
} catch (Exception e) {
}
ソースコード
else if (v == bt[1]) {
bt[0].setEnabled(true);
bt[1].setEnabled(false);
bt[2].setEnabled(true);
mr.stop();
mr.reset();
}
else if (v == bt[2]) {
bt[0].setEnabled(false);
bt[1].setEnabled(false);
bt[2].setEnabled(false);
try {
mp.prepare();
} catch (Exception e) {
}
mp.start();
}
⑦
⑧
①録音再生に必要なオブジェク
ト
録音や再生をするには、以下の2つの
クラスのオブジェクトが必要です
// 音を再生するオブジェクト
MediaPlayer mp;
// 音を録音するオブジェクト
MediaRecorder mr;
②ボタンの制御
ボタンはsetEnabledメソッドをつかうこ
とで、押せなくすることが可能です
bt[0].setText("開始");
bt[1].setText("停止");
bt[2].setText("再生");
bt[0].setEnabled(true);
bt[1].setEnabled(false);
bt[2].setEnabled(true);
③オブジェクトの初期化
onResumeメソッドはアクティビティが前面
に表示された時に呼び出されるメソッドで
す
バックグラウンドでも再生・録音をしない
よう、onResumeメソッド内で初期化をしま
す
mp = new MediaPlayer();
mr = new MediaRecorder();
mp.setOnCompletionListener(new SampleCompletionListener());
④オブジェクトの開放
onPauseメソッドは別のアクティビティが開
始した際に呼び出されるもので、録音や再
生を続けないようオブジェクトを開放しま
す
mp.release();
mr.release();
⑤再生が終わった時の処理
音声の再生が終わるとOnCompletionListener
を継承したクラスのonCompletionメソッド
が呼び出されます
ここではボタンの制御を初期状態に戻しま
す
bt[0].setEnabled(true);
bt[1].setEnabled(false);
bt[2].setEnabled(true);
⑥開始をした時の処理
録音を開始するには、オーディオソースの
設定→出力ファイルの設定→エンコーダの
設定の順番で設定を行い、prepareメソッド
を呼び出してからstartメソッドで開始しま
す
mp.reset();
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
String path = f.getAbsolutePath();
mr.setOutputFile(path);
mr.prepare();
mp.setDataSource(path);
mr.start();
⑦停止を押した時の処理
録音を停止する場合はMediaRecorder
をstopメソッドで停止します
mr.stop();
mr.reset();
⑧再生を押した時の処理
再生はMediaPlayerオブジェクトのstart
メソッドを呼び出すと開始します
try {
mp.prepare();
} catch (Exception e) {
}
mp.start();