图库图像视图中的图像选择器消失了

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- 图像选择器包:通过删除操作一张一张地显示图像

在 Android 的默认图库图像查看器中使用 URI 打开图像

无法在 iOS 模拟器上使用颤振图像选择器选择图像

Android 图像选择器和裁剪器

仅用于本地文件的图像选择器,隐藏 Dropbox