53

ウィジェットでカメラのLED懐中電灯を使おうとしています。このトピックに関するいくつかのスレッド(つまり後で説明するスレッド)を見つけました。現在、次を使用してライトを制御しようとしています。

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デバイスが手元にないため、GalaxyTabでこれをテストしています。ライトが点灯しません。だから私は今いくつか質問があります:

  1. エミュレーターでLEDライトの動作をテストする方法はありますか?
  2. 私はここで何か間違ったことをしていますか?
  3. 同じ問題を扱っているこの質問によると、GalaxyTabでは動作が異なります。どのように?
  4. そして最後に、それが異なって機能する場合、それが単なるGalaxy Tabなのか、それとも他のデバイスも異なる方法を使用しているのか疑問に思い始めています。その時テストするのは難しいでしょう、そしてそれは私にはかなり奇妙に思えます。

洞察をありがとう!

ちなみに、ここで何度か言及されているクイック設定ですばやくテストしました。懐中電灯はクイック設定でも機能しません。

GalaxyTabstilはandroid2.2を使用していることに注意してください。2.2と2.3の間にいくつかの変更があったようです。

コメント:Galaxy Tabで完全に機能する他のアプリを市場で見つけたので、何らかの形で機能する必要があることを私は知っています。

コメント2:cam.setParameters(p);を設定した場合 getFlashMode()を使用してカメラに現在の状態を直接要求すると、FLASH_MODE_TORCHが正しく返されます。ただし、カメラを離して再度開くと、FLASH_MODE_OFFが返されます。Cameraオブジェクトがリクエストを認識しているように見えますが、実際にはハードウェアに渡されません!?

-

Konstantinsのコメントの後、cam.release();を削除しました。部。彼は正しいです。カメラを離しても設定は保持されません。cam.open()を再度使用すると、ライトがオフの状態で新しいインスタンスが取得されます。ただし、ライトはまだギャラクシータブで機能していません。ですから、ウィジェットを使ってコントロールしようとすると、ライトを点灯し続けるのは難しいと思います。バックグラウンドサービスが終了するとすぐに、カメラオブジェクトが自動的に解放されるため、ライトが再びオフになります。私の質問はまだ残っています、特になぜカメラがそもそもスイッチを入れないのか。

4

7 に答える 7

34

すべてのデバイスは少し異なります。Samsung は特に、アプリ開発者にとって物事を複雑にするのが好きです。

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 の後に変更することが問題になる可能性があります。

于 2011-04-07T17:33:25.470 に答える
18

パラメータを設定した後は、カメラを離さないでください。プレビューを開始した後、フラッシュが(トーチモードで)アクティブになっていることがわかりました。(Motorola Defy、2.1に適用されます)

また、アクティブ化する前に、サポートされているフラッシュモードを確認することをお勧めします。

Androidのカメラ設定をいじくり回すのは、最も暗いブードゥーです。多くのデバイスは動作が異なり、1つのコードですべてをターゲットにする信頼できる方法はないようです。最も安全な方法は、 onResume()メソッドが呼び出されたときに常にカメラを適切に設定することです。少なくともMotorolaスクリーンロッカーはアプリケーションを強制的にポートレートモードにして完全に再起動できるため、onConfigChange()でも同じことを検討し ます。

追伸カメラを閉じると、ネイティブカメラアプリが閉じて、新しい状態で再作成されると思います。

于 2011-04-04T12:31:03.903 に答える
11

私は次の方法でそれを行いました。これは多くの電話で機能します。

 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" />
于 2012-09-21T18:03:28.813 に答える
8

これは、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();
于 2011-04-05T14:05:48.330 に答える
4

サーフェス ビューを追加することもできます。どの API で制御可能な Galaxy Nexus の LED 懐中電灯に対する私の回答をご覧ください。

于 2012-03-02T09:30:07.420 に答える
1
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" />
于 2012-03-29T04:17:19.713 に答える