2013-06-06 52 views
6

我正在向用戶顯示一個選擇器,供用戶在相冊或相機中選擇照片。如果我選擇「相機」,則一旦相機加載完成,我旋轉拍攝風景照片,拍攝照片並單擊完成,它將返回到我的應用程序,但返回的圖像爲空。 如果我不旋轉相機,圖像將返回正常。 我錯過了什麼? 我知道輪換導致重建活動,但爲什麼onActivityResult不包含正確的信息? 這裏是我的openImage意圖:如果相機旋轉,則相機的圖像爲空

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

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

回答

2

你必須改變你的清單文件

在您的清單隻替換下面的代碼

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

加你的代碼

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

哇,這很簡單。謝謝 – Darren

+0

如果它能正常工作,請將其標記爲正確的答案:) – blganesh101

+0

必須等10分鐘後纔可以。 – Darren

3

只需保存在onSaveInstanceStateoutputFileUri,它在onRestoreInstanceState其他明智的恢復將定向變化空。

+0

謝謝。這種方式很有效,但我發現Manifest的變化要簡單得多,因爲它保持了Activity的完整性。 – Darren

+0

無論如何,您都應該嘗試保存方向更改的數據。 –

+0

@達倫雅這很容易,但你必須做到以上,以確保您的應用程序不會在其他情況下崩潰像...在內存的背景下銷燬的活動 –

1

這爲我工作的好..

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