【问题标题】:Camera flash is not working in android相机闪光灯在android中不起作用
【发布时间】:2016-02-03 15:25:03
【问题描述】:

我正在尝试制作一个简单的应用程序,它会在单击按钮时打开相机闪光灯,在另一次单击时它将关闭,以便我们可以将其用作手电筒。但是闪光灯没有打开。下面是我的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();
}
}

【问题讨论】:

标签: android android-camera flashlight


【解决方案1】:

几年前,我在使用相机和手电筒时遇到了很多问题。

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

确保检查是否存在闪存

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 对这种模式有不同的说法,但这是我过去所经历的(也许这个信息甚至已经过时了)。

别忘了松开相机。

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

【讨论】:

  • 有一个三星 XCover,闪光灯不会打开。在其他设备上,上述代码运行良好。对我来说,mCamera.setPreviewTexture(dummy); 是在该设备上启动闪光灯的解决方案。
【解决方案2】:

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

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;

            }

        }
    });

这应该可以解决您的问题。它在我的情况下总是有效的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多