Intereting Posts

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

Мое приложение разбивается после захвата 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, нажав кнопку «Монитор». Затем он показывает использование памяти приложением, когда я взаимодействую с приложением. Теперь в левой боковой панели я нажал кнопку завершения приложения. Теперь интересно то, что он разрушает текущую деятельность и переходит к предыдущей деятельности. Это предыдущее действие становится белым экраном.

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

Solutions Collecting From Web of "Приложение сбой после захвата изображения с использованием намерений"

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

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

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

Ну ваш код отлично ….

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

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

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

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

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

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

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

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

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

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

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

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

Это может быть проблема с памятью, которую вы снимаете и сохраняете в растровом виде. Проверьте свой монитор 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; } 

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

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

  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"/> 

Проверьте ваше разрешение файла 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 check run time permission

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

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