Как сохранить данные с камеры на диск с помощью MediaStore на Android?

Для моего приложения я использовал свой собственный class Camera для съемки изображений и собственной базы данных, но достаточно скоро я не мог не отставать от изменений, и я решил использовать встроенное приложение для камеры в Android, чтобы выполнить эту работу, но Кажется, я не могу сохранить файл. Что мне здесь не хватает? Приложение, похоже, сохраняет файл, но это всего лишь 0 байт. Я искал исходный код приложения Camera, и он ищет «выход» в Extras для сохранения файла. Любая помощь будет принята с благодарностью.

Public class CameraTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button cameraButton = (Button) findViewById(R.id.cameraButton); cameraButton.setOnClickListener( new OnClickListener(){ public void onClick(View v ){ ContentValues values = new ContentValues(); values.put(Images.Media.TITLE, "title"); values.put(Images.Media.BUCKET_ID, "test"); values.put(Images.Media.DESCRIPTION, "test Image taken"); Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra("output", uri.getPath()); startActivityForResult(intent,0); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode== 0 && resultCode == Activity.RESULT_OK){ ((ImageView)findViewById(R.id.pictureView)).setImageURI(data.getData()); } } } 

Это работало со следующим кодом, если я был немного глуп с последним. Я все еще думаю, что должен быть лучший способ, чтобы исходное изображение все еще сохранялось где-то. Он по-прежнему отправляет мне меньший размер изображения размером 25%.

 public class CameraTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button cameraButton = (Button) findViewById(R.id.cameraButton); cameraButton.setOnClickListener( new OnClickListener(){ public void onClick(View v ){ Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); startActivityForResult(intent,0); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode== 0 && resultCode == Activity.RESULT_OK) { Bitmap x = (Bitmap) data.getExtras().get("data"); ((ImageView)findViewById(R.id.pictureView)).setImageBitmap(x); ContentValues values = new ContentValues(); values.put(Images.Media.TITLE, "title"); values.put(Images.Media.BUCKET_ID, "test"); values.put(Images.Media.DESCRIPTION, "test Image taken"); values.put(Images.Media.MIME_TYPE, "image/jpeg"); Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); OutputStream outstream; try { outstream = getContentResolver().openOutputStream(uri); x.compress(Bitmap.CompressFormat.JPEG, 70, outstream); outstream.close(); } catch (FileNotFoundException e) { // } catch (IOException e) { // } } } 

Кроме того, я знаю, что выпуск кексов Android должен вскоре установить небольшой размер изображения.

В приведенном ниже коде начнется камера по умолчанию и камера сохранит изображение с указанным uri. Ключ должен поставить дополнительный «MediaStore.EXTRA_OUTPUT» вместе с желаемым uri.

 File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + image_name + ".jpg"); Uri imageUri = Uri.fromFile(file); Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, 0); 

В вашей первой попытке может случиться так, что приложение «Камера» выйдет из строя, когда он прочитает ваш «вывод» дополнительно, так как он ожидает, что он будет Uri, а вы предоставите String. Кажется, что приложение камеры прочитало дополнительный флаг после съемки фотографии. Вы должны просто предоставить uri, а не uri.getPath (). Затем, поскольку вы уже знаете URI для фотографии, он не будет возвращен в вызове onResult. Вы должны помнить URI в переменной-члене.

Во второй попытке вы получите уменьшенное (50%) bitmap назад. Он предназначен в первую очередь для просмотра. Я думаю, что полноразмерное bitmap слишком велико для бюджета памяти приложения. Это может быть причиной снижения.

FYI, нашел это в документах: вызывающий может передать дополнительный EXTRA_OUTPUT, чтобы контролировать, где это изображение будет записано. Если EXTRA_OUTPUT не присутствует, изображение небольшого размера возвращается в качестве объекта Bitmap в дополнительное поле. Это полезно для приложений, которым требуется только небольшое изображение. Если EXTRA_OUTPUT присутствует, то полноразмерное изображение будет записано в значение Uri EXTRA_OUTPUT.

находится здесь: http://developer.android.com/reference/android/provider/MediaStore.html

поэтому приложение может сохранить изображение полного размера для вас, если вы скажете ему где.

** Изменить: это не относится к устройствам HTC. HTC (не nexus), который использует htc sense ui, разветвлен с android 1.5 и несут ошибку, которая всегда сохраняет изображение при низких разрешениях. вы можете обедать для камеры и использовать функцию общего доступа с камеры, чтобы использовать полноразмерное изображение.

Я получил ту же проблему с эмулятором, я попробовал ее на реальном телефоне, и это возможно, возможно, потому, что виртуальный телефон не может действительно брать Picures.

  • переключение назад / передняя камера на лету
  • Android: наложение на просмотр камеры Android
  • objective камеры Android: как получить полноразмерную фотографию?
  • метод, вызванный после исключения release () исключение, неспособное возобновить работу с камерой android
  • OpenCV на Mac не открывает USB-камеру USB
  • HTML5: доступ камеры
  • Съемка с камеры без предварительного просмотра
  • Захваченная ориентация фото меняется в андроиде
  • Как сделать пакетный режим доступным для камеры
  • Фотосъемка с программным обеспечением на Android
  • Как включить фронтальную вспышку программно в Android?
  • Interesting Posts

    Android: получить эскиз изображения на SD-карте, учитывая Uri оригинального изображения

    экземпляр с альтернативными учетными данными

    Приложение Android Intent для Twitter

    gdb не работает с ошибкой «Не удалось найти Mach task port for process-id»

    Все буквы Upper-Case при вводе в DOSBox?

    Строка Parse Json в C #

    Как понять, что «RESTful API является апатридом»?

    Создание webfont с дополнительными многоязычными символами плоскости Unicode

    Как я могу получить значение переменной сеанса внутри статического метода?

    Как я могу запустить ВСЕ мои приложения «как администратора» по умолчанию в Windows 7?

    Django: группа по дате (день, месяц, год)

    Что означает символ «@» в Powershell?

    Цвета ячеек в зависимости от значения

    Как я могу использовать classы стандартной библиотеки (STL) в моем интерфейсе dll или ABI?

    Зачем мне сначала устанавливать значения Autologon в реестре до того, как он работает, и могу ли я исправить это?

    Давайте будем гением компьютера.