У меня есть приложение для Android, которое содержит несколько действий.
В одном из них я использую кнопку вызова камеры устройства:
public void onClick(View view) {
Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(photoIntent, IMAGE_CAPTURE);
}
В том же действии я вызываю OnActivityResult
метод для результата изображения:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMAGE_CAPTURE) {
if (resultCode == RESULT_OK) {
Bitmap image = (Bitmap) data.getExtras().get("data");
ImageView imageview = (ImageView) findViewById(R.id.pic);
imageview.setImageBitmap(image);
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
}
}
}
Проблема в том, что намерение data
имеет значение null, OnActivityResult
метод переключается непосредственно на (resultCode == RESULT_CANCELED)
объект, а приложение возвращается к предыдущему состоянию.
Как я могу исправить эту проблему, и после вызова камеры приложение вернется к текущему действию, содержащему объект ImageView
, содержащий сделанный снимок?
Спасибо
android
android-camera
android-imageview
soft_developer
источник
источник
Ответы:
Приложение камеры Android по умолчанию возвращает ненулевое намерение только при передаче эскиза в возвращенном намерении. Если вы передадите
EXTRA_OUTPUT
URI для записи, он вернетnull
намерение, и изображение будет в URI, который вы передали.Вы можете проверить это, посмотрев исходный код приложения камеры на GitHub:
https://github.com/android/platform_packages_apps_camera/blob/gingerbread-release/src/com/android/camera/Camera.java#L1186
Я предполагаю, что либо вы как-то проходите мимо
EXTRA_OUTPUT
, либо приложение камеры на вашем телефоне работает иначе.источник
Я нашел простой ответ. оно работает!!
если вы хотите обрезать и масштабировать это изображение
источник
FileUriExposedException
о современных версиях SDK.Я столкнулся с этой проблемой, значение
intent
не равно нулю, но информация, отправленная черезintent
него, не получена вonActionActivit()
Это лучшее решение с использованием getContentResolver () :
onActivityResult()
получить растровое изображение , хранящееся на getContentResolver () :Посмотрите мой пример в github:
https://github.com/Jorgesys/TakePicture
источник
Простое приложение для рабочей камеры, позволяющее избежать проблемы с нулевым намерением
- весь измененный код включен в этот ответ; близко к Android учебник
Я потратил много времени на эту проблему, поэтому решил создать учетную запись и поделиться с вами своими результатами.
Официальный учебник по Android «Фотографирование просто» оказался не совсем тем, что обещал. Предоставленный там код не работал на моем устройстве: Samsung Galaxy S4 Mini GT-I9195 под управлением Android версии 4.4.2 / KitKat / API Level 19.
Я понял, что основная проблема заключалась в следующей строке в методе, вызываемом при захвате фотографии (
dispatchTakePictureIntent
в учебнике):Это привело к тому, что намерение впоследствии было уловлено
onActivityResult
как нулевое.Чтобы решить эту проблему, я почерпнул много вдохновения из более ранних ответов здесь и некоторых полезных сообщений на github (в основном это от deepwinter - большое ему спасибо; вы также можете проверить его ответ в тесно связанном посте ).
Следуя этим приятным советам, я выбрал стратегию удаления упомянутой
putExtra
строки и выполнения соответствующих действий по возвращению сделанного снимка с камеры в методе onActivityResult (). Решающие строки кода для возврата растрового изображения, связанного с изображением, следующие:Я создал образцовое приложение, в котором просто есть возможность делать снимки, сохранять их на SD-карте и отображать. Я думаю, что это может быть полезно для людей в той же ситуации, что и я, когда я наткнулся на эту проблему, поскольку текущие предложения помощи в основном относятся к довольно обширным сообщениям на github, которые делают то, о чем идет речь, но их не слишком легко контролировать для новичков, таких как меня. Что касается файловой системы, которую Android Studio создает по умолчанию при создании нового проекта, мне просто нужно было изменить три файла для моей цели:
activity_main.xml:
MainActivity.java:
AndroidManifest.xml:
Обратите внимание, что решение, которое я нашел для проблемы, также привело к упрощению файла манифеста Android: изменения, предложенные в руководстве по Android с точки зрения добавления поставщика, больше не нужны, поскольку я не использую их в своем Java-коде. Следовательно, в файл манифеста нужно было добавить только несколько стандартных строк, в основном касающихся разрешений.
Также было бы полезно отметить, что автоимпорт Android Studio может не обрабатывать файлы
java.text.SimpleDateFormat
иjava.util.Date
. Мне пришлось импортировать их оба вручную.источник
Наверное, потому что у вас было что-то подобное?
Однако вы не должны помещать дополнительный вывод в намерение, потому что тогда данные поступают в URI вместо переменной данных. По этой причине вы должны взять две линии посередине, чтобы у вас было
Вот почему у меня возникла проблема, надеюсь, это помогло.
источник
Следующий код работает для меня:
И вот результат:
источник
imageReturnedIntent.getData()
значение null. Я создаю такое же намерение, как и ваше. Никаких лишних параметров не ставит.Чтобы получить доступ к камере, сделать снимки и установить ImageView на Android
Вы должны использовать
Uri file = Uri.fromFile(getOutputMediaFile());
зефир.Используйте ссылку ниже, чтобы получить путь
https://androidkennel.org/android-camera-access-tutorial/
источник
Код Kotlin, который у меня работает:
И получаем Результат:
и не забудьте указать код запроса:
источник
После долгих попыток и изучения я смог понять это. Во-первых, переменные данные из Intent всегда будут иметь значение NULL, поэтому проверка на
!null
приведет к сбою вашего приложения, пока вы передаете URI в startActivityForResult. Следуйте приведенному ниже примеру. Я буду использовать Котлин.Откройте намерение камеры
} `
Создайте createImageFile (). Но вы ДОЛЖНЫ сделать переменную imageFilePath глобальной. Пример того, как его создать, есть в официальной документации Android и довольно прост.
Получить намерение
Метод getBytesFromBitmap
Надеюсь, это поможет.
источник
Когда мы будем захватывать изображение с камеры в Android, Uri или
data.getdata()
становится нулевым. у нас есть два решения для решения этой проблемы.Я буду реализовывать здесь все методы, пожалуйста, внимательно посмотрите и прочтите это: -
Сначала я расскажу, как получить Uri из растрового изображения: Полный код:
Сначала мы захватим изображение через Intent, которое будет одинаковым для обоих методов, поэтому этот код я напишу только один раз здесь:
Теперь мы реализуем OnActivityResult :-( Это будет одинаково для обоих вышеупомянутых двух методов): -
Теперь мы создадим все вышеперечисленные методы для создания Uri из методов Image и Cursor через классы:
Теперь путь URI из растрового изображения
\ Uri из Реальный путь сохраненного изображения
источник
Когда мы захватываем изображение с камеры в Android, тогда
Uri
илиdata.getdata()
становится нулевым. У нас есть два решения для решения этой проблемы.Вот как получить Uri из растрового изображения. Сначала захватите изображение через Intent, которое будет одинаковым для обоих методов:
Теперь реализуйте
OnActivityResult
, что будет одинаково для обоих методов:Теперь создайте все вышеперечисленные методы для создания Uri из методов Image и Cursor:
Путь Uri из растрового изображения:
Uri из реального пути сохраненного изображения:
источник