android 相机闪光灯不工作

Camera flash is not working in android

我正在尝试制作一个简单的应用程序,单击按钮将打开相机闪光灯,再单击一次它将关闭,以便我们可以将其用作手电筒。但是闪光灯没有打开。下面是我的 flashfragment

public class FlashFragment extends Fragment {

private boolean isLighOn = false;
private Camera camera;
private Button button;

public FlashFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_flash, container, false);
    button = (Button) rootView.findViewById(R.id.buttonFlashlight);

    Context context = getActivity();
    PackageManager pm = context.getPackageManager();

    // if device support camera?
    if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        Log.e("err", "Device has no camera!");

    }
    try{
        camera = Camera.open();
        final Camera.Parameters p = camera.getParameters();

        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                if (isLighOn) {

                    Log.i("info", "torch is turn off!");

                    p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                    camera.stopPreview();
                    isLighOn = false;

                } else {

                    Log.i("info", "torch is turn on!");

                    p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                    camera.startPreview();
                    isLighOn = true;

                }

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

    // Inflate the layout for this fragment
    return rootView;
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
}

@Override
public void onDetach() {
    super.onDetach();
}
}

几年前,我遇到了很多关于相机和手电筒的问题。

有些设备比其他设备更陌生。

确保检查是否存在闪光灯

hasFlash = context.getPackageManager().hasSystemFeature(
            PackageManager.FEATURE_CAMERA_FLASH);

然后我发现,有些相机需要 surfaceTexture 来启用闪光灯(即使它只是一个虚拟的):

SurfaceTexture dummy = new SurfaceTexture(0);
mCamera.setPreviewTexture(dummy);

为了启用我使用了这个方法:

public void enable() {
    if (!isReady) {
        return;
    }
    try {
        mCamera.reconnect();
        mParameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
        mCamera.setParameters(mParameters);
        mCamera.startPreview();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

我不确定是否需要 reconnect()。但我很确定,startPreview() 是必需的。

最后我有了一些接受

的设备
Parameters.FLASH_MODE_ON

而不是 FLASH_MODE_TORCH。奇怪,因为 Docs 对那个模式说了一些不同的东西,但这是我过去经历过的(也许这个信息甚至已经过时了)。

别忘了释放相机。

希望这有助于最大限度地减少闪光灯的问题。

您刚刚错过了为相机设置参数的行

camera.setParameters(p);

因此,您的 onClickListener 代码应如下所示

 button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            if (isLighOn) {

                Log.i("info", "torch is turn off!");

                p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
                camera.setParameters(p);
                camera.stopPreview();
                isLighOn = false;

            } else {

                Log.i("info", "torch is turn on!");

                p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                camera.setParameters(p);
                camera.startPreview();
                isLighOn = true;

            }

        }
    });

这应该可以解决您的问题。它总是适用于我的情况。