2017-02-01 1 views
1

Ich lasse den Benutzer ein Bild auswählen und den URI, den ich von dieser Aktion erhalte, in meinen gemeinsamen Einstellungen speichern. Dieser URI wird in einer anderen Aktivität erneut verwendet. Dies funktioniert gut, wenn der Benutzer das Bild einmal auswählt und der URI gespeichert wird. Wenn die Anwendung geschlossen und erneut geöffnet wird, stürzt das Programm jedoch ab, wenn die Aktivität versucht, das in den gemeinsamen Voreinstellungen gespeicherte Bild des URI zu laden. Warum passiert das und warum funktioniert es zum ersten Mal, wenn das Bild ausgewählt wird?Das Bild kann nicht aus dem gespeicherten URI in freigegebenen Einstellungen geladen werden

Hier mache ich den Benutzer ein Bild auswählen und den empfangenen URI speichern:

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(); 
     } 
    } 

Und hier habe ich das Bild geladen werden wieder in der URI gespeichert:

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); 
    } 

Debuggen die App abstürzt zeigte, wenn Es versucht den InputStream zu öffnen. Ich habe es überprüft und der dafür verwendete URI ist immer derselbe.

+0

ich gleiten verwenden in der Regel Bild in gemeinsamen Vorlieben Abstürze – Sanjeev

+0

'die App gespeichert zu laden, wenn es die InputStream' zu öffnen versucht. Dann sollten Sie auch andere Ausnahmen abfangen. Sie haben jetzt einen Fangblock. Aber wenn es einen Haken gibt, fahren Sie einfach mit dem Code fort, als ob nichts passiert wäre. Stattdessen solltest du dann aufhören. Zeigen Sie einen Toast auf den Benutzer an, der e.getMessage() meldet, und kehren Sie zurück; – greenapps

+0

'stürzt das Programm ab, wenn die Aktivität versucht, das Bild des URIs zu laden, das in den gemeinsamen Voreinstellungen gespeichert ist 'UND' die App stürzt ab, wenn sie versucht, den InputStream zu öffnen'. – greenapps

Antwort

2

Nach dem Extrahieren der URI aus der gemeinsamen Voreinstellung können Sie die URI direkt auf die Bildansicht festlegen, die Sie nicht in eine Bitmap konvertieren müssen.

Dies ist, wie Sie die uri auf den Imageview gesetzt:

iv.setImageURI(uri); 
+1

Das Ersetzen meines Codes durch Ihre Zeile verhindert, dass die App abstürzt, aber jetzt ist die ImageView nur schwarz und lädt keine Bitmap. – Jonas

+0

Sie müssen nicht in eine Bitmap konvertieren, vielleicht ist das zurückgegebene URI leer oder es stimmt etwas mit der URI nicht. Derselbe Weg hat für mich funktioniert –

0

Es könnte ..

für die uri Problem in diesem Speichervorgang sein, wie Sie

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

Speichern werden Es kann das uri als Schnur nehmen. Sie können eine Sache tun, die..save den Weg von der uri..like

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

alles andere wird gleich bleiben .. hofft, dass dies funktioniert ..

Verwandte Themen