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