您的位置:首页 > 其它

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

2015-06-12 15:15 477 查看
控制手机闪关灯按照思路大概有下面三种方法

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

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

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

Flash OnFlash 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的方法解决问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: