亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Android中使用相機手電筒

在Android中使用相機手電筒

largeQ 2019-12-20 10:58:45
我正在嘗試在小部件中使用相機的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" />我正在“ Galaxy Tab”上對此進行測試,因為手頭沒有任何其他Android設備:指示燈不亮。所以我現在有幾個問題:有什么方法可以在仿真器中測試led燈的行為嗎?我在這里做錯什么了嗎?根據這個問題,這同樣的問題交易,它的工作方式不同的Galaxy Tab的。怎么樣?最后,如果它的工作方式有所不同,我開始懷疑它只是Galaxy Tab還是其他設備也使用不同的方法。那時很難測試,對我來說似乎很奇怪。感謝您的見解!順便說一句,我快速測試了快速設置,這里多次提到。手電筒也無法進行快速設置。請注意,Galaxy Tab stil使用android 2.2。我看到2.2和2.3之間有一些變化。評論:我知道它必須以某種方式工作,因為我在市場上發現了與Galaxy Tab完美搭配的其他應用。注釋2:如果我設置了cam.setParameters(p); 并直接使用getFlashMode()詢問相機當前狀態,即可正確返回FLASH_MODE_TORCH。但是,如果釋放相機并重新打開它,它將返回FLASH_MODE_OFF。幾乎就像Camera對象確認了請求,但實際上并沒有將其傳遞給硬件!-康斯坦丁斯發表評論后,我刪除了cam.release();。部分。他是對的,如果您松開相機,設置將不會保留。如果再次使用cam.open(),則將關閉一個新實例。燈仍然無法在銀河選項卡上工作。因此,我想如果您試圖通過小部件來控制它,就很難保持點亮狀態。后臺服務完成后,相機對象會自動釋放,因此燈會再次關閉。我的問題仍然存在,尤其是為什么相機一開始就無法開機。
查看完整描述

3 回答

?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

每個設備都有點不同。三星特別喜歡使應用程序開發人員的工作變得復雜。


在“ Galaxy”選項卡上,您應該擅長:


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之后對其進行更改。


查看完整回答
反對 回復 2019-12-20
?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

設置參數后,請勿釋放相機。我開始預覽后發現閃光燈已激活(在手電筒模式下)。(適用于摩托羅拉Defy,2.1)

在嘗試激活支持的閃光模式之前,最好檢查一下它。

用android上的相機設置困擾是最黑暗的伏都教:許多設備的行為都不同,似乎沒有可靠的方法可以通過一段代碼將它們全部定位。最安全的選擇是始終在調用onResume()方法時正確設置相機。我還將考慮在onConfigChange()中執行相同的 操作,因為至少摩托羅拉屏幕鎖可以強制您的應用程序進入縱向模式,從而完全重新啟動它。

Ps我想當您關閉相機時,本機相機應用程序將關閉,然后以新的狀態重新創建。


查看完整回答
反對 回復 2019-12-20
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

我已通過以下方式完成此操作,該方法適用于許多手機:


 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" />


查看完整回答
反對 回復 2019-12-20
  • 3 回答
  • 0 關注
  • 674 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號