什么可能导致Android的活动从相机返回无限重新启动?

在我的应用程序中有一个奇怪的错误,当我从相机应用程序返回后,导致一个活动在无限循环中重新启动。

UIstream程如下所示:

  1. 主要活动 – >
  2. 接受照片活动 – >在onCreate()打开相机startActivityForResult()
  3. 相机屏幕 – >拍照(或取消) – >返回到接受照片
  4. “接受照片”屏幕完全创build并立即停止并在无限循环中重新创build

奇怪的是,它只发生在一些相机。 在运行Jellybean的Nexus S上,照相机行为正确,Camera Zoom FX导致此错误。 在运行ICS的Archos G9平板电脑上,库存摄像头和Zoom FX都会导致错误。

我已经检查了一步一步的代码,我无法find重新启动呼叫的来源。 当我在第二个(和后续)的onCreate()调用中停止debugging器时,在调用堆栈中有一个ActivityThread.handleRelaunchActivity()调用。 它的意图没有太多的信息:行动是空的,类是AcceptPhoto。 mFlags具有603979776的值,我不知道如何转换为实际的意图标志。

不过,这种怪异并不止于此。 在我的平板电脑上,我第一次拍照时,应用程序没问题。 如果我尝试拍摄第二张照片,屏幕会变得疯狂。 如果不是拍下秒画面,而是返回到上一个画面,直到我开启新的活动为止。 如果我一直返回到根活动并开始一个新的活动,那么从哪里开始闪烁并不重要。

我会尝试发布一些代码,但是我怀疑这个bug并不是由我的代码引起的,但是我在底层的Android代码中触发了一些东西。 我希望的是,也许有人可以指出我正确的方向find解决这个错误的方法。 任何事情都可以帮助,所以我感谢你的任何想法!

用于打开相机的代码(使用实用程序类在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(); } } 

实用程序类中用于创build/检索照相机保存照片的文件的方法:

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

Solutions Collecting From Web of "什么可能导致Android的活动从相机返回无限重新启动?"

经过多次调查,似乎呼吁重新启动来自onConfigurationChanged。 我仍然没有想出为什么,但至less我知道要避免什么。

这解释了为什么有些摄像头触发了这个错误,其他摄像头没有使用:有些摄像头使用了与我的应用程序相同的configuration,有些则没有

编辑:我发现其他调查后,我有我的扩展应用程序类中的错误。 在onConfigurationChanged方法中,我通过强制某个语言环境来更改configuration。 这触发了一个新的onConfigurationChanged()调用,这导致无限循环和后续的屏幕创build/销毁序列。 我不知道为什么我把这个代码放在onConfigurationChanged()方法中,但是我想你必须忍受才能学习:)