2017-02-01 11 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

それはInputStream'を開こうとしたとき、私は、一般的に共有好み – Sanjeev

+0

'アプリのクラッシュに保存された画像をロードするためにグライドを使用しています。その後、他の例外も捕捉する必要があります。あなたは今、1つのキャッチブロックを持っています。しかし、キャッチがある場合は、何も起こっていないかのようにコードを続けるだけです。代わりにそれをやめてください。 e.getMessage()を報告しているユーザーにトーストを表示して返します。 – greenapps

+0

'アクティビティが共有プリファレンスに保存されたURIのイメージをロードしようとしたときにプログラムがクラッシュし、'アプリケーションがInputStreamを開こうとするとクラッシュします。 – greenapps

答えて

2

sharedpreferenceからURIを抽出した後、URIを直接画像ビューに設定することができます。これをビットマップに変換する必要はありません。

これは、あなたがImageViewのにURIを設定する方法です:あなたは

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

を保存していると

iv.setImageURI(uri); 
+1

私のコードをあなたの行に置き換えると、アプリケーションがクラッシュするのを止めますが、 'ImageView'はただ黒でビットマップはロードされません。 – Jonas

+0

ビットマップに変換する必要はありません。返されたURIは空白であるか、またはURIに何か問題があります。同じように私のために働いた –

0

URIのためにその保存処理中に問題がある可能性があります。..

それは、文字列としてuriを取るかもしれません。あなたは.. uriからの道を保存することができます.....

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

他のすべてが同じままになります。これは、作品 ホープス..

関連する問題