Android-камера: намерение данных возвращает null

У меня есть приложение для Android, которое содержит несколько действий.

В одном из них я использую кнопку, которая будет вызывать камеру устройства:

public void onClick(View view) { Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(photoIntent, IMAGE_CAPTURE); } 

В той же активности я OnActivityResult метод 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 намерения OnActivityResult нулю, а метод OnActivityResult обращается непосредственно к (resultCode == RESULT_CANCELED) и приложение возвращается к предыдущему.

Как я могу исправить эту проблему и после вызова камеры приложение вернется к текущей активности, которая содержит ImageView который будет содержать изображение?

благодаря

Приложение по умолчанию для Android-камеры возвращает ненулевое намерение только при передаче эскиза в возвращаемом намерении. Если вы передадите EXTRA_OUTPUT с URI для записи, он вернет null намерение, а изображение будет в URI, который вы передали.

Вы можете проверить это, посмотрев исходный код приложения камеры на GitHub:

Я бы предположил, что вы либо EXTRA_OUTPUT то образом проходите в EXTRA_OUTPUT , либо приложение камеры на вашем телефоне работает по-другому.

Я нашел легкий ответ. оно работает!!

о

 private void openCameraForResult(int requestCode){ Intent photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri uri = Uri.parse("file:///sdcard/photo.jpg"); photo.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(photo,requestCode); } if (requestCode == CAMERA_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { File file = new File(Environment.getExternalStorageDirectory().getPath(), "photo.jpg"); Uri uri = Uri.fromFile(file); Bitmap bitmap; try { bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); bitmap = crupAndScale(bitmap, 300); // if you mind scaling pofileImageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

если вы хотите обрезать и масштабировать изображение

 public static Bitmap crupAndScale (Bitmap source,int scale){ int factor = source.getHeight() <= source.getWidth() ? source.getHeight(): source.getWidth(); int longer = source.getHeight() >= source.getWidth() ? source.getHeight(): source.getWidth(); int x = source.getHeight() >= source.getWidth() ?0:(longer-factor)/2; int y = source.getHeight() <= source.getWidth() ?0:(longer-factor)/2; source = Bitmap.createBitmap(source, x, y, factor, factor); source = Bitmap.createScaledBitmap(source, scale, scale, false); return source; } 

Простое приложение рабочей камеры, исключающее проблему с нулевым намерением

– весь измененный код включен в этот ответ; близко к андроидному учебнику

Я потратил много времени на эту проблему, поэтому решил создать учетную запись и поделиться с вами своими результатами.

Официальное андроидское учебное пособие «Взятие фотографий просто» оказалось не совсем тем, что обещало. На моем устройстве код не работал: Samsung Galaxy S4 Mini GT-I9195 работает под управлением Android версии 4.4.2 / KitKat / API уровня 19.

Я понял, что основной проблемой была следующая строка в методе, вызванном при захвате фотографии ( dispatchTakePictureIntent в учебнике):

 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 

Это привело к тому, что намерение впоследствии было onActivityResult нулю.

Чтобы решить эту проблему, я приложил много вдохновения из более ранних ответов здесь и некоторых полезных сообщений о github (в основном, это глубокий вдох – большой благодаря ему, возможно, вы захотите также проверить его ответ на тесно связанную запись ).

Следуя этим приятным советам, я выбрал страtagsю удаления упомянутой строки putExtra и выполнил соответствующую putExtra возврата назад сделанного снимка из камеры в методе onActivityResult (). Решающими строками кода для возврата растрового изображения, связанного с изображением, являются:

  Uri uri = intent.getData(); Bitmap bitmap = null; try { bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); } catch (IOException e) { e.printStackTrace(); } 

Я создал примерное приложение, которое просто имеет возможность сделать снимок, сохранить его на SD-карте и отобразить. Я думаю, что это может быть полезно для людей в той же ситуации, что и я, когда я наткнулся на эту проблему, поскольку текущие справочные предложения в основном касаются довольно обширных сообщений github, которые делают эту вещь, но не слишком легко контролировать таких новичков, как меня. Что касается файловой системы, которую Android Studio создает по умолчанию при создании нового проекта, мне просто нужно было изменить три файла для моей цели:

activity_main.xml:

      

MainActivity.java:

 package com.example.android.simpleworkingcameraapp; import android.content.Intent; import android.graphics.Bitmap; import android.media.Image; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; public class MainActivity extends AppCompatActivity { private ImageView image; static final int REQUEST_TAKE_PHOTO = 1; String mCurrentPhotoPath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); image = (ImageView) findViewById(R.id.image1); } // copied from the android development pages; just added a Toast to show the storage location private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmm").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // Save a file: path for use with ACTION_VIEW intents mCurrentPhotoPath = image.getAbsolutePath(); Toast.makeText(this, mCurrentPhotoPath, Toast.LENGTH_LONG).show(); return image; } public void takePicAndDisplayIt(View view) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (intent.resolveActivity(getPackageManager()) != null) { File file = null; try { file = createImageFile(); } catch (IOException ex) { // Error occurred while creating the File } startActivityForResult(intent, REQUEST_TAKE_PHOTO); } } @Override protected void onActivityResult(int requestCode, int resultcode, Intent intent) { if (requestCode == REQUEST_TAKE_PHOTO && resultcode == RESULT_OK) { Uri uri = intent.getData(); Bitmap bitmap = null; try { bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); } catch (IOException e) { e.printStackTrace(); } image.setImageBitmap(bitmap); } } } 

AndroidManifest.xml:

                 

