2017-02-01 3 views
1

사용자가 이미지를 선택하고이 환경 설정에서받은 URI를 공유 환경 설정에 저장하게합니다. 이 URI는 다른 활동에서 다시 사용됩니다. 이것은 한 번 사용자가 이미지를 선택하고 URI가 저장되지만, 앱이 닫히고 다시 열리면 활동이 공유 환경 설정에 저장된 URI의 이미지를로드하려고 할 때 프로그램이 중단됩니다. 왜 그런 일이 일어나고 이미지가 처음 선택 될 때 왜 작동합니까? 여기공유 환경 설정에서 저장된 URI의 이미지를로드 할 수 없습니다.

나는 사용자가 수신 된 URI를 이미지를 선택하고 저장합니다

public void pickImage(View view) { 
     Intent pickIntent = new Intent(); 
     pickIntent.setType("image/*"); 
     pickIntent.setAction(Intent.ACTION_GET_CONTENT); 
     startActivityForResult(pickIntent, 1); 
    } 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode != RESULT_OK) { 
     return; 
    } 
    if (requestCode == 1) { 
     Uri uri = data.getData(); 
     SharedPreferences prefs = this.getSharedPreferences(PREFS, MODE_PRIVATE); 
     SharedPreferences.Editor edit = prefs.edit(); 
     edit.clear(); 
     edit.putString(URI, uri.toString()); 
     edit.commit(); 
     } 
    } 

을 그리고 여기 다시 URI에 저장된 이미지를로드 :

private void setImage() { 
     SharedPreferences prefs = this.getSharedPreferences(MainActivity.PREFS, MODE_PRIVATE); 
     String string_uri = prefs.getString(MainActivity.URI, "not found"); 

     Uri uri = Uri.parse(string_uri); 
     InputStream inputStream = null; 
     try { 
      inputStream = getContentResolver().openInputStream(uri); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

     Bitmap bmp = BitmapFactory.decodeStream(inputStream); 
     ImageView iv = (ImageView) findViewById(R.id.imageView_card); 
     iv.setImageBitmap(bmp); 
    } 

디버깅 할 때 응용 프로그램이 충돌을 보여 주었다 그것은 InputStream을 열려고 시도합니다. 나는 그것을 검사했고 URI는 항상 동일하다.

+0

내가 일반적으로 공유 환경 설정 – Sanjeev

+0

'응용 프로그램 충돌에 저장된 이미지를로드 글라이드를 사용을 동일하게 유지됩니다. 그렇다면 다른 예외도 잡아야합니다. 이제 하나의 catch 블록이 있습니다. 그러나 catch가 있으면 아무 일도 일어나지 않은 것처럼 코드를 계속 진행하면됩니다. 대신에 그만둬야합니다. e.getMessage()를보고하는 사용자에게 건배를 보여주고 반환하십시오. – greenapps

+0

'프로그램이 공유 환경 설정에 저장된 URI의 이미지를로드하려고 할 때 프로그램이 충돌하고 'InputStream을 열려고하면 응용 프로그램이 충돌합니다.' – greenapps

답변

2

sharedpreference에서 URI를 추출한 후 URI를 직접 이미지 뷰로 설정할 수 있으므로이를 비트 맵으로 변환 할 필요가 없습니다.

이 당신이 이미지 뷰에 URI를 설정하는 방법이다 : 당신이

edit.putString(URI, uri.toString()); 

을 저장하는 것처럼

iv.setImageURI(uri); 
+1

내 코드를 줄 바꿈으로 인해 응용 프로그램이 중단되는 것을 막을 수는 있지만 이제는 'ImageView'가 검은 색이어서 비트 맵을로드하지 않습니다. – Jonas

+0

비트 맵으로 변환 할 필요가 없습니다. 반환 된 URI가 비어 있거나 URI에 문제가있을 수 있습니다. 나 같은 방식으로 일했다. –

0

URI를 위해 그 구원의 과정에서 문제가있을 수 있습니다 ..

그것은 문자열로 uri 걸릴 수 있습니다 .. 당신은 .. uri ..에서 경로를 저장 .. 한가지 할 수 있습니다 ..

다른210

모든 ..이 작품 희망 ..는 InputStream`을 열려고하면