Подтвердить что ты не робот

Приложение сбой после захвата изображения с использованием намерений

Мое приложение разбивается после захвата 5-6 фотографий, используя intents.log cat ничего не показывает. я не могу найти причину, по которой он рушится. пожалуйста, помогите мне.

    private void capturePhoto() {

        File root = new File(Environment.getExternalStorageDirectory(), "Feedback");
        if (!root.exists()) {
            root.mkdirs();
        }
        File file = new File(root, Constants.PROFILE_IMAGE_NAME + ".jpeg");
        Uri outputFileUri = Uri.fromFile(file);


        Intent photoPickerIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        photoPickerIntent.putExtra("return-data", true);
        photoPickerIntent.putExtra("android.intent.extras.CAMERA_FACING", 1);
        startActivityForResult(photoPickerIntent, requestCode);


    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (this.requestCode == requestCode && resultCode == RESULT_OK) {

            File root = new File(Environment.getExternalStorageDirectory(), "Feedback");
            if (!root.exists()) {
                root.mkdirs();
            }
            File file = new File(root, Constants.PROFILE_IMAGE_NAME+".jpeg");
            checkFlowIdisPresent(file);

            displayPic();


        }
    }
  private void displayPic() {

        String filePath = Environment.getExternalStorageDirectory()
                .getAbsolutePath() + File.separator + "/Feedback/" + Constants.PROFILE_IMAGE_NAME + ".jpeg";
        //  Bitmap bmp = BitmapFactory.decodeFile(filePath);
        //Bitmap scaled = Bitmap.createScaledBitmap(bmp, 300, 300, true);


        File imgFile = new File(filePath);
        Bitmap bmp = decodeFile(imgFile);

        if (imgFile.exists()) {

            dispProfilePic.setImageBitmap(bmp);
        } else {
            dispProfilePic.setBackgroundResource(R.drawable.user_image);

        }
    }

 private Bitmap decodeFile(File f) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            // The new size we want to scale to
            final int REQUIRED_SIZE = 70;

            // Find the correct scale value. It should be the power of 2.
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_SIZE &&
                    o.outHeight / scale / 2 >= REQUIRED_SIZE) {
                scale *= 2;
            }

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {
        }
        return null;
    }

И выше код предназначен для захвата фотографии и отображения захваченного изображения в ImageView. И я использую вкладку MI.

Изменить приложение действительно не сбой... он становится белым экраном, и если я нажимаю любую кнопку, тогда он сбой и onActivityResult не выполняется, когда он становится белым экраном

Новое редактирование. Могу повторить это. Я нажал на Android Monitor, нажав кнопку "Монитор". Затем он показывает использование памяти приложением, когда я взаимодействую с приложением. теперь в левой боковой панели я нажал кнопку завершения приложения. Теперь интересно, что он разрушает текущую деятельность и переходит к предыдущей деятельности. Это предыдущее действие становится белым экраном.

Пожалуйста, помогите мне, ребята.

4b9b3361

Ответ 1

Попробуйте этот код. Я использую его в некоторых своих приложениях:

Метод запуска запуска:

private void launchCamera() {
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
    }

Захват результата:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        try {
            if (requestCode == CAMERA_PIC_REQUEST) {
                if (data != null) {
                    Bundle extras = data.getExtras();
                    if (extras != null) {
                        Bitmap thumbnail = (Bitmap) extras.get("data");
                        if (thumbnail != null)
                            displayPic(thumbnail);
                    }
                }
            }
            } catch (Exception e) {
            e.printStackTrace();
            }
    }

Ответ 2

Ну ваш код в порядке....

Я думаю, что вы сохраняете изображение или перезаписываете изображение на том же пути с тем же именем, что и проблема с памятью. Поэтому я рекомендовал вам изменить имя с помощью System.currentTimeMillis() или любого случайного имени Вместо Constants.PROFILE_IMAGE_NAME.

И также проверьте разрешение

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Также проверьте это разрешение с временем выполнения... для времени выполнения this