Обратите внимание, что решение, которое я нашел для проблемы, также привело к упрощению файла манифеста android: изменения, предлагаемые учебным пособием android с точки зрения добавления провайдера, больше не нужны, поскольку я не использую их в своем java-коде. Следовательно, в файл манифеста нужно было добавить лишь несколько стандартных строк – почти относительно разрешений.

Кроме того, было бы полезно отметить, что autoimport для Android Studio не может обрабатывать java.text.SimpleDateFormat и java.util.Date . Мне пришлось импортировать оба из них вручную.

Наверное, потому что у тебя было что-то вроде этого?

 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri fileUri = CommonUtilities.getTBCameraOutputMediaFileUri(); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); startActivityForResult(takePictureIntent, 2); 

Однако вы не должны вводить дополнительный вывод в намерение, потому что тогда данные попадают в URI вместо переменной данных. По этой причине вам нужно взять две линии в середине, так что у вас есть

 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(takePictureIntent, 2); 

Вот что вызвало эту проблему для меня, надеюсь, что это помогло.

Для меня работает следующий код:

 Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, 2); 

И вот результат:

 protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) { super.onActivityResult(requestCode, resultCode, imageReturnedIntent); if(resultCode == RESULT_OK) { Uri selectedImage = imageReturnedIntent.getData(); ImageView photo = (ImageView) findViewById(R.id.add_contact_label_photo); Bitmap mBitmap = null; try { mBitmap = Media.getBitmap(this.getContentResolver(), selectedImage); } catch (IOException e) { e.printStackTrace(); } } } 

Чтобы получить доступ к камере и сделать снимки и установить ImageView на Android

Вы должны использовать Uri file = Uri.fromFile(getOutputMediaFile()); для зефира.

Используйте ссылку ниже, чтобы получить путь

https://androidkennel.org/android-camera-access-tutorial/

Я испытал эту проблему, intent не является нулевым, но информация, отправленная с помощью этого intent , не получена в onActionActivit()

введите описание изображения здесь

Это лучшее решение, использующее getContentResolver () :

  private Uri imageUri; private ImageView myImageView; private Bitmap thumbnail; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... ... ... myImageview = (ImageView) findViewById(R.id.pic); values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, "MyPicture"); values.put(MediaStore.Images.Media.DESCRIPTION, "Photo taken on " + System.currentTimeMillis()); imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, PICTURE_RESULT); } 

onActivityResult() получает bitmap, сохраненное getContentResolver () :

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_TAKE_PHOTO && resultCode == RESULT_OK) { Bitmap bitmap; try { bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri); myImageView.setImageBitmap(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } 

Введение в концепцию Введение в концепцию

Проверьте мой пример в github:

https://github.com/Jorgesys/TakePicture

Когда мы data.getdata() изображение с камеры в Android, Uri или data.getdata() становятся нулевыми. У нас есть два решения для решения этой проблемы.

  1. Извлеките путь Uri из растрового изображения
  2. Извлеките путь Uri из курсора.

Вот как извлечь Uri из растрового изображения. Первый захват изображения через Intent, который будет одинаковым для обоих методов:

 // Capture Image captureImg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, reqcode); } } }); 

Теперь реализуем OnActivityResult , который будет одинаковым для обоих методов:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==reqcode && resultCode==RESULT_OK) { Bitmap photo = (Bitmap) data.getExtras().get("data"); ImageView.setImageBitmap(photo); // CALL THIS METHOD TO GET THE URI FROM THE BITMAP Uri tempUri = getImageUri(getApplicationContext(), photo); // Show Uri path based on Image Toast.makeText(LiveImage.this,"Here "+ tempUri, Toast.LENGTH_LONG).show(); // Show Uri path based on Cursor Content Resolver Toast.makeText(this, "Real path for URI : "+getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show(); } } 

Теперь создайте все вышеописанные методы для создания методов Uri from Image и Cursor:

Путь Uri из растрового изображения:

 private Uri getImageUri(Context applicationContext, Bitmap photo) { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes); String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null); return Uri.parse(path); } 

Ури из Реального пути сохраненного образа:

 public String getRealPathFromURI(Uri uri) { Cursor cursor = getContentResolver().query(uri, null, null, null, null); cursor.moveToFirst(); int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); return cursor.getString(idx); } 
  • Предназначение камеры Android Сохранение ландшафта изображения при съемке
  • Android: BroadcastReceiver намерен обнаружить фотокамеру камеры?
  • Как захватить изображение и сохранить его с помощью встроенной камеры Android
  • Прекратить сохранение фотографий с помощью встроенной камеры Android
  • Android-камера android.hardware.Camera устарела
  • Interesting Posts

    C # Cast Весь массив?

    Отправка и получение SMS и MMS на Android (pre Kit Kat Android 4.4)

    Macbook Pro: отключить дискретный графический процессор Win7 без доступа к экрану

    Как обмениваться данными с двумя (2) classами SwingWorker в Java

    HTML внутри XML. Должен ли я использовать CDATA или кодировать HTML

    Межстраничные объявления Admob: «IllegalStateException: только действия в полноэкранном режиме могут запрашивать ориентацию»

    Как нечеткое соответствие электронной почте или телефону Elasticsearch?

    Манипулирование изображениями с помощью .NET Core

    Excel VBA для ответа на приглашение загрузки Internet Explorer 11 в Windows 10?

    Чтение двоичных данных из std :: cin

    USB не распознан или не отображается буква диска

    Принудительное сведение к моно на Linux

    Java SSL подключиться, добавить серверный сертификат в хранилище ключей программно

    Как запланировать хранимую процедуру в MySQL

    Как аутентифицировать прокси-сервер при использовании classа HttpClient?

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