onActivityResult возвращает нулевые данные для захвата изображения

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    filePath = getOutputMediaFile(FileColumns.MEDIA_TYPE_IMAGE);
    File file = new File(filePath);
    Uri output = Uri.fromFile(file);
    Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    i.putExtra(MediaStore.EXTRA_OUTPUT, output);
    startActivityForResult(i, RETURN_FILE_PATH);
}

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

    //data is always null here.
    //requestCode = RETURN_FILE_PATH;
    //resultCode = Activity.RESULT_OK;
}

Я проверил значения для file и output Uri, оба в порядке, и захваченное изображение действительно существует в этом месте.

Но данные, возвращаемые в onActivityResult, всегда null, даже после захвата изображения.

ИЗМЕНИТЬ:

Я проверил этот вопрос:

onActivityResult возвращает данные = null

в котором говорится:

Всякий раз, когда вы сохраняете изображение, передавая EXTRAOUTPUT с намерением камеры, параметр данных внутри onActivityResult всегда возвращает значение null. Таким образом, вместо использования данных для получения изображения используйте путь к файлу для получения растрового изображения.

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


person Archie.bpgc    schedule 24.07.2013    source источник


Ответы (5)


В соответствии с этим post данные равны нулю, когда вы предварительно вставляете uri. Это означает, что вы уже определили свой выходной uri здесь:

  i.putExtra(MediaStore.EXTRA_OUTPUT, output);

Поэтому, когда вы получаете Activity.RESULT_OK; просто загрузите сделанную фотографию по ее известному URL-адресу.

person alex    schedule 24.07.2013
comment
Да только что увидел этот пост. Но один и тот же код работал последние 6 месяцев, почему вдруг сейчас он так себя ведет :( - person Archie.bpgc; 24.07.2013
comment
К сожалению, я не эксперт в этой теме, я думаю, что это специфичная для устройства функциональность, связанная с аппаратным обеспечением. В этом сообщении упоминается, что на устройствах Samsung существует другое поведение: stackoverflow.com/q/8248327/1965084 - person alex; 24.07.2013

Попробуйте этот код, это работает для меня.

else if(requestCode == Constant.PICK_FROM_CAMERA)
            {

                if (resultCode == Activity.RESULT_OK) 
                {
                    if(data!=null)
                    {
                        mImageCaptureUri = data.getData();
                        //path= mImageCaptureUri.getPath();
                        try
                        {
                            path = getPath(mImageCaptureUri,Wonderlistpage.this); //from Gallery
                        }
                        catch(Exception e)
                        {
                            path = mImageCaptureUri.getPath();
                            Log.i("check image attach or not", e.toString());
                        }

                        String arr[] = path.split("/");
                        int i;
                        String k = null;
                        for(i=0;i<arr.length;i++)
                        {
                            k=arr[i];       
                        }
                        photoname="_"+String.valueOf(System.currentTimeMillis()) +k;
                         if(setprofileimage_sendimagewithmessage==1)
                         {
                             performCrop(mImageCaptureUri);
                         }
                         else
                         {
                              loading_details="CAMERA";
                              new performBackgroundTask33().execute();
                         }
                    }
                    else
                    {
file1  = new File(Environment.getExternalStorageDirectory(),
                                    String.valueOf(System.currentTimeMillis()) + "_FromCamera.jpg");

                        Uri mImageCaptureUri = Uri.fromFile(file1);
                        try
                        {
                            path = getPath(mImageCaptureUri,Wonderlistpage.this); //from Gallery
                        }
                        catch(Exception e)
                        {
                            path = mImageCaptureUri.getPath();
                            Log.i("check image attach or not", e.toString());
                        }
                        String arr[] = path.split("/");
                        int i;
                        String k = null;
                        for(i=0;i<arr.length;i++)
                        {
                            k=arr[i];       
                        }
                        photoname="_"+String.valueOf(System.currentTimeMillis()) +k;
                         if(setprofileimage_sendimagewithmessage==1)
                         {
                             performCrop(mImageCaptureUri);
                         }
                         else
                         {
                              loading_details="CAMERA";
                              new performBackgroundTask33().execute();
                         }

                    }

                    //new UploadTask().execute();
                }
            }
person Gaurab    schedule 03.02.2014

Попробуйте следующий код

        {
            final String[] imageColumns = { MediaStore.Images.Media._ID,MediaStore.Images.Media.DATA };

            final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
            Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy);
            imageCursor.moveToFirst();
            do {
                String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA));
                if (fullPath.contains("DCIM")) {

                    //get bitmap from fullpath here.
                    return;
                }
            }
            while (imageCursor.moveToNext());
person Tushar Thakar    schedule 03.09.2015

Просто поместите этот код в свой onActivityResult. С той же проблемой я столкнулся на некоторых устройствах, и это решило мою проблему. Надеюсь, это также поможет вам.

try {

    Uri selectedImage = output;

    if (selectedImage == null)
        return;

    String[] filePathColumn = { MediaStore.Images.Media.DATA };
    Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
    cursor.moveToFirst();
    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
    String picturePath = cursor.getString(columnIndex);
    cursor.close();

} catch (Exception e) {
    return;
}     

Вы получите путь к изображению в переменной picturePath и Uri в переменной selectedImage.

person Abhishek Agarwal    schedule 24.07.2013

Если ваша активность имеет режим запуска как singleInstance в вашем манифесте, вы столкнетесь с этой проблемой. Попробуйте изменить его. Так как это отменяет результат каждый раз.

person A.Saini    schedule 04.07.2016