Проблемы с результатом намерения камеры

#java #android #android-intent #bitmap #camera

#java #Android #android-намерение #растровое изображение #камера

Вопрос:

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

  1. Когда камера возвращается, onActivityResult() переходит прямо к resultCode == Activity.RESULT_CANCELED . Любое объяснение этого и решения были бы с благодарностью приняты.

  2. Камера действительно делает снимок, я могу видеть его на своей SD-карте с помощью программы просмотра файлов, но его имя является стандартным с камеры. Как я могу сделать так, чтобы имя этого снятого изображения было тем, которое предоставлено действием?

Код намерения камеры

 Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = new File("Team image.jpg");
camera.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
camera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));
camera.putExtra(MediaStore.Images.Media.TITLE, "Team image");
        startActivityForResult(camera, PICTURE_RESULT);
  

код activityresult

 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){

    if(requestCode == PICTURE_RESULT){
        if(resultCode == Activity.RESULT_OK) {
            if(data!=null){
                Bitmap image = BitmapFactory.decodeFile(data.getExtras().get(MediaStore.Images.Media.TITLE).toString());
                grid.add(image);            
                images.addItem(image);
            }
            if(data==null){
                Toast.makeText(Team_Viewer.this, "no data.", Toast.LENGTH_SHORT).show();
            }
        }
        else if(resultCode == Activity.RESULT_CANCELED) {
            Toast.makeText(Team_Viewer.this, "Picture could not be taken.", Toast.LENGTH_SHORT).show();
        }
}
}
  

Ответ №1:

Отметили ли вы режим запуска вашей активности как «singleInstance»?

Это может вызвать вашу первую проблему.

Моя камера работает нормально, когда я удаляю «singleInstance».

Комментарии:

1. Это касалось моего. Спасибо.

2. У меня была та же проблема, что и у OP, это исправило ее. Спасибо! (Хотя это происходило только на устройствах до Lollipop)

Ответ №2:

Эти две проблемы, вероятно, связаны, имея отношение к тому, как вы создаете ссылку на файл, которая передается на камеру. Если вы хотите, чтобы ваш файл изображения был сохранен на SD-карту, вам необходимо создать ссылку на файл, которая включает полный путь к этому местоположению, а не только имя файла. Например, этот код сохранит файл изображения в корне SD-карты:

 Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File image = new File(Environment.getExternalStorageDirectory(),"TeamImage.jpg");
camera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(image));

startActivityForResult(camera, PICTURE_RESULT);
  

Я также изменил ваше имя файла, чтобы не включать пробел; только потому, что я не уверен, что приложение камеры также не взорвется на этом фрагменте. Поскольку камера запутывается при попытке открыть и записать в ваше местоположение файла, вероятно, именно поэтому вы всегда возвращаетесь с RESULT_CANCELED . Здесь вам не нужно разрешение WRITE_EXTERNAL_STORAGE, поскольку приложение камеры выполняет доступ к SD-карте.

Еще одно примечание: я не верю, что другие дополнения MediaStore могут быть переданы с этим намерением. Обычно, если вы хотите, чтобы к вашему изображению были прикреплены метаданные, вам необходимо вставить ссылку Uri с этими метаданными в MediaStore ContentProvider перед сохранением изображения на диск.

Надеюсь, это поможет!

Комментарии:

1. Большое вам спасибо, это была проблема!

Ответ №3:

Не уверен, что не так с вашим кодом, вот что работает для меня:

 Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA_PIC_REQUEST);
  

и

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {

            switch (requestCode) {
                case CAMERA_PIC_REQUEST:
                    Bitmap b = (Bitmap) data.getExtras().get("data");
                    if (b != null) {
                        updateThumbnail(b);

                        if (mBitmap != b) {
                            b.recycle();
                        }
                    }
                    break;
}
}
  

Комментарии:

1. Однако результирующее «растровое изображение» в этом случае имеет ужасно низкое разрешение.