2013-06-06 17 views
6

Sto mostrando un selezionatore all'utente per scegliere tra Galleria o Fotocamera per selezionare una foto. Se scelgo Fotocamera, una volta caricata la fotocamera, ruoto per scattare una foto di paesaggio, scattare la foto e fare clic su, ritorna alla mia app ma l'immagine restituita è nullo. Se non ruoto la fotocamera, l'immagine viene restituita correttamente. Cosa mi manca? So che la rotazione fa sì che l'attività venga ricostruita, ma perché l'onActivityResult non dovrebbe contenere le informazioni corrette? Ecco il mio openImage intento:L'immagine dalla fotocamera è nullo se la fotocamera viene ruotata

public void openImageIntent() { 

     // Determine Uri of camera image to save. 
     final File root = new File(Environment.getExternalStorageDirectory() + File.separator + "MyAppImages" 
       + File.separator); 
     root.mkdirs(); 
     SimpleDateFormat sdf = new SimpleDateFormat("ddMMyy-hhmmss"); 
     final String fname = String.format("%s.jpg", sdf.format(new Date())); 
     final File sdImageMainDirectory = new File(root, fname); 
     outputFileUri = Uri.fromFile(sdImageMainDirectory); 

     // Camera. 
     final List<Intent> cameraIntents = new ArrayList<Intent>(); 
     final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     final PackageManager packageManager = getPackageManager(); 
     final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
     for (ResolveInfo res : listCam) { 
      final String packageName = res.activityInfo.packageName; 
      final Intent intent = new Intent(captureIntent); 
      intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
      intent.setPackage(packageName); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
      cameraIntents.add(intent); 
     } 

     // Filesystem. 
     final Intent galleryIntent = new Intent(); 
     galleryIntent.setType("image/*"); 
     galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 

     // Chooser of filesystem options. 
     final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 

     // Add the camera options. 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[] {})); 

     startActivityForResult(chooserIntent, SELECT_PICTURE_REQUEST); 
    } 

E il metodo onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == SELECT_PICTURE_REQUEST) { 
       final boolean isCamera; 
       if (data == null) { 
        isCamera = true; 
       } else { 
        final String action = data.getAction(); 
        if (action == null) { 
         isCamera = false; 
        } else { 
         isCamera = true; 
        } 
       } 

       Uri selectedImageUri; 
       if (isCamera) { 
        selectedImageUri = outputFileUri; 
       } else { 
        selectedImageUri = data == null ? null : data.getData(); 
       } 

       if (imageDelegate != null) { 
        Log.e(TAG, "imageDelegate not null: " + imageDelegate); 
        imageDelegate.gotNewImageUri(selectedImageUri); 
        imageDelegate = null; 

       } else if (getSupportFragmentManager().findFragmentByTag("addofferdialog") != null) { 
        imageDelegate = (AddOfferFragment) getSupportFragmentManager().findFragmentByTag("addofferdialog"); 
        Log.e(TAG, "imageDelegate is null but found fragment: " + imageDelegate); 
        Log.e(TAG, "Activity image: " + selectedImageUri); 
        imageDelegate.gotNewImageUri(selectedImageUri); 
        imageDelegate = null; 
       } else { 
        Log.e(TAG, "cannot find imageDelegate!!!!"); 
       } 

      Log.e(TAG, "selectedImageUri: " + selectedImageUri); 
      } 
     } 
    } 

risposta

2

dovete cambiare il vostro file manifesto

nella vostra manifesta semplicemente sostituire sottostante Codice

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

con il tuo codice

<activity android:name=".CameraTestActivity" 
      android:label="@string/app_name"> 
+0

Wow, è stato facile. Grazie – Darren

+0

Contrassegnalo come risposta corrrect se funziona :) – blganesh101

+0

Ho dovuto aspettare 10 minuti prima che potessi. – Darren

3

Basta salvare outputFileUri in onSaveInstanceState e ripristinarlo in onRestoreInstanceState altro saggio sarà nulla in cambio di orientamento.

+0

Grazie. Funziona ma ho trovato che il cambiamento di Manifest è molto più semplice in quanto mantiene intatta l'attività. – Darren

+0

Si dovrebbe comunque provare a salvare i dati per le modifiche di orientamento. –

+0

@Darren ya è facile ma devi fare quanto sopra per assicurarti che la tua app non si arresti in crash in altre situazioni come ... attività distrutte sullo sfondo per la memoria –

1

Questo ha funzionato bene per me ..

<activity 
    android:name=".CameraTestActivity" 
    android:configChanges="orientation|screenSize|keyboardHidden"> 
</activity> 
Problemi correlati