3

Androidでzxingを使用してバーコードスキャン機能を統合しています。私のアプリには、ボタンを押すことでフラッシュライトのオン/オフ機能が含まれています。

フラッシュ ボタンを押すと、フラッシュがトーチ モードに設定され、そのパラメータがカメラ パラメータに設定されます。私は例外を得ました:Set Paramters failed exception.

これが私のコードです。

    Parameters p = camera.getParameters();
    List<String> supportedFlashModes =p.getSupportedFlashModes();

    if (active)
    {
        if(supportedFlashModes!= null)
        {
            if(supportedFlashModes.contains(Parameters.FLASH_MODE_TORCH))
            {
                p.setFlashMode(Parameters.FLASH_MODE_TORCH);
            }
        }
        CaptureActivity.flashLightON=true;
    }
    else
    {
        p.setFlashMode(Parameters.FLASH_MODE_OFF);
    }
    camera.setParameters(p);

次の例外が発生しました。

06-07 12:15:26.107: E/AndroidRuntime(24642): FATAL EXCEPTION: main
06-07 12:15:26.107: E/AndroidRuntime(24642): java.lang.RuntimeException:
 setParameters failed
06-07 12:15:26.107: E/AndroidRuntime(24642):    at 
 android.hardware.Camera.native_setParameters(Native Method)

この問題を解決する方法を教えてください。

4

7 に答える 7

3

Google Nexus One でも同じ問題が発生しました。オートフォーカスをキャンセルし、パラメータを設定してからオートフォーカスをリセットすることで、問題は解決しました

camera.cancelAutoFocus();
camera.setParameters(parameters);
camera.autoFocus(autoFocusCallback);

残念ながら、S3またはGalaxy Nexusでは機能せず、完全に失われるため、普遍的な回避策ではありません... SGが点滅し始め、S3がオートフォーカスを停止します。プレビューを停止し、パラメーターを設定した後に再起動することで、S3 の問題を解決しました。

于 2012-12-21T14:15:03.330 に答える
2

同じ問題がありました。カメラをオンにして懐中電灯をオンにすると、パラメーターを同時に設定すると(特にオートフォーカス間隔が短い場合)、オートフォーカスの衝突が発生します。懐中電灯を有効/無効にする直前にこれを貼り付けます。有効にするイベントが遅くなりますが、クラッシュは発生しません (ただし、100% クラッシュプルーフではありません)。

//スリープ時間は長くする必要があり、一部のデバイスではクラッシュを防ぐには3000ミリ秒で十分である必要があります.2000ミリ秒は少しだけかもしれません(Sony Xperiaデバイスではまだクラッシュします)-なぜこれがそのように機能するのかわかりません:D

try {
       Thread.currentThread().sleep(3000);
       }
     catch (InterruptedException e) {
       e.printStackTrace();
       }

編集: この問題を解決するより良い方法は、 setParameters メソッドをループに入れて、毎回実行時例外をキャッチすることです。例外がない場合、または (オプションの) ループ カウンターが最大値に達した場合は、ループを終了します。

final int MAX_TRIES = 100;
boolean success = false;
int triesCounter = 0;
while (!success) {
 try {
 triesCounter++;
 if (triesCounter > MAX_TRIES) {
 success = true;
 }
 parameters = camera.getParameters();
 if (parameters != null) {
  parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
  camera.setParameters(parameters);
 }
 success = true;
 } catch (Exception exception) {

 }
}
于 2012-09-14T10:51:28.367 に答える
0

カメラをオン/トラウチ (FLASH_MODE_TORCH) にして懐中電灯をオンにすると、パラメーターを同時に設定するときに (特にオートフォーカス間隔が短い場合)、オートフォーカスの衝突が発生します。

私はスレッドの回避策が好きではありません。だから私はそれをこのように修正しました

...
private Boolean _flashOn = null;
...
private Runnable doAutoFocus = new Runnable() {
        public void run() {
            if (previewing) {
                if (_flashOn != null) {
                    Parameters p = mCamera.getParameters();
                    if (_flashOn) {
                        p.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    }else{
                        p.setFlashMode(Parameters.FLASH_MODE_OFF);
                    }
                    mCamera.setParameters(p);
                    _flashOn = null;
                }
                mCamera.autoFocus(autoFocusCB);
            }
        }
    };

現在、RuntimeException はありません。

