Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Camera遇到的坑

Android Camera遇到的坑

編輯:關於Android編程

拍照後onPictureTaken()不能回調

在小米手機3上發現正常運行的程序拍照無法正常回調,且點擊拍照按鈕後會停留在最後拍照的界面,且日志裡不會有任何報錯信息。經排查發現是初始化相機的時候設置了setPictureSize()導致的。

奇怪的是系統相機一切正常,且可以用硬件最大分辨率,可是我的代碼裡只能支持最高為2688x1520的pictureSize,否則均無法收到onPictureTaken回調。

後來發現我的previewSize設置的是系統最高分辨率3840x2160,後來把分辨率改為系統屏幕近似分辨率後,pictureSize可以設置最高分辨率了。

下面給出代碼:

/** 預覽界面分辨率 */
    public static void setPreviewSize(Camera.Parameters parametes) {
        List localSizes = parametes.getSupportedPreviewSizes();
        Camera.Size biggestSize = null;
        Camera.Size fitSize = null;// 優先選屏幕分辨率
        Camera.Size targetSize = null;// 沒有屏幕分辨率就取跟屏幕分辨率相近(大)的size
        Camera.Size targetSiz2 = null;// 沒有屏幕分辨率就取跟屏幕分辨率相近(小)的size
        if(localSizes != null) {
            int cameraSizeLength = localSizes.size();
            for (int n = 0; n < cameraSizeLength; n++) {
                Camera.Size size = localSizes.get(n);
                if(biggestSize == null ||
                        (size.width >= biggestSize.width && size.height >= biggestSize.height)) {
                    biggestSize = size;
                }

                if(size.width == DeviceUtils.screenHPixels
                        && size.height == DeviceUtils.screenWPixels) {
                    fitSize = size;
                } else if (size.width == DeviceUtils.screenHPixels
                        || size.height == DeviceUtils.screenWPixels) {
                    if(targetSize == null) {
                        targetSize = size;
                    } else if (size.width < DeviceUtils.screenHPixels
                            || size.height < DeviceUtils.screenWPixels) {
                        targetSiz2 = size;
                    }
                }
            }

            if(fitSize == null) {
                fitSize = targetSize;
            }

            if(fitSize == null) {
                fitSize = targetSiz2;
            }

            if(fitSize == null) {
                fitSize = biggestSize;
            }
            parametes.setPreviewSize(fitSize.width, fitSize.height);
        }

    }

    /** 輸出的照片為最高像素 */
    public static void setPictureSize(Camera.Parameters parametes) {
        List localSizes = parametes.getSupportedPictureSizes();
        Camera.Size biggestSize = null;
        Camera.Size fitSize = null;// 優先選預覽界面的尺寸
        Camera.Size previewSize = parametes.getPreviewSize();
        float previewSizeScale = 0;
        if(previewSize != null) {
            previewSizeScale = previewSize.width / (float) previewSize.height;
        }

        if(localSizes != null) {
            int cameraSizeLength = localSizes.size();
            for (int n = 0; n < cameraSizeLength; n++) {
                Camera.Size size = localSizes.get(n);
                if(biggestSize == null) {
                    biggestSize = size;
                } else if(size.width >= biggestSize.width && size.height >= biggestSize.height) {
                    biggestSize = size;
                }

                // 選出與預覽界面等比的最高分辨率
                if(previewSizeScale > 0
                        && size.width >= previewSize.width && size.height >= previewSize.height) {
                    float sizeScale = size.width / (float) size.height;
                    if(sizeScale == previewSizeScale) {
                        if(fitSize == null) {
                            fitSize = size;
                        } else if(size.width >= fitSize.width && size.height >= fitSize.height) {
                            fitSize = size;
                        }
                    }
                }
            }

            // 如果沒有選出fitSize, 那麼最大的Size就是FitSize
            if(fitSize == null) {
                fitSize = biggestSize;
            }

            parametes.setPictureSize(fitSize.width, fitSize.height);
        }
    }

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved