java - 重新进入应用程序后将最后选择的图像加载到 ImageView 中

标签 java android bitmap imageview sharedpreferences

我的目标是在应用程序关闭(销毁)然后重新打开后,使最后选择的图像保留在 ImageView 中。

我尝试加载以在 SharedPreference“( How can I store images using sharedpreference in android? ) 中保存位图,然后尝试在 SharedPreferences 中存储位图的路径并使用 Picasso: ( Picasso Load image from filesystem ) 加载它,并尝试通过传递值来加载它到 BitmapFactory.decodeFile(completePath); 正如您在我的代码中看到的。

无论如何,输出总是相同的;我收到 NullPointerException。

我对 Android 和一般编程都很陌生,所以请原谅我乱七八糟的代码。

private String picturePass;
private ImageView imageView;
private Bitmap picBitmap;
private boolean yes;
private static final int SELECT_PICTURE = 1;
private static final String SAVE_NAME = "MyFile";)
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_activity_page);
    if (savedInstanceState != null) {
        savedInstanceState.get("path");
    }
//loading
    SharedPreferences preferences = getSharedPreferences(SAVE_NAME, MODE_PRIVATE);
    //boolean to check if Image was chosen
    yes = preferences.getBoolean("yes", true);
    if(yes){
         picturePass = preferences.getString("path", null);
         String completePath = picturePass;
        //just to check the content
        Toast.makeText(this, completePath, Toast.LENGTH_LONG).show();
        File file = new File(completePath);
        if (file.exists()) {
            picBitmap = BitmapFactory.decodeFile(completePath);
            imageView.setImageBitmap(picBitmap);
        }
    }
}
 //Choosing a picture from gallery
public void onClickImage(View view) {
    Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, SELECT_PICTURE);
    yes = true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == SELECT_PICTURE && resultCode == RESULT_OK && null != data) {
        //The only way I maneged to get the file path, that's a messy part
        Uri selectedImage = data.getData();
        String[] filePathColumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();
        //Setting picture in imageView
        if (selectedImage != null) {

            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage);
                imageView = (ImageView) findViewById(R.id.imageView);
                imageView.setImageBitmap(bitmap);
                picBitmap = bitmap;
                //Tried to use  Environment.getExternalStorageDirectory().getAbsolutePath() + imageName with no success
                //File f = new File(picturePath);
                //String imageName = f.getName();
                //picturePass = imageName;
                picturePass = picturePath;
                //Saving image path
                //just too check the content
                Toast.makeText(this, picturePath, Toast.LENGTH_LONG).show();
                SharedPreferences.Editor editor = getSharedPreferences(SAVE_NAME, MODE_PRIVATE).edit();
                editor.putString("path", picturePass);
                editor.putBoolean("yes", true);
                editor.commit();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("path", picturePass);
}
}

08-29 19:05:46.263 16436-16436/com.amberapply.vitaliy.iloveyou E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.amberapply.vitaliy.iloveyou, PID: 16436
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.amberapply.vitaliy.iloveyou/com.amberapply.vitaliy.iloveyou.MainActivityPage}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
     at android.app.ActivityThread.access$800(ActivityThread.java:151)
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:135)
     at android.app.ActivityThread.main(ActivityThread.java:5258)
     at java.lang.reflect.Method.invoke(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:372)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:940)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:735)
  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference
     at com.amberapply.vitaliy.iloveyou.MainActivityPage.onCreate(MainActivityPage.java:60)
     at android.app.Activity.performCreate(Activity.java:6005)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
     at android.app.ActivityThread.access$800(ActivityThread.java:151) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5258) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:940) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:735)                                                                     

最佳答案

@Nikunj Sardhara 解决方案应该有效

如果你修复了npe:在onCreate中,`imageView.setImageBitmap(picBitmap)之前没有imageView = (ImageView) findViewById(R.id.imageView); ;

关于java - 重新进入应用程序后将最后选择的图像加载到 ImageView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39210597/

相关文章:

Android:ListView 项目中的平铺位图

java - 使用 Java 将照片上传到 flickr 时签名无效

Java:如何判断一个对象是否属于特定的子类

android - 可从左向右滚动的按钮?

android - 动态地将主题应用到我的 Android 应用程序

java - 将 4 位灰度字节数组转换为位图 Android

java - 从我的应用程序读取 jsp 页面输出

java - 为什么我只能显示 NFC 标签 (nDEF) 的前 4 页

java - 当我将 Realm 查询与 RxJava 一起使用时,关闭 Realm 实例

android如何在canvas半透明上绘制位图