Android 打开/关闭zxing中的手电筒

Android 打开/关闭zxing中的手电筒,android,android-fragments,zxing,barcode-scanner,Android,Android Fragments,Zxing,Barcode Scanner,我已经在我的应用程序中实现了Zxing条码扫描库。我使用了以下库: 我想在扫描时点击按钮打开/关闭闪光灯,但我无法做到这一点。库为同一个函数公开了一个函数,但该函数不起作用 使用的代码是: fragment=(BarcodeFragment)getSupportFragmentManager().findFragmentById(R.id.sample); fragment.getCameraManager().setTorch(true) 为我提供任何可以打开/关闭手电筒的参考代码。为了控制闪

我已经在我的应用程序中实现了Zxing条码扫描库。我使用了以下库: 我想在扫描时点击按钮打开/关闭闪光灯,但我无法做到这一点。库为同一个函数公开了一个函数,但该函数不起作用

使用的代码是: fragment=(BarcodeFragment)getSupportFragmentManager().findFragmentById(R.id.sample); fragment.getCameraManager().setTorch(true)


为我提供任何可以打开/关闭手电筒的参考代码。

为了控制闪光灯,您需要将以下权限和功能添加到清单中

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

这是一个示例代码-

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ToggleButton;

/**
 * @author Prabu 
 * July 30 2013
 * @version 1.0
 * 
 */
public class FlashlightActivity extends Activity {
 private Camera camera;
 private ToggleButton button;
 private final Context context = this;
 /**
  * @see android.app.Activity#onStop()
  */
 @Override
 protected void onStop() {
  super.onStop();
  if (camera != null) {
   camera.release();
  }
 }

