私は小さな機能を持っています。ユーザーが私のアプリからスイッチをオフにするか、アプリが終了するまで、トーチをオンにして、オンにしておきます。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
*これはすべてのデバイスで安全ですか?*短い答え、いいえ、すべてのカメラがフラッシュを持っているわけではありません、いくつかのAndroidバージョン、Lollipop、フラッシュが数秒後に残っているバグがあり、ハンドセットが再起動し、電池が消耗します。 OPによって書かれたコードは、すべてがそれを持っていると仮定しています。これは、フラッシュを持たないデバイスにインストールした場合、逆効果があります。 – t0mm13b
@ t0mm13bロリポップが頭を上げてくれてありがとう。私のデバイス上では起こらないが、私は警告を追加します。私のアプリは、ライトとして画面を使用し、フラッシュはオプションです – tgkprog
OP:クールな、いくつかのネクサス5/5xはロリポップでその問題を抱えていました。壁紙をバックライトとして使用することをお勧めします。ちょうどウォークロックを解除して、バッテリージュースが届いた場所を見て、アンドロイドユーザーを怒らせないようにしてください) – t0mm13b