2011-03-14 63 views
3

我在我的Android應用程序中啓動攝像頭意圖時遇到以下問題:如果應用程序以方向啓動,比如描述,攝像頭只能用於描繪。如果將手機方向更改爲橫向,應用程序正在運行,或者相機正在運行,並嘗試拍攝橫向照片,則應用程序會關閉並出現錯誤。這就好像照相機的意圖只能在應用程序啓動時的方向上進行拍攝。Android攝像頭意圖和方向問題

只有在風景中開始我的應用程序時,纔可以在風景中拍攝照片,並且只需在肖像中啓動照片即可拍照。啓動相機意圖的代碼非常簡單:

 String path = (new StringBuilder()).append(Environment.getExternalStorageDirectory()).append("/"+fileName).toString(); 
     File file = new File(path); 
     Uri outputFileUri = Uri.fromFile(file); 
     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra("output", outputFileUri); 
     startActivityForResult(intent, CAMERA_RESULT); 

任何想法爲什麼會發生這種情況?我沒有什麼相關的相機定位在清單既非...

乾杯

亞蘭

+0

你找出解決方案嗎?請分享代碼。 http://developer.android.com/training/camera/photobasics.html在Android開發網站給出的例子似乎並沒有爲我工作! – nia 2012-10-15 13:08:14

回答

0

我認爲這個問題是在你的onActivityResult功能。如果在potrait模式下啓動攝像機,則嘗試旋轉屏幕並拍攝風景照片,當第一個活動恢復時,它會丟失您想要的outputFileUri,並將其設置爲null並拋出NullPointerException錯誤。

+3

這個問題的解決方案是什麼:( – nia 2012-10-15 12:56:35

6

我解決了這個問題,將configChanges="orientation"放在調用相機的活動中。希望有所幫助:)

0

好吧,大家,這裏是我的工作。在android開發者中,他們在ResultOK塊內部檢查是否數據!= null,但如果你用fileUri!= null改變它,它工作正常,後來在保存文件時應該用fileUri替換data.getData()也保存圖像。希望這可以幫助。

1

大多數手機相機都是橫向的,這意味着如果您以縱向拍攝照片,最終的照片將旋轉90度。在這種情況下,相機軟件應該是照片應該被視爲定向填充EXIF數據

ExifInterface ei = new ExifInterface(photoPath); 
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); 

switch(orientation) { 
    case ExifInterface.ORIENTATION_ROTATE_90: 
     rotateImage(bitmap, 90); 
     break; 
    case ExifInterface.ORIENTATION_ROTATE_180: 
     rotateImage(bitmap, 180); 
     break; 
    // etc. 
} 

這裏是rotateImage方法:

public static Bitmap rotateImage(Bitmap source, float angle) { 
    Bitmap retVal; 

    Matrix matrix = new Matrix(); 
    matrix.postRotate(angle); 
    retVal = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); 

    return retVal; 
} 
+0

,但它不能在三星S4中工作 – 2016-10-28 15:34:40

+0

看來你可能會丟棄包含實際旋轉位圖的'rotateImage'的返回值。:-) – 2018-01-22 06:39:32

0

我認爲,問題是,一旦活動的方向改變,outputFileUri值就會變爲空。

我能夠通過添加保存的實例狀態這樣的變量來解決這個問題:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    if(outputFileUri!=null) { 
     outState.putString("outputFileUri", outputFileUri.toString()); 
    } 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    outputFileUri = Uri.parse(savedInstanceState.getString("outputFileUri")); 
} 

希望這可以幫助任何人有這個問題!