2012-04-23 15 views
14

sto iniziando una richiesta di prelievo immagine:Android - Immagine Picker, immagine sbagliata

Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, "Choose"), PHOTO_GALLERY); 

E ottenere i dati indietro nel onActivityResult:

if(resultCode == Activity.RESULT_OK && requestCode == PHOTO_GALLERY) 
{ 
    U.log(data.getData()); 
    Bitmap bm = ... // built from the getData() Uri 
    this.postImagePreview.setImageBitmap(bm); 
} 

Quando lancio l'Intent, ho vedere alcune cartelle, ad esempio sdcard, Drop Box, MyCameraApp e così via.

Se ho scelto un'immagine da sdcard, quando carico l'anteprima, è l'immagine completamente sbagliata. Le altre cartelle non sembrano darmi questo problema.

Qualcuno sa perché mi ha permesso di scegliere un'immagine, poi mi ha dato l'Uri per un altro?

EDIT: Ecco alcuni exampled registrati getData() s:

Buone:

content://com.google.android.gallery3d.provider/picasa/item/5668377679792530210

Bad:

content://media/external/images/media/28

EDIT: Sono sti Avremo problemi durante il prelievo dalla cartella sdcard della galleria.

Qui è un po 'più di espansione di quello che sto facendo in onActivityResult:

// cursor 
Uri selectedImage = data.getData(); 

String[] filePathColumn = { MediaStore.Images.Media.DATA }; 

Cursor cursor = mContext.getContentResolver().query(selectedImage, filePathColumn, null, null, null); 
cursor.moveToFirst(); 

int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
String filePath = cursor.getString(columnIndex); 
cursor.close(); 

// Cursor: /mnt/sdcard/Pic.jpg : /mnt/sdcard/Pic.jpg 
U.log("Cursor: " + filePath + " : " + Uri.parse(filePath)); 

// "regular" 

// Regular: content://media/external/images/media/28 : content://media/external/images/media/28 
U.log("Regular: " + data.getDataString() + " : " + Uri.parse(data.getDataString())); 

// Regular 2: content://media/external/images/media/28 : content://media/external/images/media/28 
U.log("Regular 2: " + data.getData() + " : " + data.getData()); 


mPostImagePreview.setImageBitmap(BitmapFactory.decodeFile(filePath)); 
mPostImagePreview.setVisibility(View.VISIBLE); 

Hanno ancora impostare l'immagine sbagliata. Se vado in Galleria, premere a lungo l'immagine e visualizzarne i dettagli ottengo:

TItle: Pic 
Time: May 2, 2012 
Width: 720 
Height: 1280 
Orientation: 0 
File size: 757KB 
Maker: Abso Camera 
Model: Inspire 4G 
Path: /mnt/sdcard/Pic.jpg 

Così, la Galleria mi sta dicendo il percorso è lo stesso come l'azione di ritiro, e la galleria è il rendering in modo corretto . Quindi, perché non è rendering se lo imposto da onActivityResult?

Inoltre, questo è il codice che sto usando per sparare l'Intent ora:

private void selectPhoto() 
{ 
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("image/*"); 
    ((Activity)mContext).startActivityForResult(Intent.createChooser(intent, "Select Picture"), PHOTO_GALLERY); 
} 
+0

È questo comportamento casuale? Voglio dire, c'è qualche motivo che vedi quando ripeti la selezione dell'immagine ...? – Ronnie

+2

forse le miniature nella galleria sono sbagliate. questo può accadere se ad esempio le immagini vengono cancellate perché Android riutilizza gli ID immagine. – uwe

+0

@ userSeven7s: sempre quando seleziono dalla cartella sdcard dell'app Gallery. – Josh

risposta

4

A volte le miniature nell'app Galleria possono essere obsolete e mostrare le miniature per un'immagine diversa. Questo può accadere quando gli ID immagine vengono riutilizzati, ad esempio quando un'immagine viene eliminata e ne viene aggiunta una nuova utilizzando lo stesso id.

Gestisci applicazioni> Galleria> Cancella dati può risolvere il problema.

+0

Grazie ancora! Sfortunatamente sembra che il sistema abbia assegnato automaticamente il premio quando il tempo è scaduto l'altro giorno, ma ho contrassegnato il tuo come la risposta corretta :) – Josh

5

Questo è il codice per aprire la galleria. Tuttavia questo è lo stesso di quello che hai fatto. Vedi anche il codice onActivityResult che ho usato per ritirare l'immagine selezionata.

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

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
switch (requestCode) { 
    case PHOTO_GALLERY: 
     if (resultCode == RESULT_OK) { 
      Uri selectedImageUri = Uri.parse(data.getDataString()); 
      try { 
       Bitmap bitmap = MediaStore.Images.Media.getBitmap( 
            getApplicationContext().getContentResolver(), 
            selectedImageUri); 

       this.postImagePreview.setImageBitmap(bitmap); 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      break; 
     } 
    } 
} 
+0

Vedi la mia modifica, questo ancora non funziona. – Josh

3

private static int RESULT_LOAD_IMAGE = 1;

Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
    startActivityForResult(i, RESULT_LOAD_IMAGE); 

onActivity Risultato

@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) { 
       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(); 
       ImageView imageView = (ImageView) findViewById(R.id.imgView); 
       imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath)); 
      } 
     } 
+0

A parte l'intento leggermente diverso, questo è letteralmente esattamente ciò che ho adesso, come ho notato nel mio post precedente. Ho tentato il tuo tiro Intent, e comunque produce lo stesso risultato. – Josh

+0

+1 per la tua risposta bummbat – dhams

3

provare questo

//Put this code on some event 

    Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

startActivityForResult(intent, REQUEST_CODE); 

      // When above event fire then its comes to this 
     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
       if (resultCode==RESULT_OK && requestCode==1){ 

        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]); 
        filePath = cursor.getString(columnIndex); 
        cursor.close(); 

          // Use it as per recruitment 
        actualBitmap =BitmapFactory.decodeFile(filePath); 

       } 
    } 
0

Prova questa,

public class SelectPhotoActivity extends Activity { 

private static final int SELECT_PICTURE = 1; 
private String selectedImagePath=""; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent intent = new Intent(); 
    intent.setType("image/*"); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivityForResult(intent, SELECT_PICTURE); 
} 

public String getPath(Uri uri) { 
    String[] projection = { MediaStore.Images.Media.DATA }; 
    Cursor cursor = managedQuery(uri, projection, null, null, null); 
    int column_index = cursor 
      .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
    cursor.moveToFirst(); 
    return cursor.getString(column_index); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (resultCode == RESULT_OK) { 
     if (requestCode == SELECT_PICTURE) 
     { 
      Uri selectedImageUri = data.getData(); 
      selectedImagePath = getPath(selectedImageUri); 
      // here you can set the image 
      } 
    } 
} 

}