470 likes | 585 Views
カメラと録音. 6/22. 前回の内容. データベースの利用 検索のオプション ファイルの有無の確認. 本日の内容. 実機でアプリを動かす方法 (端末側の設定) カメラ 機能 パーミッション の設定 実機でアプリを動かす方法( eclipse 側の設定) 音声の録音. 実機でアプリを動かす方法. 自分の端末でアプリを動かすにはいくつか設定が必要です. 端末側の操作. 自分の持っている Android 端末を起動しましょう. 端末 側の設定. 設定画面を開きます 情報科学部 の端末を使ってる人は menu ボタンを押し Settings を押す
E N D
カメラと録音 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; SurfaceViewsv; SurfaceHoldersh; Camera cm; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayoutll = 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.Parameterspr = 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, intwidth,intheight) { try { WindowManagerwm= (WindowManager) getSystemService(WINDOW_SERVICE); Display dp = wm.getDefaultDisplay(); intrt = 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.Parameterspr = 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"); FileOutputStreamfos = new FileOutputStream(f); fos.write(data); Toast.makeText(getApplicationContext(), "写真を保存しました。", Toast.LENGTH_LONG).show(); fos.close(); cm.startPreview(); } catch (Exception e) { } } } } ⑤ ⑥ ⑦
①サーフェイスビューの生成 • カメラのプレビューを表示するにはサーフェイスビューを作成する必要があります SurfaceViewsv; SurfaceHoldersh; 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.Parameterspr = cm.getParameters();//初期パラメータの取得 pr.setPreviewSize(s.width, s.height); //画面の大きさの設定 cm.setParameters(pr); //パラメータの設定
④プレビューサイズや向きの変更 • プレビューサイズなどが変更になった場合は、SurfaceChangedメソッド内で動的に変更されます Reflect.setDisplayOrientation(cm, d); //向きの変更 cm.setPreviewDisplay(sv.getHolder()); //プレビューの設定 Camera.Parameterspr = 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カード)に保存します File dir = new File(Environment.getExternalStorageDirectory(), "CameraTest"); if (dir.exists() == false) { dir.mkdir(); } File f = new File(dir, "pic.jpg"); FileOutputStreamfos = new FileOutputStream(f); fos.write(data); fos.close(); SDカードを指定するメソッド
音声の録音 • アプリで自分の音声を録音して再生することも可能です
パーミッションの設定 • プロジェクトを作成し図のようにWRITE_EXTERNAL_STORAGEとRECORD_AUDIOを許可しましょう
実行結果 • AudioTestActivity.javaを実行してみましょう • 開始を押し、停止を押すまでの間、録音ができます • 録音した音声は再生を押すと聞くことが出来ます ※音量に注意
ソースコード MediaPlayermp; MediaRecordermr; File dir, f; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayoutll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); setContentView(ll); for (inti = 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(MediaPlayermp) { 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つのクラスのオブジェクトが必要です // 音を再生するオブジェクト MediaPlayermp; // 音を録音するオブジェクト MediaRecordermr;
②ボタンの制御 • ボタンは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();