Что может вызвать бесконечное возобновление активности Android при возвращении с камеры?
У меня есть странная ошибка в моем приложении, которая заставляет действие перезапускать себя в бесконечном цикле, когда я 'вернувшись из приложения камеры, после съемки.
Поток пользовательского интерфейса выглядит так:
Основная деятельность ->Принять фото активность -> в onCreate () открыть камеру с помощью startActivityForResult ()Экран камеры -> сделать снимок (или отменить) -> вернуться в Accept PhotoЭкран Accept Photo создается полностью и сразу останавливается и воссоздается в бесконечном циклеСтранная часть в том, что это происходит только с некоторыми камерами. На моем Nexus S под управлением Jellybean стоковая камера работает правильно, а Camera Zoom FX вызывает эту ошибку. На моем планшете Archos G9 с ICS и стоковая камера, и Zoom FX вызывают ошибку.
я проверил код шаг за шагом, и я могунайти источник повторного вызова. Когда я'Остановив отладчик во втором (и последующем) вызове onCreate (), в стеке вызовов происходит вызов ActivityThread.handleRelaunchActivity (). Это'с намерением неНе так много информации: действие пустое, класс AcceptPhoto. MFlags имеет значение 603979776, которое я нене знаю, как перевести в настоящие намерения флаги.
Странность нене останавливайтесь здесь, все же. На моем планшете, когда я впервые делаю снимок, приложение в порядке. Если я пытаюсь сделать второй снимок, экран сходит с ума. Если вместо съемки секунд я вернусь к предыдущему экрану,Все в порядке, пока я не открою новое занятие. Это неНе имеет значения, откуда, если я вернусь к корневому действию и начну новое действие, оно начнет мигать.
Я постараюсь опубликовать некоторый код, но я подозреваю, что ошибка не вызвана моим кодом, но яЯ запускаю что-то в базовом коде Android. Я надеюсь, что кто-то может указать мне правильное направление, чтобы найти способ обойти эту ошибку. Все может быть полезным, поэтому я благодарю вас за любую идею!
Код, используемый для открытия камеры (вызывается в AcceptPhoto.onCreate () с использованием служебного класса):
private void openCamera(Context context) {
Intent pictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File tempFile = getTempFile(context);
try {
if (tempFile != null) {
pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
((Activity) context).startActivityForResult(pictureIntent, GET_ITEM_PHOTO);
} else {
Toast.makeText(context, "Could not create temp file", Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Toast.makeText(context, "Error opening camera " + e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
Код, используемый для отображения изображения, вызывается в AcceptPhoto.onActivityResult ():
private void displayPhoto() {
if (cameraUtils == null) {
cameraUtils = new CameraUtil();
}
previewImageView.setImageDrawable(null);
File tempFile = cameraUtils.getTempFile(this);
int rotation = 0;
try {
ExifInterface exif = new ExifInterface(tempFile.getPath());
String orientation = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
Log.i("SPRING", "Photo orientation " + orientation);
rotation = getBitmapRotation(Integer.valueOf(orientation));
Log.i("SPRING", "The image needs to be rotated by " + (rotation) + " degrees");
} catch (IOException e1) {
e1.printStackTrace();
}
try {
previewBitmap = BitmapEncoderUtil.loadPrescaledBitmap(tempFile);
if (rotation != 0) {
Matrix rotationMatrix = new Matrix();
rotationMatrix.postRotate(rotation);
int w = previewBitmap.getWidth();
int h = previewBitmap.getHeight();
Bitmap rotatedBitmap = Bitmap.createBitmap(previewBitmap, 0, 0, w, h, rotationMatrix, false);
previewBitmap = rotatedBitmap;
}
previewImageView.setImageBitmap(previewBitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Метод, используемый в классе утилит для создания / получения файла, в котором камера сохраняет фотографию:
public File getTempFile(Context context) {
String externalStorageStateString = Environment.getExternalStorageState();
File cacheDirectory;
// try to save in external storage
if (externalStorageStateString.equals(Environment.MEDIA_MOUNTED)) {
cacheDirectory = context.getExternalCacheDir();
} else {
// save in internal storage
cacheDirectory = context.getCacheDir();
}
File tempSnapshotFile = new File(cacheDirectory, MissionOtherActivity.ITEM_SNAPSHOT_PATH);
// make sure the file exists, possible fix for the camera bug
try {
if (tempSnapshotFile.exists() == false) {
tempSnapshotFile.getParentFile().mkdirs();
tempSnapshotFile.createNewFile();
}
} catch (IOException e) {
Log.e("SPRING", "Could not create file.", e);
}
return tempSnapshotFile;
}