2016-06-03 9 views
4

ich den Code unten bin mit einer Image-Datei von Gerät Galerie holen:Android Pick Bild aus der Galerie funktioniert nicht (Android 6.0 und Android 5.1.1)

Zuerst Ich nenne dieses Stück Code:

Intent i = new Intent(); 
i.setType("image/*"); 
i.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(i, "Select Picture"), RESULT_LOAD_IMAGE); 

Das ist mein onActivityResult Methode:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 

      photoPath = getPath(data.getData()); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      FileInputStream fis; 
      try { 
       fis = new FileInputStream(new File(photoPath)); 
       byte[] buf = new byte[1024]; 
       int n; 
       while (-1 != (n = fis.read(buf))) { 
        baos.write(buf, 0, n); 
       } 

       img.setImageBitmap(BitmapFactory.decodeFile(photoPath)); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

Und dieses eine Hilfsmethode Bildpfad abzurufen:

private String getPath(Uri uri) { 

     String[] data = { MediaStore.Images.Media.DATA }; 
     CursorLoader loader = new CursorLoader(getApplicationContext(), uri, data, null, null, null); 
     Cursor cursor = loader.loadInBackground(); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 

Mein Problem ist, dass die App seltsam ist. In meinem 6.0-Emulator, manchmal funktioniert es und manchmal Nein. In einem anderen Gerät (Android 5.1.1) ein FileNotFound Exception an dieser Linie geworfen wird

fis = new FileInputStream(new File(photoPath));

Alle erforderlichen Berechtigungen sind fine.Do euch eine Idee haben, was ist denn hier los? Oder haben Sie einen besseren Vorschlag, um ein Bild aus der Galerie auszuwählen?

Antwort

3

Versuchen Sie, diese können Sie direkt festlegen Bild von onActivityResult

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { 
try{ 
      final Uri imageUri = data.getData(); 
      final InputStream imageStream = getContentResolver().openInputStream(imageUri); 
      final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream); 

      imageView.setImageBitmap(selectedImage); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Danke Mann, es sieht aus wie es in Ordnung ist. ABER, nicht mit zu großen Bildern arbeiten (ca. 4MB).Es wird keine Ausnahme ausgelöst, aber das Bild wird nicht angezeigt. Es zeigt stattdessen ein graues Bild, wie das Bild, das zu hoch ist, um hochgeladen zu werden oder etw. Wie auch immer, um diese Antwort zu vervollständigen, um 'Bitmap' in' Bytearray' zu konvertieren, hat mir das geholfen: http://stackoverflow.com/questions/4989182/converting-java-bitmap-to-byte-array. – user19922

+0

@ user1992 Immer willkommen –

1

Schritt 1: Löschen Sie die ByteArrayOutputStream, da Sie sie nicht verwenden.

Schritt # 2: Löschen Sie photoPath = getPath(data.getData()); und die getPath() Methode, wie sie falsch sind.

Schritt 3: Verwenden Sie an image loading library asynchron Ihre ImageView bevölkern, ist es die Uri (data.getData()) des Bildes vorbei zu laden. Oder: Rollen Sie Ihren eigenen Code zum Laden von Bildern, einschließlich des Forkens eines Hintergrundthreads, und verwenden Sie getContentResolver().openInputStream(), um einen InputStream auf den durch die Uri identifizierten Inhalt zu erhalten.

+0

I 'verwenden ByteArrayOutputStream' woanders (nicht im Code dargestellt). Jede Lösung, die vorgeschlagen wird, sollte dies berücksichtigen. Vielen Dank! – user19922

+0

@ user1992: Dann rollen viele eigene Image-Lade-Code, einschließlich Forking eines Hintergrund-Thread und mit 'getContentResolver(). OpenInputStream()', um einen 'InputStream' auf den Inhalt von der' Uri' zu erhalten. Verwenden Sie das, um Ihren 'ByteArrayOutputStream' zu füllen, und verwenden Sie' byte [] 'aus' ByteArrayOutputStream' und 'BitmapFactory.decodeByteArray()', um Ihre Bitmap zu erstellen. – CommonsWare

0

können Sie wie unten Code verwenden

public void pickImage() { 
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("image/*"); 
    startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) { 
     if (data == null) { 
      //Display an error 
      return; 
     } 
     InputStream inputStream = context.getContentResolver().openInputStream(data.getData()); 
     //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap... 
    } 
} 
+0

Ich sehe hier nichts anderes? Fehle ich etwas? – user19922

+0

@ user1992: Sie vermissen die Tatsache, dass diese Antwort 'getContentResolver(). OpenInputStream()' verwendet, um einen 'InputStream' für den Inhalt zu erhalten, der von' Uri' unterstützt wird. – CommonsWare

Verwandte Themen