从图库中选取的图像 ImageView 消失

Image Picked from Gallery ImageView Disappeard

我有一个带 ImageView 的 tabLayout,当我从图库中选择一张图片并将其显示到 Imageview 时,当我关闭应用程序时,所选图片消失了,然后我需要再次选择一张图片。

我知道这个看起来和我的问题一样,但仍然没有用 saving image picked from gallery for future use

我试过这个代码,但图像仍然消失了 https://github.com/martinsing/Image-Save-And-Retrieve-App

我也阅读了另一个问题,但没有人工作

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

不要使用ACTION_PICK,因为重启后获取的uri不再有效

改为使用 ACTION_OPEN_DOCUMENT 并在 onActivityResult 中获取持久的 uri 权限。