2016-08-01 74 views
1

私はカスタムカメラでAndroidアプリを作成しています。私は新しいcamera2 APIに切り替えています。バックカメラがオンのときにフラッシュをオン/オフできるボタンがあります(カメラを止めずに、従来のカメラアプリのように)。私はフラッシュのアイコンをタップするとAndroid camera2 APIでフラッシュをオン/オフする

、何も起こりません、これはどのようなlogcatリターンである:それは働いていない理由を私は知らない

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

。コードは次のとおりです。

RecordVideoFragmentを使用しているRecordVideoActivityです。ここではフラッシュボタンのコードを含むフラグメントの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コード:

onViewCreated中で
ImageButton flashButton; 
private boolean hasFlash; 
private boolean isFlashOn = false; 

@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に見えたが、それは私の問題に対処していない)

あなたの助けをありがとうございました。これは私を夢中にさせている。

答えて

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

を追加し、このコード:

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

setupFlashButton(); 

を通話終了switchFlashで()クリックリスナーで

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

をオンにし、あなたが行ってもいいです。

関連する問題