 /**
  * @see android.app.Activity#onCreate(android.os.Bundle)
  */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.flashlight);
  button = (ToggleButton) findViewById(R.id.togglebutton);

  final PackageManager pm = context.getPackageManager();
  if(!isCameraSupported(pm)){
   AlertDialog alertDialog = new AlertDialog.Builder(context).create();
   alertDialog.setTitle("No Camera");
      alertDialog.setMessage("The device's doesn't support camera.");
      alertDialog.setButton(RESULT_OK, "OK", new DialogInterface.OnClickListener() {
          public void onClick(final DialogInterface dialog, final int which) { 
           Log.e("err", "The device's doesn't support camera.");
          }
       });
   alertDialog.show();
  }
  camera = Camera.open();
 }
 public void onToggleClicked(View view) {
  PackageManager pm=context.getPackageManager();
  final Parameters p = camera.getParameters();
  if(isFlashSupported(pm)){
   boolean on = ((ToggleButton) view).isChecked();
   if (on) {
    Log.i("info", "torch is turn on!");
    p.setFlashMode(Parameters.FLASH_MODE_TORCH);
    camera.setParameters(p);
    camera.startPreview();
   } else {
    Log.i("info", "torch is turn off!");
    p.setFlashMode(Parameters.FLASH_MODE_OFF);
    camera.setParameters(p);
    camera.stopPreview();
   }
  }else{
   button.setChecked(false);
   AlertDialog alertDialog = new AlertDialog.Builder(context).create();
   alertDialog.setTitle("No Camera Flash");
      alertDialog.setMessage("The device's camera doesn't support flash.");
      alertDialog.setButton(RESULT_OK, "OK", new DialogInterface.OnClickListener() {
          public void onClick(final DialogInterface dialog, final int which) { 
           Log.e("err", "The device's camera doesn't support flash.");
          }
       });
   alertDialog.show();
  }
 }
 /**
  * @param packageManager
  * @return true <b>if the device support camera flash</b><br/>
  * false <b>if the device doesn't support camera flash</b>
  */
 private boolean isFlashSupported(PackageManager packageManager){ 
  // if device support camera flash?
  if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
   return true;
  } 
  return false;
 }

 /**
  * @param packageManager
  * @return true <b>if the device support camera</b><br/>
  * false <b>if the device doesn't support camera</b>
  */
 private boolean isCameraSupported(PackageManager packageManager){
  // if device support camera?
  if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
   return true;
  } 
  return false;
 }
}
导入android.app.Activity;
导入android.app.AlertDialog;
导入android.content.Context;
导入android.content.DialogInterface;
导入android.content.pm.PackageManager;
导入android.hardware.Camera;
导入android.hardware.Camera.Parameters;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.ToggleButton;
/**
*@作者普拉布
*2013年7月30日
*@version 1.0
* 
*/
公共类FlashlightActivity扩展了活动{
私人摄像机;
专用切换按钮;
私有最终上下文=此;
/**
*@see android.app.Activity#onStop()
*/
@凌驾
受保护的void onStop(){
super.onStop();
如果(照相机!=null){
相机。释放();
}
}
/**
*@see android.app.Activity#onCreate(android.os.Bundle)
*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、手电筒);
按钮=(ToggleButton)findViewById(R.id.ToggleButton);
final-PackageManager pm=context.getPackageManager();
如果(!isCameraSupported(pm)){
AlertDialog AlertDialog=新建AlertDialog.Builder(context.create();
alertDialog.setTitle(“无摄像头”);
alertDialog.setMessage(“设备不支持摄像头”);
alertDialog.setButton(结果_OK,“OK”,新的DialogInterface.OnClickListener(){
public void onClick(final DialogInterface dialog,final int which){
Log.e(“err”,“设备不支持摄像头”);
}
});
alertDialog.show();
}
camera=camera.open();
}
已勾选公共空间(视图){
PackageManager pm=context.getPackageManager();
最终参数p=camera.getParameters();
如果(支持iFlashSupported(pm)){
布尔on=((ToggleButton)视图).isChecked();
如果(打开){
Log.i(“信息”,“火炬打开了!”);
p、 设置闪光模式(参数:闪光模式);
摄像机参数设置(p);
camera.startPreview();
}否则{
Log.i(“信息”,“火炬已关闭!”);
p、 设置闪光模式(参数。闪光模式关闭);
摄像机参数设置(p);
camera.stopPreview();
}
}否则{
按钮。setChecked(假);
AlertDialog AlertDialog=新建AlertDialog.Builder(context.create();
alertDialog.setTitle(“无照相机闪光灯”);
alertDialog.setMessage(“设备的摄像头不支持闪光灯”);
alertDialog.setButton(结果_OK,“OK”,新的DialogInterface.OnClickListener(){
public void onClick(final DialogInterface dialog,final int which){
Log.e(“呃”,“设备的摄像头不支持闪光灯”);
}
});
alertDialog.show();
}
}
/**
*@param packageManager
*@如果设备支持照相机闪光灯,则返回true
*如果设备不支持照相机闪光灯,则为false */ 支持私有布尔值(PackageManager PackageManager){ //如果设备支持照相机闪光灯? if(packageManager.hasSystemFeature(packageManager.FEATURE\u摄像头\u闪光灯)){ 返回true; } 返回false; } /** *@param packageManager *@如果设备支持摄像头,则返回true
*如果设备不支持摄像头,则为false */ 支持私有布尔值(PackageManager PackageManager){ //如果设备支持摄像头? if(packageManager.hasSystemFeature(packageManager.FEATURE_摄像头)){ 返回true; } 返回false; } }

对于完整的源代码->

请从zxing源代码打开CameraManager活动,并在StartView()中粘贴以下代码。在照相机之前。startPreview()


您应该浏览
zxing android embedded
库中的示例应用程序,在那里您可以找到
CustomScanneActivity
类,该类显示如何打开和关闭闪光灯 以下是链接:

上面链接中的代码示例:

public class CustomScannerActivity extends Activity implements
    DecoratedBarcodeView.TorchListener {

private CaptureManager capture;
private DecoratedBarcodeView barcodeScannerView;
private Button switchFlashlightButton;

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

    barcodeScannerView = (DecoratedBarcodeView)findViewById(R.id.zxing_barcode_scanner);
    barcodeScannerView.setTorchListener(this);

    switchFlashlightButton = (Button)findViewById(R.id.switch_flashlight);

    // if the device does not have flashlight in its camera,
    // then remove the switch flashlight button...
    if (!hasFlash()) {
        switchFlashlightButton.setVisibility(View.GONE);
    }

    capture = new CaptureManager(this, barcodeScannerView);
    capture.initializeFromIntent(getIntent(), savedInstanceState);
    capture.decode();
}

@Override
protected void onResume() {
    super.onResume();
    capture.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    capture.onPause();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    capture.onDestroy();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    capture.onSaveInstanceState(outState);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
}

/**
 * Check if the device's camera has a Flashlight.
 * @return true if there is Flashlight, otherwise false.
 */
private boolean hasFlash() {
    return getApplicationContext().getPackageManager()
            .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}

public void switchFlashlight(View view) {
    if (getString(R.string.turn_on_flashlight).equals(switchFlashlightButton.getText())) {
        barcodeScannerView.setTorchOn();
    } else {
        barcodeScannerView.setTorchOff();
    }
}

@Override
public void onTorchOn() {
    switchFlashlightButton.setText(R.string.turn_off_flashlight);
}

@Override
public void onTorchOff() {
    switchFlashlightButton.setText(R.string.turn_on_flashlight);
} 
}
您可以使用以下选项:

public void flashON(View v) {
        mScannerView.setFlash(true);
    }

    public void flashOFF(View v){
        mScannerView.setFlash(false);
    }
其中闪络和闪络是两个图像按钮。 这是xml:

 <me.dm7.barcodescanner.zxing.ZXingScannerView
        android:id="@+id/zxscan"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </me.dm7.barcodescanner.zxing.ZXingScannerView>

    <ImageButton
        android:id="@+id/FlashON"
        android:onClick="flashON"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignEnd="@+id/FlashOFF"
        android:layout_alignParentTop="true"
        android:layout_alignRight="@+id/FlashOFF"
        android:layout_marginEnd="60dp"
        android:layout_marginRight="60dp"
        android:src="@drawable/flashon" />

    <ImageButton
        android:id="@+id/FlashOFF"
        android:onClick="flashOFF"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/NumeEchip"
        android:layout_marginEnd="13dp"
        android:layout_marginRight="13dp"
        android:src="@drawable/flashoff" />

在中,您可以看到:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
      case KeyEvent.KEYCODE_VOLUME_DOWN:
        cameraManager.setTorch(false);
        return true;
      case KeyEvent.KEYCODE_VOLUME_UP:
        cameraManager.setTorch(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
  }

如果你使用手电筒,然后你想打开相机的手电筒被禁用,并得到错误。因为现在你必须使用相机的闪光灯功能。因此,您可以关闭手电筒并打开相机的手电筒。但只要你只想使用相机的手电筒,这很简单

ZXingScannerView mScannerView;
qrcode_btn.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
      mScannerView = new ZXingScannerView(ctx);
      contentFrame.addView(mScannerView);
      mScannerView.setResultHandler(ActivityMain.this);
      mScannerView.startCamera();
      mScannerView.setFlash(true);
   }
}
如果在ZXing之前打开手电筒,则必须在ZXing之前关闭手电筒

flashLightOff();
public void flashLightOff() {
   CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
   try {
      boolean flashAvailable = cameraManager.getCameraCharacteristics("0").get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
   } catch (CameraAccessException e) {
      e.printStackTrace();
   }

   try {
      String cameraId = cameraManager.getCameraIdList()[0];
      cameraManager.setTorchMode(cameraId, false);
      flashLightStatus = false;
      flashlight.setColorFilter(ContextCompat.getColor(context, R.color.grey_dark));
   } catch (CameraAccessException e) {
   }
}

由于Api级别,此处不推荐使用Camera参数。是否有其他选项可以启动Camerause setTorchOn(打开)和setTorchOff(关闭)
flashLightOff();
public void flashLightOff() {
   CameraManager cameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
   try {
      boolean flashAvailable = cameraManager.getCameraCharacteristics("0").get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
   } catch (CameraAccessException e) {
      e.printStackTrace();
   }

   try {
      String cameraId = cameraManager.getCameraIdList()[0];
      cameraManager.setTorchMode(cameraId, false);
      flashLightStatus = false;
      flashlight.setColorFilter(ContextCompat.getColor(context, R.color.grey_dark));
   } catch (CameraAccessException e) {
   }
}