2016-08-01 257 views
1

我正在使用自定义相机创建Android应用程序,并且正在切换到新的camera2 API。我有一个按钮,可以在背面照相机打开时打开和关闭闪光灯(不需要停止照相机,就像任何经典的照相机应用程序一样)。使用Android camera2 API打开/关闭闪光灯不起作用

当我点击闪光图标,没有任何反应,这是什么logcat的回报:

D/ViewRootImpl: ViewPostImeInputStage processPointer 0 
D/ViewRootImpl: ViewPostImeInputStage processPointer 1 

我不知道为什么它不工作。这里是代码:

我有一个RecordVideoActivity使用RecordVideoFragment。这里是包含Flash按钮的代码片段的XML部分:

<ImageButton 
    android:id="@+id/button_flash" 
    android:src="@drawable/ic_flash_off" 
    android:layout_alignParentLeft="true" 
    style="@style/actions_icons_camera" 
    android:onClick="actionFlash"/> 

和Java代码:

ImageButton flashButton; 
private boolean hasFlash; 
private boolean isFlashOn = false; 

随着在onViewCreated

@Override 
public void onViewCreated(final View view, Bundle savedInstanceState) { 
    ... 
    [some code] 
    ... 
    // Flash on/off button 
    flashButton = (ImageButton) view.findViewById(R.id.button_flash); 
    // Listener for Flash on/off button 
    flashButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      actionFlash(); 
     } 
    }); 

这里是actionFlash()功能定义:

private void actionFlash() { 

    /* First check if device is supporting flashlight or not */ 
    hasFlash = getActivity().getApplicationContext().getPackageManager() 
      .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

    if (!hasFlash) { 
     // device doesn't support flash 
     // Show alert message and close the application 
     AlertDialog alert = new AlertDialog.Builder(this.getActivity()) 
       .create(); 
     alert.setMessage("Sorry, your device doesn't support flash light!"); 
     alert.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
      } 
     }); 
     alert.show(); 
     return; 
    } 
    else { // the device support flash 
     CameraManager mCameraManager = (CameraManager) getActivity().getSystemService(Context.CAMERA_SERVICE); 
     try { 
      String mCameraId = mCameraManager.getCameraIdList()[0]; 
      if (mCameraId.equals("1")) { // currently on back camera 
       if (!isFlashOn) { // if flash light was OFF 
        // Turn ON flash light 
        try { 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
          mCameraManager.setTorchMode(mCameraId, true); 
         } 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        // Change isFlashOn boolean value 
        isFlashOn = true; 
        // Change button icon 
        flashButton.setImageResource(R.drawable.ic_flash_off); 

       } else { // if flash light was ON 
        // Turn OFF flash light 
        try { 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
          mCameraManager.setTorchMode(mCameraId, false); 
         } 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
        // Change isFlashOn boolean value 
        isFlashOn = false; 
        // Change button icon 
        flashButton.setImageResource(R.drawable.ic_flash_on); 
       } 
      } 
     } catch (CameraAccessException e) { 
      Toast.makeText(getActivity(), "Cannot access the camera.", Toast.LENGTH_SHORT).show(); 
      getActivity().finish(); 
     } 
    } 
} 

有什么想法可能是错的?

(我已经看了this question但它并没有解决我的问题)

非常感谢您的帮助。这真让我抓狂。在结束通话switchFlash

Boolean available = characteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE); 
isFlashSupported = available == null ? false : available; 

setupFlashButton(); 

()

回答

4

创建这些变量:

public static final String CAMERA_FRONT = "1"; 
    public static final String CAMERA_BACK = "0"; 

    private String cameraId = CAMERA_BACK; 
    private boolean isFlashSupported; 
    private boolean isTorchOn; 

然后将这些方法:本line

public void switchFlash() { 
    try { 
     if (cameraId.equals(CAMERA_BACK)) { 
      if (isFlashSupported) { 
       if (isTorchOn) { 
        mPreviewBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); 
        mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, null); 
        flashButton.setImageResource(R.drawable.ic_flash_off); 
        isTorchOn = false; 
       } else { 
        mPreviewBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); 
        mPreviewSession.setRepeatingRequest(mPreviewBuilder.build(), null, null); 
        flashButton.setImageResource(R.drawable.ic_flash_on); 
        isTorchOn = true; 
       } 
      } 
     } 
    } catch (CameraAccessException e) { 
     e.printStackTrace(); 
    } 
} 

public void setupFlashButton() { 
    if (cameraId.equals(CAMERA_BACK) && isFlashSupported) { 
     flashButton.setVisibility(View.VISIBLE); 

     if (isTorchOn) { 
      flashButton.setImageResource(R.drawable.ic_flash_off); 
     } else { 
      flashButton.setImageResource(R.drawable.ic_flash_on); 
     } 

    } else { 
     flashButton.setVisibility(View.GONE); 
    } 
} 

添加以下代码在你想要的点击监听器中。

etvoilà!

PS。这可能会有所帮助 - front/back camera switcher

0

您的代码存在的问题是“mCameraManager.setTorchMode(mCameraId,true);” 此通话需要API 23+。因此,您不能从低于API 23的API调用此本地方法。 您可以使用Depricated Camera API进行操作。它适用于所有设备,并会在不久的将来继续工作。 以下是您可以做的事情,使用if-else语句添加此代码。如果设备是API23 +,则使用Camera2,否则使用Camera。我就是做这个的。

添加硬件。相机在你的进口

import android.hardware.Camera; 

初始化变量

Camera camera; 
Camera.Parameters params; 

现在,拿相机,并打开闪光灯

try { 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     mCameraManager.setTorchMode(CameraId, true); 
    } 
else { 
camera = Camera.open(); 
params = camera.getParameters(); 
params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
camera.setParameters(params); 
camera.startPreview(); 
} 
catch (Exception e) 
{ 
e.printStackTrace(); 
    } 

,你是好去。