Android_小白 2019-06-17 18:52 采纳率: 0%
浏览 679

camera2 开发时, 在光线不足的情况下拍照, 不开闪光灯,为什么不出图片?

camera2 开发时, 在光线不足的情况下拍照, 不开闪光灯, 不回回调这个onImageAvailable方法,为什么啊? 要求怎么在光线不足的情况下出图片,不清楚都没关系??

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) {

        Log.e("LOG" ,"camera2 拍照得到图片");

        showToast("dedao tup ");
        mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile));
    }

};

    如图: 在这中光线中拍照,camera2 不回调onImageAvailable。


    ![图片说明](https://img-ask.csdn.net/upload/201906/17/1560768675_147503.png)
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-10 09:58
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由于Android Studio的默认相机库(Camera2)在光线不足的时候不会自动开启闪光灯,而是使用了系统自带的补光灯。

    如果你想要在没有闪光灯的情况下拍摄照片,你可以在你的Activity或Fragment类中添加一个自定义的方法来处理这种情况:

    public class MyPhotoCapture extends AppCompatActivity {
        private Camera2 camera;
        // ...
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            camera = getCameraInstance();
            if (camera == null) {
                Toast.makeText(this, "Failed to get a camera instance", Toast.LENGTH_SHORT).show();
                return;
            }
            
            // ...
        }
    
        public static Camera2 getCameraInstance() {
            try {
                Class<?> clazz = Class.forName("com.android.camera.Camera2");
                Object camera = clazz.getDeclaredMethod("getInstance").invoke(null);
                return (Camera2) camera;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        public void takePhoto(String fileName) {
            // ... 你的拍照逻辑
        }
    
        // 这里是你想在没有闪光灯的情况下拍照的地方
        public void takePhotoWithoutFlash() {
            takePhoto(fileName);
        }
    
        // 在调用takePhotoWithoutFlash后,你需要在主线程中触发事件
        private void triggerTakePhotoEvent() {
            // 在这里添加你的逻辑
        }
    }
    

    然后,在MainActivity或其他需要调用takePhotoWithoutFlash()方法的地方,你可以这样调用它:

    MyPhotoCapture activity = (MyPhotoCapture) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    activity.takePhotoWithoutFlash();
    

    注意,这种方法只能保证在没有闪光灯的情况下拍照,并不能保证每次都能成功获取到图像。如果闪光灯仍然不工作,可能是因为设备本身的问题或者应用配置问题。

    评论

报告相同问题?