Glass カメラを使用して画像や動画をキャプチャしたり、カメラのプレビュー ストリームをさまざまなユースケースで表示したりできます。
概要
画像または動画を撮影するには、次の 2 つの方法があります。
startActivityForResult()
を使用して組み込みのカメラ アクティビティを呼び出す。 可能であれば、このオプションを使用してください。Android Camera API で独自のロジックを作成する。この方法を使用する場合は、次のガイドラインに従ってください。
- Glass と同じように、カメラボタンのクリックで写真を撮影し、長押しで動画を撮影します。
- 写真が撮影されたか、記録されたかを示します。
- 撮影中は画面をオンのままにしてください。
Glass システムとカメラを共有する
Glassware が Android API を使用してカメラにアクセスする場合、ユーザーがハードウェアのカメラボタンを押すと、可能であればカメラを一時的に解放します。
アクティビティの
onKeyDown()
メソッドをオーバーライドし、KEYCODE_CAMERA
をインターセプトしてカメラボタンの押下を処理します。カメラを解放し、
false
を返します。これは、イベントを消費しなかったことを示すため、内蔵の Glass カメラが起動します。
画像や動画のキャプチャが完了すると、Glass はアクティビティに戻り、
onResume()
でカメラを再利用できます。@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_CAMERA) { // Stop the preview and release the camera. // Execute your logic as quickly as possible // so the capture happens quickly. return false; } else { return super.onKeyDown(keyCode, event); } } @Override protected void onResume() { super.onResume(); // Re-acquire the camera and start the preview. }
画像または動画のキャプチャ
画像
組み込みのカメラ Glassware を使用して画像を撮影するには:
- アクションを
ACTION_IMAGE_CAPTURE
に設定してstartActivityForResult(Intent, int)
を呼び出します。 onActivityResult(int, int, android.content.Intent)
内:requestCode
が、画像キャプチャ インテントの開始時に使用されたリクエスト コードと一致することを確認します。resultCode
がRESULT_OK
と一致することを確認します。- 必要に応じて、
EXTRA_THUMBNAIL_FILE_PATH
キーでIntent
エクストラから画像のサムネイルへのパスを取得します。 - 完全なイメージへのパスは、
EXTRA_PICTURE_FILE_PATH
キーを使用してIntent
エクストラから取得できます。画像キャプチャ インテントが Glassware に制御を返したときに、画像が完全にファイルに書き込まれない場合があります。画像ファイルが存在することを確認するか、FileObserver
を使用してその親ディレクトリをモニタリングします。完全なイメージが準備できたら、そのファイルを読み込んで Glassware で使用します。
private static final int TAKE_PICTURE_REQUEST = 1;
private void takePicture() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, TAKE_PICTURE_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == TAKE_PICTURE_REQUEST && resultCode == RESULT_OK) {
String thumbnailPath = data.getStringExtra(Intents.EXTRA_THUMBNAIL_FILE_PATH);
String picturePath = data.getStringExtra(Intents.EXTRA_PICTURE_FILE_PATH);
processPictureWhenReady(picturePath);
// TODO: Show the thumbnail to the user while the full picture is being
// processed.
}
super.onActivityResult(requestCode, resultCode, data);
}
private void processPictureWhenReady(final String picturePath) {
final File pictureFile = new File(picturePath);
if (pictureFile.exists()) {
// The picture is ready; process it.
} else {
// The file does not exist yet. Before starting the file observer, you
// can update your UI to let the user know that the application is
// waiting for the picture (for example, by displaying the thumbnail
// image and a progress indicator).
final File parentDirectory = pictureFile.getParentFile();
FileObserver observer = new FileObserver(parentDirectory.getPath(),
FileObserver.CLOSE_WRITE | FileObserver.MOVED_TO) {
// Protect against additional pending events after CLOSE_WRITE
// or MOVED_TO is handled.
private boolean isFileWritten;
@Override
public void onEvent(int event, String path) {
if (!isFileWritten) {
// For safety, make sure that the file that was created in
// the directory is actually the one that we're expecting.
File affectedFile = new File(parentDirectory, path);
isFileWritten = affectedFile.equals(pictureFile);
if (isFileWritten) {
stopWatching();
// Now that the file is ready, recursively call
// processPictureWhenReady again (on the UI thread).
runOnUiThread(new Runnable() {
@Override
public void run() {
processPictureWhenReady(picturePath);
}
});
}
}
}
};
observer.startWatching();
}
}
動画
組み込みのカメラ Glassware を使用して動画を撮影するには:
- アクションを
ACTION_VIDEO_CAPTURE
に設定してstartActivityForResult(Intent, int)
を呼び出します。 onActivityResult(int, int, android.content.Intent)
内:requestCode
が、動画キャプチャ インテントの開始時に使用されたリクエスト コードと一致することを確認します。resultCode
がRESULT_OK
と一致することを確認します。EXTRA_THUMBNAIL_FILE_PATH
キーでIntent
エクストラから動画のサムネイルへのパスを取得し、必要に応じてプレビューを表示します。- 録画された動画へのパスは、
EXTRA_VIDEO_FILE_PATH
キーを使用してIntent
エクストラから取得できます。