2016-08-29 5 views
0

내 목표는 앱을 닫은 후 (파괴 한 후) 이미지를 마지막으로 선택하여 다시 열어 보는 것입니다. 앱을 다시 입력 한 후 마지막으로 선택한 이미지를 ImageView로로드합니다.

는 I는 I 피카소 된 SharedPreferences 비트 맵 및 사용하여로드 경로를 저장하려고 한 다음, ( How can I store images using sharedpreference in android?) "SharedPreference 비트 맵을 저장하는로드 시도 ( Picasso Load image from filesystem)을하고 BitmapFactory.decodeFile(completePath);에 값을 전달하여로드하려고 당신은 내 코드에서 볼 수

어쨌든 출력이 항상 동일

;. 내가 NullPointerException이납니다

나는 일반적으로 안드로이드 프로그래밍에 새로 온 사람 때문에 내 지저분한 코드를 용서

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); 
} 
} 
.. 된 SharedPreferences에서 이미지를 저장하는 모든

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"'MainActivityPage.java'의 줄 60은 무엇입니까? –

답변

1

@Nikunj Sardhara 솔루션

작동합니다 : 다음은 로그 캣이 얻을 수있는 방법 onCreate에 imageView.setImageBitmap (picBitmap)`이전에는 imageView = (ImageView) findViewById(R.id.imageView);이 없다;

+0

고마워요, 효과가있었습니다! 당신이 그것을 지적한 후에 그것은 그렇게 명백한 것처럼 보입니다. 제 수준조차도 이것은 어리석은 실수입니다. 나는 다음 번에 질문하기 전에 더 조심 스러울 것이다. . – Mikhail

1

먼저 아주 나쁜 생각이 될 것입니다. SharedPreferences에 이미지 경로를 저장해야하며 앱을 처음로드 할 때 해당 이미지를 읽고 SharedPreferences를 읽고 이미지 경로를 얻은 다음 저장소에서 이미지를 읽고 ImageView에 이미지를 표시 할 수 있습니다.

그래서 절차가 간단하고 간단합니다. 많은 코드를 작성해야합니다. 이제 당신이 정말로 당신이 사용할 수있는, 된 SharedPreferences에서 부울을 저장 할 필요가 없습니다 포함() 메소드 : https://developer.android.com/reference/android/content/SharedPreferences.html

그리고 NullPointerException이에 대해, 내가 로그 캣을 확인하고 가능하면 다음 NullPointerException이의 시간에 로그 캣을 복사하십시오 말할 것 여기 logcat을 게시하면 도움이 될 것입니다. 당신이 NPE를 해결하는 경우 https://developer.android.com/studio/debug/am-logcat.html

+0

재생 해 주셔서 감사합니다. 이미지를 찾는 데 SharedPreferences를 사용하지 않는다는 것을 기억합니다. 그리고 logcat 튜토리얼을 이용해 주셔서 감사합니다. – Mikhail

관련 문제