Захват изображения с помощью камеры, файл создан, но не возвращается в ActivityResult - PullRequest
0 голосов
/ 11 сентября 2018

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

String filepath;
File file;
Bitmap bitmap;
int previewcount=0;
@OnClick(R.id.lnrcamera)
public void opencamera()
{
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (intent.resolveActivity(this.getPackageManager()) != null)
    {
        try
        {
            file = createImageFile();
        }
        catch (IOException ex)
        {
            // Error occurred while creating the File
        }
        // Continue only if the File was successfully created
        if (file != null)
        {
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
            startActivityForResult(intent, FILE_CAMERA);
        }
    }
}

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  // prefix
            ".jpg",         // suffix
            storageDir      // directory
    );

    // Save a file: path for use with ACTION_VIEW intents
    filepath = "file:" + image.getAbsolutePath();
    return image;
}

On ActivityResult

 else if (requestCode==FILE_CAMERA && resultCode == RESULT_OK)
    {
        try
        {
            Log.d("sdfasdfasdf", "onActivityResult: "+filepath.isEmpty());
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), Uri.parse(filepath));
            int newHeight = (bitmap.getHeight() * 500)/bitmap.getWidth();
            bitmap = Bitmap.createScaledBitmap(bitmap, 500, newHeight, false);
            list_bitmap.add(bitmap);
            lnrpreview.setVisibility(View.VISIBLE);
            Adapter_Image adapter_expenseCategory=new Adapter_Image(this, 0, list_bitmap, new RecyclerCallback() {
                @Override
                public void onPreviewDelete(List<Bitmap> list_bitmap)
                {
                    Log.d("hereornot", "onPreviewDelete: "+list_bitmap.size());
                    previewcount--;
                    if (list_bitmap.size()==0)
                    {
                        lnrpreview.setVisibility(View.GONE);
                        imgpreviewcount.setImageResource(R.drawable.flagoff);
                    }
                    btxtpreviewcount.setBadgeCount(previewcount);
                }
            });
            recycler.setAdapter(adapter_expenseCategory);
            previewcount++;
            btxtpreviewcount.setBadgeCount(previewcount);
            imgpreviewcount.setImageResource(R.drawable.flagon);
        }
        catch (OutOfMemoryError e)
        {
            Toast.makeText(Activity_NewExpense.this, "Your device is out of Memory. Please free up some space.", Toast.LENGTH_SHORT).show();
        }
        catch (IndexOutOfBoundsException e)
        {
            Log.d("hereornot", "onPreviewDelete: "+e.getMessage());
        }
        catch (FileNotFoundException e)
        {
            Log.d("hereornot", "onPreviewDelete: "+e.getMessage());
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

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

Невозможно возобновить активность java.lang.RuntimeException: Сбой при доставке результата ResultInfo {who = null, request = 2, result = -1, data = null} для действия java.lang.NullPointerException в android.app.ActivityThread.performResumeActivity (ActivityThread.java:2996) на android.Приложение$ 1000 (ActivityThread.java:166) на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1287)

Поскольку изображение может быть большим, я изменил его размер и установил largeheap=trueно повезло мне, это не сработало.Кто-нибудь может направить меня туда, где я поступил неправильно?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

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

Этот пример проекта (из этой книги ) иллюстрирует, как использовать сохраненное состояние экземпляра Bundle для хранения местоположения файла.Также демонстрируется, как использовать FileProvider, который вам понадобится, если вы хотите, чтобы ваше приложение работало на устройствах Android 7.0+, так как Uri.fromFile() не будет работать .

0 голосов
/ 11 сентября 2018

Если пользователь отменяет запрос, данные будут возвращены как NULL. Поток выдаст исключение nullPointerException при вызове data.getExtras().get("data");. Я думаю, что вам просто нужно добавить условное выражение, чтобы проверить, являются ли возвращенные данные пустыми.

...