2016-05-25 11 views
4

私は小さな機能を持っています。ユーザーが私のアプリからスイッチをオフにするか、アプリが終了するまで、トーチをオンにして、オンにしておきます。Androidは異なるAPIレベルをサポートするためにランタイム戦略を使用していますか?

  params = camera.getParameters(); 
      if (params.getFlashMode().equals(Parameters.FLASH_MODE_TORCH)) { 
       isFlashOn = true; 
       return; 
      } 
      params.setFlashMode(Parameters.FLASH_MODE_TORCH); 
      camera.setParameters(params); 
      camera.startPreview(); 

をとオフを切り替えるには:使用し

  if (params.getFlashMode().equals(Parameters.FLASH_MODE_OFF)) { 
       isFlashOn = false; 
       return; 
      } 
      params.setFlashMode(Parameters.FLASH_MODE_OFF); 
      camera.setParameters(params); 
      camera.stopPreview(); 

をしかし、私は、これは非常に堅牢ではないことに気づきます。最初はうまく動作しますが、その後(特にAPI Levle 22の電話では)動作しない可能性があります。 android.hardware.camera2でテストすることを考えていましたsuggested here if(android.os.Build.VERSION.SDK_INT> 20)と戦略(2つのクラスで実装された基本インターフェイス、古いAPIと1つの新しいcamera2 API

これはすべてのデバイスで安全ですか?私はアンドロイドクラスのためにそれを行うことができるとわかりましたが、私たち自身のクラスでも問題ありませんか?または、すべてのコードをスキャンし、それはそれは私がその小さな機能として2つのAPKを作成する必要はありませんでしょうか?

を知らないAPIを参照するコードを持っている。

私が上でテストされていない、フラッシュはこのような利用可能であることを確認してくださいGenymotionアプリのエミュレータでクラッシュすることはありませんでした。二つのクラス間で変更する

public boolean torchInit() { 
    try { 
     PackageManager pm = app.getPackageManager(); 
     // First check if device supports flashlight 
     boolean hasFlash = pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 
     if (!hasFlash) { 
      Toast.makeText(app, "Flash not found or can\'t get hold of it. No torch", Toast.LENGTH_LONG).show(); 
      return false; 
     } 
     camera = Camera.open(); 
     Camera.Parameters params = camera.getParameters(); 
     Log.i(LogId, "camera params flash: " + params.getFlashMode()); 
     return true; 
    } catch (Throwable e) { 
     Log.e(LogId, "cameraFlashSetup " + e, e); 
     Toast.makeText(app, "Flash error, no torch. Description : " + e, Toast.LENGTH_LONG).show(); 
     camera = null; 
    } 
    return false; 
} 

フラッシュインタフェースは次のとおりです。

public abstract class TorchInterface { 

protected AppCompatActivity app; 

public void init(AppCompatActivity ap){ 
    app = ap; 
} 

public abstract boolean torchInit(); 

public boolean torchReInit(){ 
    return torchInit();//if re init is not different than init 
} 

public abstract boolean torchOn(); 

public abstract boolean torchOff(); 

}

アップデート:新しいコードが働いただけで、私の場合:

mBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); 

の代わりに:

mBuilder = camera.createCaptureRequest(CameraDevice.TEMPLATE_MANUAL); 

しかし、アプリを起動するとすぐにスイッチがオンになります。

public boolean torchInit() { 
    //do nothing on usual init that app calls on create 
    return true; 
} 

、代わりに(上の点滅)にトーチ上のinitを実行します:

public boolean torchOn() { 
     //if not in it, try first 3 times 
     if(mBuilder == null || mSession == null){ 
      if(firstFewTimesTorchOn > 0){ 
       firstFewTimesTorchOn--; 
       torchInit2(); 
       try{ 
        Thread.sleep(150); 
       }catch(Exception e){} 
       if(mBuilder == null || mSession == null) { 
        return false; 
       } 
      } 
     } 
     try { 
      mBuilder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);//and etc 
+1

*これはすべてのデバイスで安全ですか?*短い答え、いいえ、すべてのカメラがフラッシュを持っているわけではありません、いくつかのAndroidバージョン、Lollipop、フラッシュが数秒後に残っているバグがあり、ハンドセットが再起動し、電池が消耗します。 OPによって書かれたコードは、すべてがそれを持っていると仮定しています。これは、フラッシュを持たないデバイスにインストールした場合、逆効果があります。 – t0mm13b

+0

@ t0mm13bロリポップが頭を上げてくれてありがとう。私のデバイス上では起こらないが、私は警告を追加します。私のアプリは、ライトとして画面を使用し、フラッシュはオプションです – tgkprog

+0

OP:クールな、いくつかのネクサス5/5xはロリポップでその問題を抱えていました。壁紙をバックライトとして使用することをお勧めします。ちょうどウォークロックを解除して、バッテリージュースが届いた場所を見て、アンドロイドユーザーを怒らせないようにしてください) – t0mm13b

答えて

2

Androidデバイスない「スキャン」のコードを、私はそれをチャックするつもりだった、そして、私ができる私のCamera2Impl上で実現 - コンパイラは行います。したがって、私はあなたのアイデアに何の問題も見ません。反対に - ストラテジーパターンを使用する方がコード全体でif-elseが良いです。これらの線に沿って

何か作業をする必要があります:

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) { 
    mFlashlightStrategy = new PostLollipopStrategy(); 
} else { 
    mFlashlightStrategy = new PreLollipopStrategy(); 
} 
+0

はい私は、コンパイラは、事前チェックを行うときにアンドロイドで例外をスローすることを意味します。私はそれがWebアプリケーションではないことを知っている、彼らがより厳格であるdevciesについて疑問に思っていた。とにかくちょうどこれを先に進んで – tgkprog

2

は、すべてのデバイスで、これは安全ですか?

フラッシュを使用できるかどうかをチェックするのはなぜですか?

context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH); 

フラッシュが利用できる場合はtrueを返し、利用できない場合はfalseを返します。真のブロックでさらにコードを書くことができます。

+0

はい、すでにそれをしている(私のカメラvarが更新されていない場合はnullが更新され、nullがあることを確認します)。同じアプリで古いコードと新しいコードが心配だった。 – tgkprog

+0

このチェックの前に、Camera/Flashの実行時アクセス権を取得する必要があります。そうしないと、バージョン6以降でnullポインタ例外が発生します。そのコードが問題ではない下位バージョンでは、正常に動作します。 – Mukesh

+0

はい、ありがとうございます – tgkprog

関連する問題