android:相机测光在某些设备上不起作用

android:相机测光在某些设备上不起作用,android,camera,metering,Android,Camera,Metering,我需要在直播中进行测光,下面的代码在某些设备(维梧、oppo)中正常工作,但在某些设备(三星和美图)中测光不工作,如何在这些设备中进行测光 这是我的代码(触摸屏幕时调用handleMetering): private void setMeteringParam(){ 已同步(mCameraLock){ Camera.Parameters params=mMasterCamera.getParameters(); if(params.getMaxNumMeteringAreas()>0){ Lis

我需要在直播中进行测光,下面的代码在某些设备(维梧、oppo)中正常工作,但在某些设备(三星和美图)中测光不工作,如何在这些设备中进行测光

这是我的代码(触摸屏幕时调用handleMetering):

private void setMeteringParam(){
已同步(mCameraLock){
Camera.Parameters params=mMasterCamera.getParameters();
if(params.getMaxNumMeteringAreas()>0){
List meteringAreas=new ArrayList();
meteringAreas.add(新的摄像头面积(mMeteringRect,800));//100%
参数设置计量区域(计量区域);
参数设置计量区域(计量区域);
参数setExposureCompensation(0);
YMFLog.error(“乌丹”,“启用计量区域!计量区域=“+params.getMeteringAreas().toString());
}否则{
YMFLog.错误(“乌丹”,“不支持计量区域”);
}
mMasterCamera.setParameters(参数);
}
}
private Rect mMeteringRect=null;
公共空间句柄测量(MotionEvent事件、整数宽度、整数高度){
mMeteringRect=CalculateParea(event.getX(),event.getY(),1.0f,宽度,高度);
if(mMeteringRect!=null){
setMeteringParam();
}
}
private Rect calculateParea(浮点x、浮点y、浮点系数、整数w、整数h){
浮动焦点面积=20;
intAreaSize=Float.valueOf(focusAreaSize*系数).intValue();
int centerX=(int)(x/w*2000-1000);
整数中心=(整数)(y/h*2000-1000);
int top=夹具(centerX-面积大小/2,-1000,1000-面积大小);
int left=夹钳(中心-面积大小/2,-1000,1000-面积大小);
RectF RectF=新的RectF(-(左+面积大小),-(顶部+面积大小),-左-顶部);
返回新的Rect(Math.round(rectF.left)、Math.round(rectF.top)、Math.round(rectF.right)、Math.round(rectF.bottom));
}
专用int夹(int x、int min、int max){
如果(x>最大值){
返回最大值;
}
如果(x
在某些相机支持对焦的设备中,您需要同时使用对焦测光,否则测光将不起作用。在某些相机支持对焦的设备中,您需要同时使用对焦测光,否则测光将不起作用。
   private void setMeteringParam() {
    synchronized (mCameraLock) {
        Camera.Parameters params = mMasterCamera.getParameters();
        if (params.getMaxNumMeteringAreas() > 0) {
            List<Camera.Area> meteringAreas = new ArrayList<>();
            meteringAreas.add(new Camera.Area(mMeteringRect, 800)); //100%
            params.setMeteringAreas(meteringAreas);
            params.setMeteringAreas(meteringAreas);
            params.setExposureCompensation(0);
            YMFLog.error("wudan", "Enable metering area! Metering Area = " + params.getMeteringAreas().toString());
        } else {
            YMFLog.error("wudan", "metering areas not supported");
        }
        mMasterCamera.setParameters(params);
    }

}

private Rect mMeteringRect = null;
public void handleMetering(MotionEvent event, int width, int height) {
    mMeteringRect = calculateTapArea(event.getX(), event.getY(), 1.0f, width, height);
    if (mMeteringRect != null) {
        setMeteringParam();
    }

}

private Rect calculateTapArea(float x, float y, float coefficient, int w, int h) {
    float focusAreaSize = 20;
    int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();
    int centerX = (int) (x / w * 2000 - 1000);
    int centerY = (int) (y / h * 2000 - 1000);

    int top = clamp(centerX - areaSize / 2, -1000, 1000 - areaSize);
    int left = clamp(centerY - areaSize / 2, -1000, 1000 - areaSize);

    RectF rectF = new RectF(-(left + areaSize),-(top + areaSize), -left, -top);

    return new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom));
}

private int clamp(int x, int min, int max) {
    if (x > max) {
        return max;
    }
    if (x < min) {
        return min;
    }
    return x;
}