ただし、Motorala Milestone/Samsun I9100G/Blahblah など、一部の Android デバイスにはまだ FLASH_MODE_TORCH + autoFocus のバグがあります。

Android の拒否された問題も参照してください: https://code.google.com/p/android/issues/detail?id=14360

ところで。ZBar は ZXing よりも高速です :)

于 2013-06-27T02:11:17.693 に答える
0

一部のデバイスはサポートしていないため、このような問題が発生します。以下のリンクを参照して、それについて明確なアイデアを得ることができます。 Androidでプログラムでカメラのフラッシュライトをオンにする方法は?

于 2012-06-07T08:07:59.067 に答える
0

機能する 1 つの解決策は、カメラ パラメーターのキューを作成することです。トーチを設定すると、トーチ パラメータがキューに追加されます。

onAutoFocus コールバック内で、すべてのキュー アイテムを反復処理してコミットする関数を呼び出します。このようにして、オートフォーカスしないことが保証されます。

于 2012-10-15T21:51:11.410 に答える
-1

このコードを試してください。それは私とうまくいきました。

private void turnOnFlashLight(){
if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA)) 
{
    //Check for Device Camera
    Toast.makeText(this, getString(R.string.no_device_camera_msg), Toast.LENGTH_SHORT).show();
    flashLightControl.setChecked(false);
    return;

}else if (!pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) 
{
    //Check for Camera flash
    Toast.makeText(this, getString(R.string.no_camera_flash), Toast.LENGTH_SHORT).show();
    flashLightControl.setChecked(false);
    return;

}else
{
    //BIG ISSUE Fash mode is device specific
    //Turn On Flash
    String _model = android.os.Build.MODEL;
    String _manufaturer = android.os.Build.MANUFACTURER;
    if((_model.contains("GT-S5830") && _manufaturer.contains("samsung"))) //|| (_manufaturer.contains("lge")))
    {

        new Thread(new Runnable() 
        {

            @Override
            public void run() 
            {
                // TODO Auto-generated method stub
                Log.d(TAG, "From TimerTask..!!!");
                cameraParams = CameraManager.camera.getParameters();
                //cameraParams.setFlashMode(Parameters.FLASH_MODE_TORCH);
                cameraParams.set("flash-mode", "on");
                CameraManager.camera.setParameters(cameraParams);
                CameraManager.camera.startPreview();
                isFlash_On_Mode_Device = true;
                isLightOn = true;
                try{
                    Thread.sleep(2000);
                    Log.d(TAG, "From TimerTask After sleep!!!");
                    cameraParams = CameraManager.camera.getParameters();
                    cameraParams.setFlashMode(Parameters.FLASH_MODE_OFF);
                    CameraManager.camera.setParameters(cameraParams);
                    CameraManager.camera.startPreview();
                    isLightOn = true;
                } 
                  catch(Exception e){}



            }
        }).start();

    }else if(_manufaturer.contains("lge"))
    {
        //Log.d(TAG, "From LG");
        cameraParams = CameraManager.camera.getParameters();
        cameraParams.setFlashMode(Parameters.FLASH_MODE_ON);
        CameraManager.camera.setParameters(cameraParams);
        CameraManager.camera.startPreview();
        isLightOn = true;
    }
    else  if(CameraManager.camera != null)
    {
        cameraParams = CameraManager.camera.getParameters();
        //cameraParams.setFlashMode(Parameters.FLASH_MODE_TORCH);
        cameraParams.set("flash-mode", "torch");
        CameraManager.camera.setParameters(cameraParams);
        CameraManager.camera.startPreview();
        isLightOn = true;
            }
}
private void turnOffFlashLight()
{
if (isLightOn) 
{

    if(CameraManager.camera != null)
    {
        if(isFlash_On_Mode_Device)
        {
            CameraManager.get().closeDriver();
            SurfaceHolder surfaceHolder = surfaceView.getHolder();
            if (hasSurface) 
            {
                initCamera(surfaceHolder);
                if(CameraManager.camera != null)
                    CameraManager.camera.startPreview();
            } 
            //Log.d(TAG, "Stopping camera..!!!");
        }else
        {
            cameraParams = CameraManager.camera.getParameters();
            cameraParams.setFlashMode(Parameters.FLASH_MODE_OFF);
            CameraManager.camera.setParameters(cameraParams);
            CameraManager.camera.startPreview();
        }

        isLightOn = false;
        isFlash_On_Mode_Device = false;
    }

 }
}
于 2012-06-07T12:08:59.190 に答える