【问题标题】:Take picture with flash doesn't work用闪光灯拍照不起作用
【发布时间】:2017-10-11 00:55:53
【问题描述】:

我有一个在后台拍照的服务...该服务在三种模式下工作:

  1. 前凸轮
  2. 后凸轮
  3. 带闪光灯的后置摄像头

前两个效果很好,但是当为相机参数启用闪光灯时,“Camera.PictureCallback”中没有返回图像... 事实上,回调从未被触发。

闪光灯闪光,一切正常,但没有收到图像。

这是我的 onStartCommand :

public int onStartCommand(Intent intent, int flags, int startId) {

    try {
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_TOAST,
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
                PixelFormat.TRANSLUCENT
        );

        params.gravity = Gravity.TOP | Gravity.START;
        params.width = 1;
        params.height = 1;
        params.x = 0;
        params.y = 0;
        sv = new SurfaceView(getApplicationContext());

        windowManager.addView(sv, params);
        SurfaceHolder sHolder = sv.getHolder();
        sHolder.addCallback(this);

    } catch (Exception e) {
        e.printStackTrace();
    }

    return START_NOT_STICKY;
}

这是我的相机初始化代码:

                myCamera = Camera.open();

                if (myCamera != null) {
                    myCamera.setPreviewDisplay(sv.getHolder());
                    Camera.Parameters parameters = myCamera.getParameters();

                    parameters.setFlashMode(FLASH_MODE_ON);
                    parameters.setPictureFormat(ImageFormat.JPEG);
                    parameters.setJpegQuality(70);

                    // set camera parameters
                    myCamera.setParameters(parameters);

                    myCamera.startPreview();
                    myCamera.setErrorCallback(errorCallBack);
                    myCamera.takePicture(mShutter, null, mCall);
               }

【问题讨论】:

  • 如果是,那么您可能需要将闪光灯模式设置为:FLASH_MODE_ON 而不是 FLASH_MODE_AUTO。
  • 是的,代码被调用了...“FLASH_MODE”是一个从bundle extras中设置的变量...并且在启用flash时它被设置为“FLASH_MODE_ON”
  • 我有3个案例:前置摄像头(FLASH_MODE_OFF)-主摄像头(FLASH_MODE_AUTO)-主+闪光灯(FLASH_MODE_ON)
  • 该编辑没有影响您的问题吗?闪光灯还是不行?您正在使用哪种设备?
  • 不,同样的问题.... 华为 m8 和其他 OEM 设备

标签: android android-camera


【解决方案1】:

我使用以下代码,它适用于三星 Galaxy 6、7; Moto G4,LG(我不记得型号)。

    public void onMyClick(View v){
        startTakingPictures();
    }


    private void startTakingPictures() {
        try {
            android.hardware.Camera cam = android.hardware.Camera.open();
            if (cam != null) {

                int presentOrientation  = getResources().getConfiguration().orientation;

                SurfaceView sv = new SurfaceView(getBaseContext());
                cam.setPreviewDisplay(sv.getHolder());
                Camera.Parameters para = cam.getParameters();

                para.setRotation(ORIENTATIONS.get(presentOrientation));
                para.setFlashMode(Camera.Parameters.FLASH_MODE_ON);
//                Log.e(TAG, "lat lng == " + loc.getLatitude());
//                para.setGpsLatitude(loc.getLatitude());
//                para.setGpsLongitude(loc.getLongitude());
                cam.setParameters(para);

                cam.startPreview();
                cam.takePicture(null, null, getJpegCallBack());
            }

        }
        catch (Exception ex){
            Log.e(TAG, ex.getMessage());
        }
    }

    private Camera.PictureCallback getJpegCallBack() {
        Camera.PictureCallback jpg = new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {
                FileOutputStream fos;

                String path = getPathBaseName();
                if(path.isEmpty()){
                    return;
                }

                path = "image.jpg";
                Log.e(TAG, "Image path == " + path);

                try {
                    fos = new FileOutputStream(path);
                    fos.write(data);
                    fos.close();
                }
                catch (Exception ex) {
                    Log.e(TAG, ex.getMessage());
                }
            }
        };
        return jpg;
    }

编辑:

由于Camera 现在已被贬值,您可能需要实现android.hardware.camera2

您的设备可以支持的参数类型似乎存在问题。看看可用的闪光灯参数:

Camera.Parameters para = cam.getParameters();    
    for(String s : para.getSupportedFlashModes()){
        Log.e(TAG, "Supported Flash Mode =  " + s);
    }

您可能需要像这样设置闪光灯模式:

param.set("flash-mode", "on");
cam.setParameters(param);

除此之外,您可能还想查看 Karl Morrison 在这篇文章中的实现: Android camera: stopPreview vs releaseCamera

【讨论】:

  • 我使用了这个代码......(同样的问题)......它在 No_Flash_Mode 上工作正常......但是当启用 flash 时,设备在 takePicture() 方法之后挂起。在 stopPreview().. 和相机设备冻结.. 即使主相机应用程序也无法启动和使用相机。它给出了一个错误:“相机资源不是免费的,请关闭应用程序....等”
  • 在我发布的代码中没有stopPreview() 方法。可悲的是,我无法复制您的问题。我在循环中使用此代码,它每 3 秒拍一张照片,没有任何问题。你能发布你的错误日志吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多