Намерение результата Намерения камеры - PullRequest
3 голосов
/ 08 июня 2011

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

  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);

Код результата действия

@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();
        }
}
}

Ответы [ 3 ]

6 голосов
/ 09 июля 2013

Вы пометили режим запуска своей активности как "singleInstance"?

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

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

4 голосов
/ 08 июня 2011

Скорее всего, эти две проблемы связаны с тем, как вы создаете ссылку на файл, который передается на камеру.Если вы хотите, чтобы файл изображения был сохранен на 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);

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

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

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

1 голос
/ 08 июня 2011

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

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;
}
}
...