gpt4 book ai didi

android - 如果方向改变,相机不会覆盖旧图像

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:45 26 4
gpt4 key购买 nike

我有一个带有许多不同 ViewHolder 的 RecyclerView 适配器。其中一个 ViewHolder 包含一个 ImageView,它需要能够拍照、调整大小,然后显示它。对于模块化,我希望 ViewHolder 是独立的:它而不是父 Activity 应该处理与照片拍摄和显示过程有关的所有事情。文件路径也是不变的(它永远不会改变)。事实上,它是 /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);
}
}
}
}

您可能会注意到我在拍照前锁定了方向,并在显示照片 10 秒后解锁。这个技巧是我故障排除的一部分。所以情况是这样的。上述系统运行良好。在下面的情况下会出现问题

  • 假设我在 ImageView 中已有一张照片但想替换它。
  • 所以我点击 ImageView 拍一张新照片。
  • 如果我旋转设备拍摄新照片,那么当我返回时,新照片会在旧照片返回之前短暂显示。
  • 所以我锁定方向以查看发生了什么。这是我的发现。
  • 只要我锁定方向,新照片就会显示。一旦方向解锁(10 秒),旧照片就会返回。
  • 如果我离开 Activity 并返回,旧照片仍会显示。
  • 如果我完全关闭应用程序然后返回,我会看到新照片。

最佳答案

当设备旋转时,会重新创建正在运行的 Activity 以及附加到它的 asyncTask,这可能会导致泄漏。

您可能需要在服务内部而不是在 Activity 中调用 asyncTask,以便将 asyncTask 附加到服务的生命周期。

关于android - 如果方向改变,相机不会覆盖旧图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35640093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com