요즘 핸드폰에 다 있는 액정밝기 자동조절 기능을 하는 앱을 만들어보고 있습니다.
폰에 달린 조도센서를 이용해서 액정밝기를 조절하려고 하는데요
메인 Activity 에서는 자동으로 조절이 되는데 백그라운드로 넘기질 못하겠네요..
Test2Activity.java
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(Test2Activity.this, Test2Service.class);//상태바 내려서 클릭했을 때 이동할 화면
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
switch(arg0.getId())
{
case R.id.button1:
int SysBackLightValue = (int)(BackLightValue * 255);
System.putInt(cResolver, System.SCREEN_BRIGHTNESS, SysBackLightValue);
break;
case R.id.button2:
Notification noti = new Notification(R.drawable.status_image,
"자동밝기조절", java.lang.System.currentTimeMillis()); //상단 상태바의 그림과 문자열 지정
startService(intent);
mSensorManager.unregisterListener(this);
PendingIntent content = PendingIntent.getActivity(Test2Activity.this, 0, intent, 0);//상태바 내려서 클릭하면 어플화면으로 이동
noti.setLatestEventInfo(getApplicationContext(), "자동밝기조절", " ", content);//상태바를 내렸을 때 문자열들과 클릭했을때 뜨는 화면 설정
mNotiManager.notify(NAPNOTI, noti);
break;
case R.id.button3:
stopService(intent);//인텐트 종료
mNotiManager.cancel(NAPNOTI);
break;
}
}
button2를 눌렀을 때 인텐트를 이용하여 서비스를 불러옵니다.
Test2Service.java
public class Test2Service extends Service implements SensorEventListener {
boolean able;
SensorManager mSensorManager;
Sensor mLight;
ContentResolver cResolver;
WindowManager.LayoutParams layoutParams;
BackLight runnable;
Thread thread; public void onCreate() {
super.onCreate();
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
runnable = new BackLight(this, mHandler);
thread = new Thread(runnable);
}//stopService 실행시 실행
public void onDestroy() {
super.onDestroy();
able=false;
if (mSensorManager != null)
mSensorManager.unregisterListener(this);
}
//startService실행시 실행
public int onStartCommand (Intent intent, int flags, int startId) {
able=true;
super.onStartCommand(intent, flags, startId);
if (mLight != null)
mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); // 레지스터 생성
thread.setDaemon(true);
thread.start();
return START_STICKY;
}class BackLight extends Activity implements Runnable
{
Test2Service mParent;
Handler mHandler;
String name;
float brightness;
public BackLight(Test2Service parent, Handler handler)
{
mParent = parent;
mHandler = handler;
try{
Toast.makeText(Test2Service.this, mLight.getName(), 0).show();
cResolver = getContentResolver();
layoutParams = getWindow().getAttributes();
}
catch(Exception e )
{
Toast.makeText(Test2Service.this, "BackLight Constructor Exception", 0).show();
}
}
public void run()
{
while(able){
mHandler.sendEmptyMessage(0);
try { Thread.sleep(5000);} catch (Exception e) { ; }
}
}
public void setBrightness(BackLight runnable)
{
try{
layoutParams.screenBrightness = runnable.brightness; //속성 변수의 멤버인 밝기값을 지정
getWindow().setAttributes(layoutParams); //어플 창에 속성변수 적용
System.putInt(cResolver, System.SCREEN_BRIGHTNESS, (int)(255*runnable.brightness));
}
catch(Exception e){
Toast.makeText(Test2Service.this,"setBrightness Method Exception", 0).show();
}
}
}Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 0) {
runnable.setBrightness(runnable); }
}
};
지저분한 소스코드 길게 올려서 죄송합니다;;;;
Test2Service.java에 BackLight라는 클래스를 하나 더 만들었는데, 액정 밝기를 설정하려면 getWindow() 함수가 필요해서 Activity 클래스를 상속받았고 스레드로 돌려야 할것 같아서 Runnable 인터페이스를 implements 했습니다.
그런데 try-catch 구문 2 부분에서 자꾸 NullPointerException이 나네요....
try-catch 안썻을땐 버튼 누르면 작동이 중지되었다는 메세지창 뜨면서 뻗어버립니다.
layoutParam 과 cResolver 지정에서 문제가 생기는 듯 한데 어떻게 조치해야될지 모르겠습니다.
혼자서 이것저것 찾아보다가 도저히 안되겠에서 부탁드립니다.... 폰에 기본적으로 있는 기능들조차 구현 못하고 있으니 속상하네요...



