2013-06-06 35 views
6

Fotoğraf seçmek için Galeri veya Kamera arasında seçim yapmak üzere kullanıcıya bir seçici gösteriyorum. Fotoğraf Makinesini seçtiğimde, kamera yüklendikten sonra bir Yatay fotoğraf çekmek, fotoğrafı çekmek ve tıklatmak için döndürüyorum. Uygulamama döner, ancak döndürülen resim boştur. Fotoğraf makinesini döndürmezsem, görüntü düzgün şekilde döndürülür. Neyi eksik? Dönme işleminin yeniden oluşturulmasına neden olduğunu biliyorum, ancak onActivityResult neden doğru bilgileri içermiyor?Kamera döndürüldüğünde fotoğraf makinesi sıfırdır

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

Ve onActivityResult yöntemi:: İşte benim openImage Niyet olan sadece kodunun altına değiştirmek Manifest'inizde Manifest'inizde dosyayı

değiştirmek zorunda

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

cevap

2

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

kodunuzda

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

Vay, bu kolaydı. Teşekkürler – Darren

+0

Çalışırsa, doğru cevap olarak işaretleyin :) – blganesh101

+0

Yapabildiğimden 10 dakika önce beklemek zorunda kaldı. – Darren

3

Sadece onSaveInstanceState içinde outputFileUri kaydetmek ve bilge diğer onRestoreInstanceState bunu o yönü değiştirildikten null edilecektir geri yükleme. Bu benim için iyi çalıştı

+0

Teşekkür ederim. Bu çalışır, ancak Etkinlik'i bozulmadan koruduğunda, Manifest değişikliğini çok daha basit buldum. – Darren

+0

Yine de yönlendirme değişiklikleri için verileri kaydetmeye çalışmalısınız. –

+0

@Darren ya bu kolay ama uygulamanızın diğer durumlarda çökmesini sağlamak için yukarıdakileri yapmak zorundasınız ... bellek için arka planda yok edilen etkinlik –

1

..

<activity 
    android:name=".CameraTestActivity" 
    android:configChanges="orientation|screenSize|keyboardHidden"> 
</activity> 
İlgili konular