ウィジェットでカメラのLED懐中電灯を使用しようとしています。私はこのトピックに関するいくつかのスレッドを見つけました(つまり、 the one 後述)。今、私は以下を使用して光を制御しようとしています:
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.release();
AndroidManifest.xmlでさまざまな権限を試しましたが、現在私は以下を持っています:
<uses-permission Android:name="Android.permission.CAMERA" />
<uses-permission Android:name="Android.permission.FLASHLIGHT"/>
<uses-feature Android:name="Android.hardware.camera" />
<uses-feature Android:name="Android.hardware.camera.autofocus" />
<uses-feature Android:name="Android.hardware.camera.flash" />
他のAndroidデバイスが手元にないので、Galaxy Tabでこれをテストしています:ライトが点灯しません。そこで、いくつか質問があります。
洞察力をありがとう!
ちなみに、私は quick-settings ですばやくテストしました。懐中電灯はクイック設定でも機能しません。
Galaxy Tab stilはAndroid 2.2を使用していることに注意してください。2.2と2.3の間にはいくつかの変更がありました。
コメント:Galaxy Tabと完全に連携する他のアプリを市場で見つけたので、何らかの形で機能しなければならないことを知っています。
コメント2:cam.setParameters(p)を設定した場合; getFlashMode()でカメラに現在の状態を直接問い合わせると、FLASH_MODE_TORCHが正しく返されます。ただし、カメラを離して再度開くと、FLASH_MODE_OFFが返されます。 Cameraオブジェクトがリクエストを認識しているように見えますが、実際にはハードウェアに渡されません!?
-
Konstantinsのコメントの後、cam.release()を削除しました。部。彼の言うとおり、カメラを放しても設定は保持されません。 cam.open()を再度使用すると、ライトがオフの状態で新しいインスタンスが取得されます。ただし、ギャラクシータブではまだライトが機能していません。そのため、ウィジェットを使用してコントロールしようとする場合、点灯を維持するのは難しいと思います。バックグラウンドサービスが終了すると、カメラオブジェクトは自動的に解放されるため、ライトは再びオフになります。私の質問はまだ残っています。特に、そもそもカメラがオンにならない理由です。
すべてのデバイスは少し異なります。サムスンは、特にアプリ開発者にとって物事を複雑にするのが好きです。
Galaxy Tabで次のことができるはずです:
Camera cam;
void ledon() {
cam = Camera.open();
Parameters params = cam.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_ON);
cam.setParameters(params);
cam.startPreview();
cam.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
}
});
}
void ledoff() {
cam.stopPreview();
cam.release();
}
それがうまくいかない場合は、最初にFLASH_MODE_OFFを設定し、startPreviewの後にそれを変更することの問題かもしれません。
パラメータを設定した後、カメラを離さないでください。プレビューを開始した後、フラッシュがアクティブになっていることがわかりました(トーチモード)。 (Motorola defy、2.1に適用)
有効にする前に、サポートされているフラッシュモードを確認することもお勧めします。
Androidは最も暗いブードゥー教です:多くのデバイスは異なる動作をし、1つのコードですべてをターゲットにする信頼できる方法はないようです。最も安全な方法は、常に設定することですonResume()メソッドが呼び出されたときに適切にカメラ。onConfigChange()でも同じことを検討します。少なくともMotorolaスクリーンロッカーはアプリケーションをポートレートモードに強制できるからです。 、完全に再起動します。
追伸カメラを閉じると、ネイティブカメラアプリが閉じられ、新しい状態で再作成されると思います。
私はそれを次の方法で行いました。これは多くの電話で動作します:
String manuName = Android.os.Build.MANUFACTURER.toLowerCase();
Camera mCamera;
以下のコードは、ライトをオフおよびオンにする方法を示しています。
private void processOnClick() {
if (manuName.contains("Motorola")) {
DroidLED led;
try {
led = new DroidLED();
led.enable(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
if (mCamera == null) {
try {
mCamera = Camera.open();
} catch (Exception e) {
e.printStackTrace();
}
}
if (mCamera != null) {
final Parameters params = mCamera.getParameters();
List<String> flashModes = params.getSupportedFlashModes();
if (flashModes == null) {
return;
} else {
if (count == 0) {
params.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
mCamera.startPreview();
}
String flashMode = params.getFlashMode();
if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(params);
} else {
// Toast.makeText(this,
// "Flash mode (torch) not supported",Toast.LENGTH_LONG).show();
params.setFlashMode(Parameters.FLASH_MODE_ON);
mCamera.setParameters(params);
try {
mCamera.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
count = 1;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
if (mCamera == null) {
return;
}
}
private void processOffClick() {
if (manuName.contains("Motorola")) {
DroidLED led;
try {
led = new DroidLED();
led.enable(false);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
if (mCamera != null) {
count = 0;
mCamera.stopPreview();
}
}
}
以下はDroidLEDクラスです。
class DroidLED {
private Object svc = null;
private Method getFlashlightEnabled = null;
private Method setFlashlightEnabled = null;
@SuppressWarnings("unchecked")
public DroidLED() throws Exception {
try {
// call ServiceManager.getService("hardware") to get an IBinder for the service.
// this appears to be totally undocumented and not exposed in the SDK whatsoever.
Class sm = Class.forName("Android.os.ServiceManager");
Object hwBinder = sm.getMethod("getService", String.class).invoke(null, "hardware");
// get the hardware service stub. this seems to just get us one step closer to the proxy
Class hwsstub = Class.forName("Android.os.IHardwareService$Stub");
Method asInterface = hwsstub.getMethod("asInterface", Android.os.IBinder.class);
svc = asInterface.invoke(null, (IBinder) hwBinder);
// grab the class (Android.os.IHardwareService$Stub$Proxy) so we can reflect on its methods
Class proxy = svc.getClass();
// save methods
getFlashlightEnabled = proxy.getMethod("getFlashlightEnabled");
setFlashlightEnabled = proxy.getMethod("setFlashlightEnabled", boolean.class);
}
catch(Exception e) {
throw new Exception("LED could not be initialized");
}
}
public boolean isEnabled() {
try {
return getFlashlightEnabled.invoke(svc).equals(true);
}
catch(Exception e) {
return false;
}
}
public void enable(boolean tf) {
try {
setFlashlightEnabled.invoke(svc, tf);
}
catch(Exception e) {}
}
}
AndroidManifest.xmlで次の権限を設定する必要があります。
<uses-permission Android:name="Android.permission.CAMERA" />
<uses-permission Android:name="Android.permission.FLASHLIGHT"/>
<uses-feature Android:name="Android.hardware.camera" />
<uses-feature Android:name="Android.hardware.camera.autofocus" />
<uses-feature Android:name="Android.hardware.camera.flash" />
これは、HTC Desireで機能します...(2.2を使用)(もちろん、カメラと懐中電灯の許可が必要です):
Camera mycam = Camera.open();
Parameters p = mycam.getParameters();// = mycam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
mycam.setParameters(p); //time passes
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mycam.release();
サーフェスビューを追加することもできます。 Galaxy NexusのLED懐中電灯はどのAPIで制御可能ですか? に対する私の答えをご覧ください
このリンクを使用してください:
http://www.androidhive.info/2013/04/Android-developing-flashlight-application/
とても助かりました。
private Camera camera;
void openCam(){
camera = Camera.open();
if (camera != null) {
Camera.Parameters params = camera.getParameters();
camera.setParameters(params);
}
Camera.Parameters p = camera.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(p);
}
マニフェストで権限を設定:
<uses-permission
Android:name="Android.permission.FLASHLIGHT"
Android:permissionGroup="Android.permission-group.HARDWARE_CONTROLS"
Android:protectionLevel="normal" />
<uses-feature Android:name="Android.hardware.camera" />
<uses-feature Android:name="Android.hardware.camera.flash" />