I have a tabLayout with ImageView and when I Pick A image from the gallery and display it to Imageview then when I close the app the selected image is gone then I need to pick an image again.
And I know this one looks the same as my question but still not working saving image picked from gallery for future use
I tried this code but the image still disappeared https://github.com/martinsing/Image-Save-And-Retrieve-App
I also Read this other question but no one works 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); } } }
Advertisement
Answer
Do not use ACTION_PICK as then the obtained uri is not valid anymore after restart.
Instead use ACTION_OPEN_DOCUMENT and take persistable uri permissions in onActivityResult.