小米手機調用相機,返回的相片只有176x142,怎麼解決?


這個是小米機默認的解析度。很坑新人。百度又百度不到,谷歌上又不研究小米。。

bug的原因是:安卓獲取Camera對象之後,camera可以獲取到一個返回的支持解析度的列表的,一般來說都在幾十個

Parameters parameters = camera.getParameters();
List& SupportedPreviewSizes = parameters.getSupportedPreviewSizes();

大部分牌子的手機默認的都是最大解析度,缺點是有可能造成oom,比如三星s7e返回的bitmap就達到坑人的8兆。

但是小米的就奇葩的返回那個170*140的小圖,一般上百度找問題都找不到,讓人一頭霧水。。

解決方法,就是在返回的List&自己設定取哪個解析度的圖片:

Camera.Size pictureSize = supportedPictureSizes.get(0);// 從List取出Size
parameters.setPictureSize(previewSize.width, previewSize.height);// 設置照片的大小
camera.setParameters(parameters);


調用相機拍照,為了兼容性,一定要指定拍照生成的圖片的uri路徑,讓相機拍照的圖片就存那個文件,這樣你拍照成功後就不用在intent里讀data(或者其他欄位,國產rom各種不同),直接讀取你預先設置好的文件就行.

進一步講,不僅僅是拍照,從圖庫選擇圖片,以及裁剪也有一大堆坑,各家手機廠商都有他們自己的圖庫實現和裁剪實現,對於開發者來說,如果用系統的intent去做這兩件事,那麼bug永遠解決不完,所以現在都是用第三方庫.

基於我用過的幾個體驗最好的庫,我把拍照/圖庫選擇-&>裁剪-&>壓縮 整個流程都封裝了一下,代碼見這裡:

PhotoOut

ps: 我這裡的是intent調用,不涉及到直接的camera api操作.你如果是直接操作camera api,構建surfaceview來拍照,那麼解決方案是像其他幾個回答一樣,拿到本機器支持的camerasize,循環判斷,選一個與你的需求最接近的解析度,然後按這個解析度來拍照.


這個我真知道~~

前幾天也做了一個這種自定義相機的東西,簡單點說就是一個照相機截取的圖片可以返回很多種解析度,從大到小多大的都有,有的手機默認返回的480*800的但是小米返回的就特別小。

@祥子 祥子 同學說的基本就是核心部分了。

我做的方式是:取出所有的Camera.Size,然後用一個循環取一個跟屏幕分辨最接近的解析度。再設置到圖片里。

代碼的大概實現在下面。

this.getWindowManager().getDefaultDisplay().getSize(point);
int width = point.x;
int height = point.y;
float preferredRadio = (float)width/height;

List& sizeListForPicture = parameters.getSupportedPictureSizes();

//find best revolution for pciture
float ratioDifferencePicture = 10000;
final int minSizeWidth = 480;
for (int i = 0; i &< sizeListForPicture.size(); i++) { Camera.Size size = sizeListForPicture.get(i); if (size.width &< minSizeWidth ||size.height &< minSizeWidth) continue; float currentratio = (float)size.width/size.height; if ( Math.abs(currentratio - realPreferredRatio) &< ratioDifferencePicture ){ // Set the camera preview size parameters.setPictureSize(size.width,size.height); ratioDifferencePicture = Math.abs(currentratio - realPreferredRatio); System.out.println("pciture======= size"+size.width +"height "+size.height+" "+(float)size.width/size.height); } } mCamera.setParameters(parameters);


你用的哪款手機,具體的ROM版本號多少呢?

有按托尼提供的方法試試拍出來的照片的size嗎?

看你貼的這兩行代碼,是把previewSize設置到picturesize裡面了,有可能是這個原因導致的。

Camera.Size pictureSize = supportedPictureSizes.get(0);// 從List取出Size parameters.setPictureSize(previewSize.width, previewSize.height);// 設置照片的大小 camera.setParameters(parameters);


你拿的應該是縮略圖,可以指定uri,然後通過uri拿真實的圖,不過放入控制項之前還是先縮放


這是縮略圖吧,你拿全圖看看


推薦閱讀:

Python 的跨平台圖形界面編程選用哪個庫為好?
windows 下構建現代界面效果,用什麼庫或工具?
為什麼 Mac 的窗口關閉,最小化、最大化按鈕在左上角,而 Windows 在右上角?
什麼是界面(Interface),為什麼需要界面?

TAG:界面 | 編程 | Android開發 |