从图库中选取的图像 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 权限。
我有一个带 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 权限。