闪光灯未检测到。

7

我正在编写一个应用程序,当按下按钮时会打开闪光灯。问题是该应用程序无法检测到我的手机上的闪光灯。我在互联网上搜索了很多资料,确实有其他人遇到了这个问题,我也尝试了那些解决方案,但它们似乎都不起作用。我不知道是什么原因导致了这个问题。以下是代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_starting_point);

    if(! getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) // checking if flash light is available inn android phone
    {
        Toast.makeText(StartingPoint.this, "Sorry this app can't work without flash light", Toast.LENGTH_LONG).show();
        finish();
    }

    cam = Camera.open();

    param = cam.getParameters();


}

@Override
public void onClick (View v)
{
      if(!flashOn)
        {
            i=0;

            flashOn=true;

            param.setFlashMode(Parameters.FLASH_MODE_TORCH);
            cam.setParameters(param);
            cam.startPreview();
        }
        else{
                i=0;

                flashOn=false;

                param.setFlashMode(Parameters.FLASH_MODE_OFF);
                cam.setParameters(param);
                cam.stopPreview();
            }

我已经在 Android Manifest 中添加了这些权限。

<uses-permission android:name="android.permission.FLASHLIGHT"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
 <uses-feature android:name="android.hardware.camera.autofocus" />

敬礼


1
你尝试在onCreate()的第一个if()语句之前加入这些行cam = Camera.open(); param = cam.getParameters();了吗? - jofftiquez
你在所有设备上测试过这个吗? - Hybrid Developer
请在XOLO A600或Moto G上测试@Ilya_Gazman的代码... - Niko
4个回答

2

我有一个检查手电筒功能的应用程序,它运行良好。以下是我用于检查用户是否拥有灯光的代码:

if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
    new AlertDialog.Builder(this)
    .setTitle("Sorry")
    .setMessage("It appears that your device is incompatible with this app. Sorry for the inconvenience.")
    .setNeutralButton("Close", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface arg0, int arg1) {
            finish();
        }
    }).show();
    return;
}

现在要让灯光正常工作,我制作了一个切换按钮并编写了以下代码:

private boolean isLightOn = false;
private Camera camera;
private ToggleButton button;
public Vibrator v;

if (camera == null) {
    camera = Camera.open();
}

final Parameters p = camera.getParameters();

button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {

        if (isLightOn) {

        Toast.makeText(context, "Light off!", Toast.LENGTH_SHORT).show();
        v.vibrate(40);
        p.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(p);
        camera.stopPreview();
        isLightOn = false;

        } else {

            Toast.makeText(context, "Light on!", Toast.LENGTH_SHORT).show();
        v.vibrate(40);
        p.setFlashMode(Parameters.FLASH_MODE_TORCH);
        camera.setParameters(p);
        camera.startPreview();
        isLightOn = true;

        }

    }
});

最后,这里是我所使用的唯一权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

注意:以上所有代码都在我的活动的onCreate方法中。
希望这能解决您的问题!

0

有些相机需要表面支架,否则会挡住闪光灯。

SurfaceView preview = (SurfaceView) findViewById(...);
SurfaceHolder holder = preview.getHolder();
holder.addCallback(this);
Camera camera = Camera.open();
camera.setPreviewDisplay(holder);

@Niko 不是的,我只是编了一个程序,想看看我的图标在屏幕上出现。 - Ilya Gazman
呵呵,好有趣啊!:P - Niko
我对这个问题感到绝望,现在我的问题是我的应用程序在我所有的设备上都可以运行,我没有一个设备不能使用旧代码... 我在XOLO A600上发现了这个问题。 - Niko
这是否发生在Moto G上? - Niko

0

我认为你没有再次设置参数: 我使用这个来检查是否有手电筒:

public static Boolean hasFlashLight(Context context){
    return context.getApplicationContext().getPackageManager()
            .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}

并且可以打开和关闭它:

Parameters params = mCamera.getParameters();
if (!isFlashlightOn) {
    params.setFlashMode(Parameters.FLASH_MODE_OFF);
} else {
    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
}
mCamera.setParameters(params);

如果这对你也有效,请告诉我。


好的,我现在明白了。你是在哪个设备上测试这个问题?其他设备也有同样的问题吗? - Francesco verheye

0

我也遇到了同样的问题。使用这个。

if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
  //Flash ok
  Parameters params = mCamera.getParameters();
  params.setFlashMode(Parameters.FLASH_MODE_TORCH);
} else {
  //Flash not supported
}

判断您的设备是否具有Flash。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接