2012-09-01 9 views
8

Sto cercando semplicemente di scattare una foto e presentarla in un ImageView con la mia samsung galaxy s. sta funzionando bene quando lo faccio su paesaggio ma non sul ritratto. Non ricevo alcun errore o eccezione - non sto ricevendo nulla ... C'è un sacco di domande su questo argomento e sembra essere problematico (qualcosa sull'orientamento della fotocamera), ma non è possibile trovare la soluzione finale per un semplice " scatta una foto e presentala "codice. Ecco il mio codice (problematico) che non funziona:"scatta una foto e la presenta" in modalità verticale su Samsung Galaxy S

private void setUpListeners() { 
    takePicture.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      Intent cameraIntent = new Intent(
        android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 
     } 
    }); 
} 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == RESULT_OK) { 
     if (requestCode == CAMERA_PIC_REQUEST) { 
      Log.d("onActivityResult", "CAMERA_PIC_REQUEST returned"); 
      dishImage = (Bitmap) data.getExtras().get("data"); 
      if (dishImage==null) 
       Log.d("onActivityResult", "dishImage==null"); 
      imageView = (ImageView) findViewById(R.id.dishinfodishimageview); 
      imageView.setImageBitmap(dishImage); 
      imageView.setVisibility(View.VISIBLE); 
      takePicture.setVisibility(View.GONE); 
      (new UploadImage()).execute(null); 
     } 
    } else { 
     Log.e("onActivityResult", 
       "no able to presenting the picture of the dish"); 
    } 

}

ho solo bisogno di un codice che funziona (su qualsiasi dispositivo) o di una correzione al mio codice ... thx.

+0

vedere questa vecchia [risposta] (http://stackoverflow.com/a/11084765/1250370). Potrebbe aiutarti. :) – Deepak

+0

per ruotare l'immagine bitmap fare riferimento a questo [collegamento] (http://stackoverflow.com/a/6051340/1250370) – Deepak

+0

Ancora non capisco: in orientamento verticale non ottengo un'immagine ruotata. ..non ho un'immagine ... e non un errore o un'eccezione ... sembra che salti la linea imageView.setImageBitmap (dishImage); (ma in landscape sta funzionando ...) – yehudahs

risposta

1

Posso solo suggerire un trucco per questo problema. Salva i risultati nelle preferenze condivise in onActivityResult() e durante il onCreate carica i tuoi contenuti dalle preferenze condivise. So che questa è una cattiva soluzione, ma questo ti farà andare avanti finché non trovi una risposta migliore. E non dimenticare di cancellare le tue preferenze condivise una volta che hai finito, altrimenti la tua attività verrà sempre inizializzata con i vecchi dati.

2

Il motivo per cui viene chiamato lo onCreate() è perché quando si chiama l'attività della telecamera durante l'orientamento verticale, si cambia l'orientamento e si distrugge l'attività precedente. Dopo aver terminato il onActivityResult(), la tua attività verrà ricreata.

Una soluzione a questo problema è quello di impostare il manifesto per ignorare le modifiche in materia di cambiamento dell'orientamento, è possibile farlo utilizzando questo:

<activity android:name=".MyMainActivity" 
    android:configChanges="orientation" 
    android:label="@string/app_name" /> 

Se si utilizza API inizia con il livello 13, si può considerare screenSize per manifest di configChanges.

1

Provate il seguente codice .. ha funzionato per me con Samsung Galaxy S2 inserire il seguente codice in onActivityResult()

ExifInterface exif = new ExifInterface(cameraimagename); 
        String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION); 
        int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL; 
        int rotationAngle = 0; 
        System.out.println("orientation is : "+orientation); 
        System.out.println("ExifInterface.ORIENTATION_ROTATE_90 : "+ExifInterface.ORIENTATION_ROTATE_90); 
        System.out.println("ExifInterface.ORIENTATION_ROTATE_180 : "+ExifInterface.ORIENTATION_ROTATE_180); 
        System.out.println("ExifInterface.ORIENTATION_ROTATE_270 : "+ExifInterface.ORIENTATION_ROTATE_270); 

        if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90; 
        if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180; 
        if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270; 
        System.out.println("Rotation Angle is : "+rotationAngle); 
        Matrix matrix = new Matrix(); 
        // matrix.setRotate(rotationAngle, (float) photo.getWidth()/2, (float) photo.getHeight()/2); 
        matrix.postRotate(rotationAngle); 

        Bitmap rotatedBitmap=null; 
        try { 
         rotatedBitmap = Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(), matrix, true); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
+0

cameraimagename = percorso dell'immagine (String) e Photo è l'oggetto bitmap generato in precedenza –

+0

Ho provato un codice simile, è stato molto lento con me, hai riscontrato lo stesso problema? –

+0

No @Helin Wang funziona perfettamente sul mio dispositivo Galaxy S2 –

0

E 'facile rilevare l'orientamento dell'immagine e sostituire il bitmap utilizzando:

/** 
* Rotate an image if required. 
* @param img 
* @param selectedImage 
* @return 
*/ 
private static Bitmap rotateImageIfRequired(Context context,Bitmap img, Uri selectedImage) { 

    // Detect rotation 
    int rotation=getRotation(context, selectedImage); 
    if(rotation!=0){ 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(rotation); 
     Bitmap rotatedImg = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true); 
     img.recycle(); 
     return rotatedImg;   
    }else{ 
     return img; 
    } 
} 

/** 
* Get the rotation of the last image added. 
* @param context 
* @param selectedImage 
* @return 
*/ 
private static int getRotation(Context context,Uri selectedImage) { 
    int rotation =0; 
    ContentResolver content = context.getContentResolver(); 


    Cursor mediaCursor = content.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
      new String[] { "orientation", "date_added" },null, null,"date_added desc"); 

    if (mediaCursor != null && mediaCursor.getCount() !=0) { 
     while(mediaCursor.moveToNext()){ 
      rotation = mediaCursor.getInt(0); 
      break; 
     } 
    } 
    mediaCursor.close(); 
    return rotation; 
} 

per evitare Fuori ricordi con grandi immagini, vi consiglio di ridimensionare l'immagine utilizzando:

private static final int MAX_HEIGHT = 1024; 
private static final int MAX_WIDTH = 1024; 
public static Bitmap decodeSampledBitmap(Context context, Uri selectedImage) 
     throws IOException { 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    InputStream imageStream = context.getContentResolver().openInputStream(selectedImage); 
    BitmapFactory.decodeStream(imageStream, null, options); 
    imageStream.close(); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, MAX_WIDTH, MAX_HEIGHT); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    imageStream = context.getContentResolver().openInputStream(selectedImage); 
    Bitmap img = BitmapFactory.decodeStream(imageStream, null, options); 

    img= rotateImageIfRequired(img, selectedImage); 
    return img; 
} 

Non è possibile utilizzare ExifInterface per ottenere l'orientamento perché un problema del sistema operativo Android: https://code.google.com/p/android/issues/detail?id=19268

Problemi correlati