2016-08-01 16 views
1

Ich erstelle eine Android-App mit einer benutzerdefinierten Kamera und ich bin auf die neue camera2 API umgestellt. Ich habe eine Taste, die es ermöglicht, den Blitz ein- und auszuschalten, wenn die Rückfahrkamera eingeschaltet ist (ohne die Kamera anzuhalten, wie bei jeder klassischen Kamera-App).Flash ein-/ausschalten mit Android camera2 API funktioniert nicht

Wenn ich den Blitz-Symbol tippen, geschieht nichts, und das ist, was die logcat kehrt:

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

Ich weiß nicht, warum es nicht funktioniert. Hier ist der Code:

Ich habe eine RecordVideoActivity mit einem RecordVideoFragment. Hier ist das XML-Teil des Fragments, das den Flash-Taste Code enthält:

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

Und den Java-Code:

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

Mit im 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(); 
     } 
    }); 

Und hier ist die actionFlash() Funktion definition:

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(); 
     } 
    } 
} 

Irgendeine Idee, was könnte falsch sein?

(Ich sah schon bei this question aber es geht nicht mein Problem)

Ihnen sehr für Ihre Hilfe danken. Das macht mich verrückt.

Antwort

4

Erstellen dieser Variablen:

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; 

dann diese Methoden hinzufügen:

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); 
    } 
} 

nach diesem line diesen Code hinzu:

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

setupFlashButton(); 

am Ende Aufruf switchFlash() in Ihrem gewünschten Klick-Listener.

und voilà!

PS. Dies könnte hilfreich sein - front/back camera switcher

0

Das Problem mit dem Code "mCameraManager.setTorchMode (mCameraId, true);" Dieser Aufruf erfordert API 23+. Daher können Sie diese systemeigene Methode nicht von APIs aufrufen, die niedriger als API 23 sind. Sie können die API für die entschlüsselte Kamera verwenden. Es funktioniert für alle Geräte und wird in naher Zukunft noch ziemlich lange funktionieren. Hier ist, was Sie tun könnten, fügen Sie diesen Code mit If-Else-Anweisungen. Wenn das Gerät API23 + ist, verwenden Sie Camera2, andernfalls Camera. Das ist, was ich tue.

Hardware hinzufügen.Kamera in Ihrer Importe

import android.hardware.Camera; 

initialisieren Variablen

Camera camera; 
Camera.Parameters params; 

nun Holen Sie sich das Kamera und schalten Sie den Blitz

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(); 
    } 

Und Sie sind gut zu gehen.