private static final int REQUEST_RUNTIME_PERMISSION = 123;


    if (CheckPermission(demo.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {


        capturePhoto();

    } else {
        // you do not have permission go request runtime permissions
        RequestPermission(demo.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_RUNTIME_PERMISSION);
    }



public void RequestPermission(Activity thisActivity, String Permission, int Code) {
        if (ContextCompat.checkSelfPermission(thisActivity,
                Permission)
                != PackageManager.PERMISSION_GRANTED) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
                    Permission)) {
                capturePhoto();

            } else {
                ActivityCompat.requestPermissions(thisActivity,
                        new String[]{Permission},
                        Code);
            }
        }
    }

    public boolean CheckPermission(Activity context, String Permission) {
        if (ContextCompat.checkSelfPermission(context,
                Permission) == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            return false;
        }
    }

Ответ 3

Если ничего не отображается в лог-журнале, очень сложно спрогнозировать что-либо, но, пожалуйста, проверьте, не является ли проблема при использовании эмулятора, а не на реальном устройстве. Вы также можете проверить, можете ли вы воссоздайте проблему, уменьшив емкость эмулятора (Ram и внутреннюю память). Если это так, то увеличивайте память или барабан вашего эмулятора, и он должен работать нормально. Затем вам нужно будет работать над оптимизацией задачи обработки изображений для более низких специализированных устройств.

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

Ответ 4

Это происходит, возможно, из-за того, что ОС Calling Activity будет убит, а затем перезагружен OS, поскольку намерение IMAGE CAPTURE имеет дело с огромным объемом памяти для обработки BITMAP, захваченного через CAMERA.

Решение. Сохраните путь к файлу изображения и используйте его, когда вызывается onActivityResult. Вы можете использовать методы onSavedInstanceState и onRestoreInstanceState для сохранения и получения IMAGE_PATH и других полей активности.

Вы можете ссылаться на эту ссылку для как использовать onSavedInstanceState и onRestoreInstanceState

Ответ 5

Попробуйте сделать это в задаче Async, потому что проблема u сталкивается из-за обработки объятий, сделанной в потоке пользовательского интерфейса.

отсылайте здесь для получения дополнительной справки по реализации задачи Async

Ответ 6

Это может быть проблема с памятью, которую вы снимаете и сохраняете в растровом изображении Проверьте свой монитор Android для обнаружения памяти APp Просто сделайте этот метод статическим

private static Bitmap decodeFile(File f) {
        try {
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            // The new size we want to scale to
            final int REQUIRED_SIZE = 70;

            // Find the correct scale value. It should be the power of 2.
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_SIZE &&
                    o.outHeight / scale / 2 >= REQUIRED_SIZE) {
                scale *= 2;
            }

            // Decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        } catch (FileNotFoundException e) {
        }
        return null;
    }

Сохраните файлы с разными именами, такими как сохранение с отметкой времени как имя

Ответ 7

Попробуйте использовать код ниже. Это отлично работает для меня.

 private static final int REQUEST_CAMERA = 1;

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

    if (resultCode == RESULT_OK)
    {
        if (requestCode == REQUEST_CAMERA)
        {
            Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes);

            File destination = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");

            FileOutputStream fos;

            try
            {
                destination.createNewFile();
                fos = new FileOutputStream(destination);
                fos.write(bytes.toByteArray());
                fos.close();
            }
            catch (FileNotFoundException fnfe)
            {
                fnfe.printStackTrace();
            }
            catch (IOException ioe)
            {
                ioe.printStackTrace();
            }
            ivSetImage.setImageBitmap(thumbnail);

        }
   }
}

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

В вашем случае качество захваченного изображения может быть высоким, из-за которого ваше приложение сбой при настройке изображения на ImageView.

Просто попробуйте сжать изображение. Он будет работать!

Не забудьте добавить разрешение в файл манифеста.

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Ответ 8

проверить разрешение файла Manifast.xml. Внешнее хранилище

и разрешение камеры.

<uses-permission android:name="android.permission.CAMERA" />    
<uses-feature android:name="android.hardware.camera" />  <uses-feature
android:name="android.hardware.camera.autofocus" />

если ваше приложение работает на Marsh enter code here разрешить проверку времени выполнения mallow

Ответ 9

Попробуйте использовать ниже код:

private void launchCamera() {
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try {
        if (requestCode == CAMERA_PIC_REQUEST) {
            if (data != null) {
                Bundle extras = data.getExtras();
                if (extras != null) {
                    Bitmap thumbnail = (Bitmap) extras.get("data");
                    if (thumbnail != null)
                        displayPic(thumbnail);
                }
            }
        }
        } catch (Exception e) {
        e.printStackTrace();
        }
}