«

简单的手电筒程序(基于Camera类实现)

时间:2024-3-2 18:20     作者:韩俊     分类: Android


控制手机闪关灯按照思路大概有下面三种方法

1. 使用camera类控制闪光灯方法setFlashMode 进行操作

2. 通过JNI控制现有驱动节点(使用与三星手机,其他手机不确认)

3. 重新编写驱动代码,提供通用的控制节点,供上层应用调用实现

Flash On Flash Off 上图为效果图(后来才发现原来灯泡和手电筒是不一样的东西,囧), 使用ToggleButton类型button显得生动一点。

下面是“Read The Fucking Source Code”

package com.saberhao.bulb;

import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.ToggleButton;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class BulbSwitch extends Activity {

    ToggleButton tb;
    private Camera mCameraDevices;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bulb_switch);
        if(mCameraDevices == null)  
            //获取camera实例
            mCameraDevices = Camera.open();
        mCameraDevices.startPreview();
        tb = (ToggleButton)findViewById(R.id.BulbButton);
        tb.setOnCheckedChangeListener
        (
                //listen to the button
               new OnCheckedChangeListener()
               {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
                    {
                        setBulbState(isChecked);
                    }
               }
          ); 
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mCameraDevices == null) 
            return; 
        // release the camera class
        mCameraDevices.stopPreview();
        mCameraDevices.release(); 
        mCameraDevices = null;  
    }

    protected void setBulbState(boolean isChecked) {
        // TODO Auto-generated method stub  
        ImageView iv=(ImageView)findViewById(R.id.ImageView);
        iv.setImageResource((isChecked)?R.drawable.bulb_on:R.drawable.bulb_off);
        Parameters mParameters = mCameraDevices.getParameters();
        if(isChecked)
            // flash on
            mParameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
        else
            // flash off
            mParameters.setFlashMode(Parameters.FLASH_MODE_OFF);
        mCameraDevices.setParameters(mParameters);
        ToggleButton tb=(ToggleButton)findViewById(R.id.BulbButton);        
        tb.setChecked(isChecked);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.bulb_switch, menu);
        return true;
    }
}

源代码 请点击这里下载


代码逻辑很简单,就是通过调用camera的方法setFlashMode来进行开关flash,但是过程中发现有 FC, log如下



重现路径是:第一次打开应用,操作正常,如果按back key退出,再进入,就会有FC,如果是在内存管理中直接删除,在进入,就没问题

通过上面分析 ,问题就非常明显了,没有完全退出导致了问题的发生,故又重写onDestroy的方法解决问题

标签: android

热门推荐