控制手机闪关灯按照思路大概有下面三种方法
1. 使用camera类控制闪光灯方法setFlashMode 进行操作
2. 通过JNI控制现有驱动节点(使用与三星手机,其他手机不确认)
3. 重新编写驱动代码,提供通用的控制节点,供上层应用调用实现
Flash On | Flash Off |
下面是“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;
}
}
源代码 请点击这里下载
重现路径是:第一次打开应用,操作正常,如果按back key退出,再进入,就会有FC,如果是在内存管理中直接删除,在进入,就没问题
通过上面分析 ,问题就非常明显了,没有完全退出导致了问题的发生,故又重写onDestroy的方法解决问题