Android拍照與相機適配問題彙總

weixin_33912246發表於2018-01-24

本文轉載自:http://blog.csdn.net/u010963246/article/details/78925006

問題一:onActivityResult方法中的data返回為空。

問題原因:使用Intent呼叫手機內相機程式時,如果我們設定了照片的儲存路徑時,有資料表明,93%的機型的data將會是Null,所以如果我們指定了路徑,就不要使用data來獲取照片,起碼在使用前要做空判斷。

解決方案:使用onActivityResult中的intent(data)前要做空判斷。

問題二:照片無法儲存。

問題原因:如果自定義儲存路徑是/mnt/sdcard/pictures/,而手機SD卡下在拍照前沒有名為pictures的資料夾,那麼部分手機拍照後圖片不會儲存,導致我們無法獲得照片,大多數手機的相機遇到資料夾不存在的情況都會自己建立出不存在的資料夾,而個別手機卻不會建立。

解決方案:在指定儲存路徑前先判斷路徑中的資料夾是否都存在,不存在先建立再呼叫相機。

問題三:照片可以儲存,但是名字不對。

問題原因:file:///mnt/sdcard/123 1.jpg,由於URI的fromFile方法會將路徑中的空格用“%20”取代。

其實對於大多數的手機這都不算事,手機在解析儲存路徑的時候都會將“%20”替換為空格,這樣實際上最終的照片名字還是我們當初指定的名字:123 1.jpg,遺憾的是個別手機(如酷派7260)系統自帶的相機沒有將“%20”讀成空格,拍照後的照片的名字是123%201.jpg,我們用路徑“file:///mnt/sdcard/123 1.jpg”能找到照片才怪!

解決方案:指定拍照儲存路徑時,照片的命名中不要包含空格等特殊符號。

問題四:Camera拍攝,用setPreviewFormat設定成YV12,預覽會變成綠屏,實際用getPreviewFormat顯示是支援YV12的

機型:魅族MX3
解決方案:沒辦法只能設定成NV21了。
其代表機型為:三星I8258、華為H30-T00、紅米等。

問題五:在獲取系統相機拍照然後儲存在本地有時候會儲存不上,獲取不到地址。

機型:酷派8720L
問題原因:通過除錯發現當拍完照返回的時候自己設的成員變數值會被回收,估計就是記憶體不足的原因。重啟機器後就好了。

解決方案:無方案。

問題六:三星手機呼叫系統拍照返回後崩潰

(1) 攝像頭拍照後圖片資料不一定能返回 ; onActivityResult的data為空

(2) 三星的camera強制切換到橫屏 導致Activity重啟生命週期 (但是部分機型 配置 android:configChanges 也不能阻止橫豎屏切換);

(3) APP Activity A呼叫系統拍照 –> 拍照 –> 在拍好照片的介面做幾次橫豎屏轉換 –> 返回APP介面Activity A ,A 被銷燬。

解決方案:如果 activity 的銷燬如果無法避免 那麼在activity銷燬之前呼叫 onSaveInstanceState 儲存圖片的路徑

當activity重新建立的時候 會將 onSaveInstanceState 儲存的檔案傳遞給onCreate()當中

在onCreate當中 檢查照片的地址是否存在檔案 以此來判定拍照是否成功

問題七:在三星系列手機上呼叫系統相機可能會拿不到返回值的相關問題:

呼叫系統相機:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
mPicUri = "";
intent.putExtra(MediaStore.EXTRA_OUTPUT, mPicUri);
startActivityForResult(intent, requestCode);

結果拍照回來mPicUri這個沒有值,但是本地是有圖片的…這個問題主要是三星拍照返回後螢幕方向轉換並重新建立了單前的Activity,導致在OnActivityResult中不能拿到值。

首先第一可以先試著給activity節點加上些常數,告訴手機這個頁面重新建立的時候引數給我留著:

android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"

如果這個還不行,那麼久採用跳轉一個透明的activity方式來傳遞資料,也就是
CurrentActivity——>沒有佈局的Activity——>呼叫拍照三星

沒有佈局的Activity作為一箇中間層,可以在onSaveInstanceState方法中儲存好值【outState.putString("tag",uri)】,當被系統重新建立這個Activity時取出儲存的資料【oncreate 中 savedInstanceState.getString("tag")】,然後返回給CurrentActivity這個頁面即可(這樣有個好處,使用者不會感覺到重新建立螢幕旋轉)!

問題八:呼叫系統相機進行拍照時,點選拍照完成,手機又反回了拍照頁面

最近使用測試機(華為,4.4系統)呼叫系統相機進行拍照時,點選拍照完成,手機又反回了拍照頁面,此時應該setResult上一個頁面,但是上一個頁面的onActivityResult沒有被呼叫,大概有些小米手機也會這樣。

問題原因:
原先是在A頁面的onCreate方法中啟動了呼叫系統相機:這時啟動了系統相機介面B,拍照完成後setResult返回無法呼叫onActivityResult,還有一個Error,忘記是啥了,大概意思是說在這個介面onresume的時候出現的問題。

解決方案:
把啟動系統相機的程式碼放在A頁面的onresume方法中即可解決。

ps:千萬別在oncreate方法中啟動。

問題九:Android4.4以上版本從相簿選擇圖片返回的路徑不正確

詳見參考連結1

問題十:Android 7.0呼叫系統相機崩潰

詳見參考連結2

問題十一: Android 6.0 以上SecurityException

由於Android 6.0 以上的許可權變成了執行時許可權,也就是說在需要使用某個許可權的時候必須動態去申請使用,直接訪問直接導致App崩潰。

相關文章