Вы можете использовать камеру Glass для захвата изображений и видео, а также для отображения потока предварительного просмотра камеры для различных вариантов использования.
Обзор
У вас есть два варианта захвата изображений или видео:
- Вызов встроенной активности камеры с помощью
startActivityForResult()
. Используйте эту опцию, когда это возможно. Создание собственной логики с помощью Android Camera API . Если вы используете этот метод, следуйте этим рекомендациям:
- Делайте снимок при нажатии кнопки камеры и видео при длительном нажатии, как это делает Glass.
- Укажите пользователю, была ли сделана фотография или записано видео.
- Не отключайте экран во время захвата.
Совместное использование камеры с системой Glass
Если ваша стеклянная посуда использует API-интерфейсы Android для доступа к камере, временно отпускайте камеру, если это возможно, если пользователи нажимают кнопку аппаратной камеры.
Переопределите метод
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. }
Захват изображений или видео
Изображения
Чтобы сделать снимок с помощью встроенного стекла камеры:
- Вызовите
startActivityForResult(Intent, int)
с действием, установленным какACTION_IMAGE_CAPTURE
. - В
onActivityResult(int, int, android.content.Intent)
:- Убедитесь, что
requestCode
соответствует коду запроса, используемому при запуске намерения захвата изображения. - Убедитесь, что
resultCode
соответствуетRESULT_OK
. - При необходимости получите путь к миниатюре изображения из дополнительного объекта
Intent
с помощью ключаEXTRA_THUMBNAIL_FILE_PATH
. - Путь к полному изображению доступен из дополнения
Intent
с помощью ключаEXTRA_PICTURE_FILE_PATH
. Когда намерение захвата изображения возвращает управление вашему Glassware, изображение может быть не полностью записано в файл. Убедитесь, что файл изображения существует, или используйтеFileObserver
для мониторинга его родительского каталога. Когда полное изображение станет доступно, загрузите файл и используйте его в своей посуде.
- Убедитесь, что
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();
}
}
Видео
Чтобы снять видео с помощью встроенного стекла камеры:
- Вызовите
startActivityForResult(Intent, int)
с действием, установленным какACTION_VIDEO_CAPTURE
. - В
onActivityResult(int, int, android.content.Intent)
:- Убедитесь, что
requestCode
соответствует коду запроса, используемому при запуске намерения захвата видео. - Убедитесь, что
resultCode
соответствуетRESULT_OK
. - Получите путь к миниатюре видео из дополнительного объекта
Intent
с помощью ключаEXTRA_THUMBNAIL_FILE_PATH
, чтобы при необходимости отобразить предварительный просмотр. - Путь к записанному видео доступен из дополнения
Intent
по ключуEXTRA_VIDEO_FILE_PATH
.
- Убедитесь, что