-1

フラッシュカメラを点滅させるアプリを作成していますが、メソッドをオフにするのに問題があります。これらは私の変数です:

Camera camera = null;
Parameters parameters;
int delay = 600;
int period = 600;
int delay1 = 300;
int period1 = 600;
Timer timer, timer2;

フラッシュカメラを点滅させるために使用しているこの方法:

timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            cameraOn();
            }
    },delay1,period1);

    timer2 = new Timer();
    timer2.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            cameraOff();
            }
    },delay,period);

そして今、問題が発生します。これらすべてをオフにするボタンがありますが、機能する場合と機能しない場合があります。完全にオフになることもあれば、希望どおりに前のアクティビティに戻ることもありますが、フラッシュカメラはオンのままです。なにが問題ですか?カメラのフラッシュのオン/オフを切り替える方法は次のとおりです。

private void cameraOff() {
     parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
     camera.setParameters(parameters);
     camera.release();
     camera = null;
}

private void cameraOn() {
     camera = Camera.open();
     parameters = camera.getParameters();
     parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
     camera.setParameters(parameters);
}

そして、ここにボタンがあります:

@Override
public void onClick(View arg0) {
    timer.cancel();
    timer2.cancel();
    if(camera != null){
        cameraOff();
    }else{
        finish();
    }
}
4

1 に答える 1

0

設計上の欠陥により、(提供された) アプリケーションは決して機能しません。

cameraOff()に設定cameraした方法でnull。このメソッドは一定の間隔でトリガーされるため、次にメソッドが再度呼び出されると、NullPointerExceptionas was が...cameraに設定されます。null

に設定したくなる理由はわかりませんが、別の場所で設定するか、 であるnullかどうかのチェックを追加する必要があります。cameranull

さらに(問題の原因として考えられる)、TimerTasks別のスレッドで実行されます。タイマーをキャンセルすると、 の値が不明になり、が 2 回呼び出さcameraれる可能性があります。cameraOff()スレッドからTimerTask1回(実行しようとしていたため)、メインスレッドから1回(cameraまだ設定されていなかったためnull)。

繰り返しますが、これがほとんどの問題を引き起こしているように見えるので、なぜ に設定する必要があるのだろうかと思いcameraます。null

于 2013-01-05T10:39:30.303 に答える