如果方向更改,相机不会覆盖旧图像

我有一个RecyclerView适配器与许多不同的ViewHolders。 其中一个ViewHolders包含一个ImageView,它需要能够拍照,resize,然后显示它。 对于模块化,我希望ViewHolder是独立的:它不是父级活动应该处理与照片拍摄和显示过程有关的所有事情。 此外文件path是不变的(它永远不会改变)。 实际上,它是/storage/emulated/0/com.company.app/myst/cat.jpg 。 因此,这里是我的ImageView的onClick方法的实现。

 @Override public void onClick(View v) { final FragmentManager fm = ((MyActivity) getContext()).getSupportFragmentManager(); Fragment auxiliary = new Fragment() { @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { resizeResaveAndDisplayPhoto(); super.onActivityResult(requestCode, resultCode, data); fm.beginTransaction().remove(this).commit(); } }; fm.beginTransaction().add(auxiliary, "FRAGMENT_TAG").commit(); fm.executePendingTransactions(); Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (null != takePictureIntent.resolveActivity(view.getContext().getPackageManager())) { ((MyActivity)view.getContext()).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); auxFragment.startActivityForResult(takePictureIntent, Constants.REQUEST_CODE_PHOTO); } } 

resizeResaveAndDisplayPhoto被调用时,它执行下面的AsyncTask

 public static class ResizeThenLoadImageTask extends AsyncTask<String, Void, Bitmap> { private final WeakReference<ImageView> imageViewWeakReference; private final WeakReference<File> fileWeakReference; private final WeakReference<Context> weakContext; private final int reqHeight; private final int reqWidth; public ResizeThenLoadImageTask(Context context, ImageView imageView, File file, int reqHeight, int reqWidth) { weakContext = new WeakReference<Context>(context); imageViewWeakReference = new WeakReference<>(imageView); fileWeakReference = new WeakReference(file); this.reqHeight = reqHeight; this.reqWidth = reqWidth; } @Override public Bitmap doInBackground(String... params) { File file = fileWeakReference.get(); Bitmap bitmap = null; if (null != file) { bitmap = ImageUtils.reduceImageSize(file, reqHeight, reqWidth); ImageUtils.saveBitmapToGivenFile(bitmap, file); } return bitmap; } @Override public void onPostExecute(Bitmap bitmap) { if (null != imageViewWeakReference && null != fileWeakReference) { ImageView imageView = imageViewWeakReference.get(); File file = fileWeakReference.get(); if (null != imageView) { if (null != bitmap) { imageView.setImageBitmap(bitmap); } else { imageView.setImageResource(R.drawable.photo); } imageView.postDelayed(new Runnable() { @Override public void run() { if (null != weakContext.get()) { ((MyActivity) weakContext.get()).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); } } }, 10000); } } } } 

您可能会注意到在拍摄照片之前locking了方向,并在显示照片10秒后将其解锁。 那个技巧是我的疑难解答的一部分。 所以情况就是这样。 上述系统工作得很好。 以下情况会发生问题

  • 说我已经在ImageView中有一张照片,但想要replace它。
  • 所以我点击ImageView拍摄一张新照片。
  • 如果我旋转设备拍摄新照片,则在旧照片返回之前,简要地返回新的照片显示。
  • 所以我locking方向,看看发生了什么。 这是我发现的。
  • 只要我locking方向,新照片就会显示。 一旦方向解锁(10秒),旧的照片返回。
  • 如果我离开活动和退货,旧照片仍然显示。
  • 如果我完全closures应用程序,然后返回,然后我看到新的照片。

Solutions Collecting From Web of "如果方向更改,相机不会覆盖旧图像"