图库图像视图中的图像选择器消失了
Posted
技术标签:
【中文标题】图库图像视图中的图像选择器消失了【英文标题】:Image Picked from Gallery ImageView Disappeard 【发布时间】:2021-02-03 09:44:09 【问题描述】:我有一个带有 ImageView 的 tabLayout,当我从图库中选择一个图像并将其显示到 Imageview 时,当我关闭应用程序时,所选图像消失了,然后我需要再次选择一个图像。
我知道这个看起来和我的问题一样,但仍然无法正常工作 saving image picked from gallery for future use
我试过这段代码,但图像仍然消失了 https://github.com/martinsing/Image-Save-And-Retrieve-App
我也读过这个其他问题,但没有人工作 Image in ImageView disappear
public class FirstFragment extends Fragment implements View.OnClickListener
ImageView imageButton1;
ImageButton imageButton2;
private Uri mImageUri;
private File mSnapFile;
private static final String ARG_URI_IMAGE_1 = "image1Uri";
private static final String ARG_URI_IMAGE_2 = "image2Uri";
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
// Inflate the layout for this fragment
View v= inflater.inflate(R.layout.fragment_first, container, false);
imageButton1 = (ImageView) v.findViewById(R.id.firstimagebtn);
imageButton2 = (ImageButton)v.findViewById(R.id.secondimagebtn);
imageButton1.setOnClickListener(this::onClick);
imageButton2.setOnClickListener(this::onClick);
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
String mImageUri = preferences.getString("image", null);
if (mImageUri != null)
imageButton2.setImageURI(Uri.parse(mImageUri));
else
imageButton2.setImageResource(R.mipmap.ic_launcher);
return v;
@Override
public void onClick(View v)
switch (v.getId())
case R.id.firstimagebtn:
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,0);
break;
case R.id.secondimagebtn:
Intent intent2 = new Intent(Intent.ACTION_PICK);
intent2.setType("image/*");
startActivityForResult(intent2,1);
break;
private void handleImageSelect(@Nullable Intent intent)
if (saveContentLocally(intent))
try
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(mSnapFile));
imageButton1.setImageBitmap(bitmap);
catch (FileNotFoundException e)
throw new IllegalStateException("Saved the image file, but it doesn't exist!");
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode)
case 0:
if(resultCode == Activity.RESULT_OK)
handleImageSelect(data);
break;
case 1:
if(resultCode == Activity.RESULT_OK)
mImageUri = data.getData();
// Saves image URI as string to Default Shared Preferences
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
SharedPreferences.Editor editor = preferences.edit();
editor.putString("image", String.valueOf(mImageUri));
editor.commit();
// Sets the ImageView with the Image URI
imageButton2.setImageURI(mImageUri);
imageButton2.invalidate();
break;
/**
* Saves the file from the ACTION_PICK Intent locally to @link #mSnapFile to be accessed by our FileProvider
*/
private boolean saveContentLocally(@Nullable Intent intent)
if (intent == null || intent.getData() == null)
return false;
InputStream inputStream;
try
inputStream = getActivity().getContentResolver().openInputStream(intent.getData());
catch (FileNotFoundException e)
Toast.makeText(getActivity(), "Could not open file", Toast.LENGTH_SHORT).show();
return false;
if (inputStream == null)
Toast.makeText(getActivity(), "File does not exist", Toast.LENGTH_SHORT).show();
return false;
try
copyFile(inputStream, mSnapFile);
catch (IOException e)
Toast.makeText(getActivity(), "Failed save file locally", Toast.LENGTH_SHORT).show();
return false;
return true;
private static void copyFile(InputStream inputStream, File file) throws IOException
byte[] buffer = new byte[1024];
int length;
try (FileOutputStream outputStream = new FileOutputStream(file))
while ((length = inputStream.read(buffer)) != -1)
outputStream.write(buffer, 0, length);
【问题讨论】:
【参考方案1】:不要使用ACTION_PICK,否则重启后获取的uri不再有效。
改为使用 ACTION_OPEN_DOCUMENT 并在 onActivityResult 中获取可持久化的 uri 权限。
【讨论】:
以上是关于图库图像视图中的图像选择器消失了的主要内容,如果未能解决你的问题,请参考以下文章
Flutter- 图像选择器包:通过删除操作一张一张地显示图像