2016-08-29 6 views
0

Mein Ziel ist es, das zuletzt gewählte Bild in ImageView zu behalten, nachdem eine App geschlossen (zerstört) und dann wieder geöffnet wurde.Laden des zuletzt ausgewählten Bildes in ImageView nach erneuter Eingabe der App

ich versuchte, in SharedPreference speichern Bitmap zu laden „(How can I store images using sharedpreference in android?), dann wird in SharedPreferences in Bitmap ich versuchte Pfad zu speichern und laden, es Picasso verwendet: (Picasso Load image from filesystem) und versuchte, sie durch Hindurchführen des Wertes BitmapFactory.decodeFile(completePath); zu laden, wie Sie können in meinem Code sehen

Wie auch immer der Ausgang ist immer das gleiche;. ich bin ein Nullpointer bekommen

ich bin neu in Android und Programmierung im allgemeinen so meine unordentlichen Code vergeben

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)                   
+0

"MainActivityPage.java:60" Was ist Zeile 60 in 'MainActivityPage.java'? –

Antwort

1

@Nikunj Sardhara Lösung

arbeiten sollten, wenn Sie die NPE beheben: in onCreate gibt es keine imageView = (ImageView) findViewById(R.id.imageView); vor `imageView.setImageBitmap (picBitmap);

+0

Danke, es hat funktioniert! Nachdem Sie darauf hingewiesen haben, scheint das so offensichtlich, sogar für mein Niveau ist das ein dummer Fehler. Ich werde nächstes Mal vorsichtiger sein, bevor ich eine Frage stelle. . – Mikhail

1

allererst ein Bild in SharedPreferences Speicherung wäre eine sehr schlechte Idee. Sie sollten den Bildpfad in SharedPreferences speichern. Sie können dieses Bild lesen, wenn Ihre Anwendung das erste Mal geladen wird, die SharedPreferences lesen, Ihren Imagepfad abrufen, ihn aus dem Speicher lesen und in Ihrem ImageView anzeigen.

Also, das war die Prozedur und das ist einfach, es erfordert nicht so viel Code zu schreiben. Jetzt brauchen Sie nicht wirklich boolean speichern in SharedPreferences, können Sie enthält() -Methode: https://developer.android.com/reference/android/content/SharedPreferences.html

Und über Nullpointer, würde ich bitte logcat und wenn möglich dann kopieren Sie Ihre logcat zum Zeitpunkt der Nullpointer sagen überprüfen und posten Sie hier Ihren Logcat, das wäre hilfreicher. Hier ist, wie Sie logcat erhalten: https://developer.android.com/studio/debug/am-logcat.html

+0

Vielen Dank für Ihre Wiederholung! Ich werde daran denken, SharedPreferences nicht zum Sortieren von Bildern zu verwenden. Und danke für das Logcat-Tutorial, das war praktisch. – Mikhail

Verwandte Themen