안녕하세요.
앱위젯(밧데리)을 만들고 있는데요.GPS 의 상태를 체크해서 현재 GPS 가 on/off 되어 있는 상태로 이미지를 바꾸는 작업을 하려고 합니다. ^^
밧데리 상태와 wifi , 상태는 알수 있었습니다만 GPS 상태는 따로 알기가 힘들더라구요.
일단 이렇게 해보았습니다.
여러가지 상태를 알기위해서 broadcast 로 현재 ACTION 을 가지고와서 intentfileter 로 등록된 액션이
맞을때만 업데이트 하거나 해당 이미지를 변경시키도록 하였습니다.
wifi 와 밧데리는 해당 action 이 미리 정의되어 있어서 금방 했습니다 ^^.
그런데 gps 는 구글링 해보니 리스너로 따로 등록해서 하는 방법이 있는것 같아서 해보니 boradcast 의 서비스와 충돌이 나는지 체크 잘 안되었습니다.
다른 어플들을 보니 gps 가 on / off 가 되어도 상태를 바로 적용 못하는것 보니 브로드캐스트로 서비스에서 잡아내긴 어려운것으로 생각이 되어 집니다만.... ^^
혹시 앱위젯에서 gps 의 현재 상태(on/off)를 알수 있는 방법이 있을까요? 알려주시면 감사드리겠습니다.
libre2k 님 답변 감사드립니다. ^^;
그런데 제가 아직 broadcast 를 잘 이해하지 못해서 그런지 아직 구현을 못하고 있습니다. T_T
전 이렇게 해볼려구 합니다.
1.앱위젯에서 브로드캐스트 리시버를 만든다.
2.브로드캐스트에 리시버에서는 현재 폰에서의 wifi상태와 bluetooth상태,밧데리 상의 변경여부를 감지하여 바탕화면의 위젯의 이미지를 상태에 맞게 바꾸어 준다.
3.wifi 와 밧데리는 상태를 알수 있는 action 덕분에 intentfileter 로 등록하여 브로드 캐스트 리시버가 해당 기기(?)의 상태를 잡아올수 있다.
따라서 다른 설정이나 다른 앱에서 해당 기기의 정보르 변경하면 브로드 캐스트 리시버에서 잡아와서 우리앱에서도 해당하는 작업을 할수 있다.
4.그런데 gps 상태를 나타내는 action 이 따로 없어서, 브로드 캐스트 리시버에서 무엇을 받아올지 모른다.
5.그렇다고 time_tick 등을 써서 정기적으로 체크하면 밧데리 소모가 불필요하게 생길수 있다.
6.결국 gps 의 상태를 브로드 캐스트 리시버가 받아올수 있다면 해결될것같다.
^^ .제가 아직 브로드 캐스트 리시버와 앱위젯에 대해 감이 잘 안잡혀서요..
구글링을 해봐도 딱 이거다 하는 튜토리얼을 못 찾았습니다.
감사드립니다. ^^
^^ ..답해주시는 분이 없으셔서 T_T... 질문이 좀 이상했나 봅니다. ^^
서비스 부분에서 ( Service) ^^ 다음과 같이 추가 했습니다.
private LocationListener gpslistener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) { Log.e("----------------------------","Change");}
@Override
public void onProviderEnabled(String provider) { Log.e("----------------------------","GPS ON");}
@Override
public void onProviderDisabled(String provider) {Log.e("----------------------------","GPS OOFF");}
@Override
public void onLocationChanged(Location location) {
//stopSelf();
Log.e("----------------------------","Location");
}
};
그리고
public void onStart(Intent intent, int startId) { ...에서
waitForGPSCoordinates(); //GPS 관련
을 추가로 하였습니다. ^^.
그랬더니 GPS 설정화먄(폰마다 똑같은) 에서
무선네트워크 사용 : 무선네트워크를 사용하는 응용프로그램(예:지도) 에서 위치보기 [체크박스]
를 키고 끝때만 GPS 가 살아 있다거나 죽었다고 나타나네요....
다른 위젯어플은 "GPS 위성사용" 까지 해야 켜지던데요...ㅋ
궁금한것은 앱위젯에서 브로드캐스트로 밧데리,와이파이상태등을 계속 리시버하는데, gps 리스너가 같이 돌아가면 cpu나 메모리 사용량이 많아 지나요?
아직은 최적화 보다는 구현쪽에 신경쓰는 초보라..^^
아시는 분 답변 부탁드리겠습니다. 감사드립니다.
^^..위젯을 다시 설치하니 위성만 켜도 되는 거였네요.
앱위젯에서 GPS 간단 체크 하는 방법을 다음 처럼 했습니다. ^^
public static final class UpdateService extends Service {
......
......
//--GPS 관련
private LocationListener gpslistener = new LocationListener() {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) { Log.e("----------------------------","Change");}
@Override
public void onProviderEnabled(String provider) { Log.e("----------------------------","GPS ON");
}
@Override
public void onProviderDisabled(String provider) {Log.e("----------------------------","GPS OOFF");}
@Override
public void onLocationChanged(Location location) {
//stopSelf();
Log.e("----------------------------","Location");
}
};
private void waitForGPSCoordinates() {
startListening();
}
private void startListening(){
final Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_COARSE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
final String bestProvider = manager.getBestProvider(criteria, true);
if(bestProvider==null){
Log.e("//////////","GPS SPACE CHECK OOOOOOFF");
}else{
Log.e("))))))))))))","GPS PACE CHECK ON");
}
if (bestProvider != null && bestProvider.length() > 0) {
manager.requestLocationUpdates(bestProvider, 500, 10, gpslistener);
}else{
final List<String> providers = manager.getProviders(true);
for (final String provider : providers) {
manager.requestLocationUpdates(provider, 500, 10, gpslistener);
}
}
}
private void stopListening(){
try {
if (manager != null && gpslistener != null) {
manager.removeUpdates(gpslistener);
}
manager = null;
}
catch (final Exception ex) {
}
}
//--GPS 관련 끝
@Override
public void onDestroy() {
....
stopListening(); //GPS관련 --어플 종료시 리스너를 해제 해야 좋겠죠~~ ^^
}
@Override
public void onStart(Intent intent, int startId) {
.......
waitForGPSCoordinates(); //GPS 관련 .--서비스에서 GPS 리스너를 시작한다는 겁니다
}
제가 한 방법입니다. 초보라 되게많이 어색한 소스 입니다. 조언좀 부탁드립니다. T_T
참 저렇게 service 에서 리스너도 등록하고 또 broadcast receiver 도 동작하는데 메모리나 밧데리에 부담을 주지는 않을까요?
어찌저찌 만들긴 하는데 태권브이 깡통로봇 같은 소스가 되어가서리....
어쩄든 저처럼 개념도 안잡힌 분들은 위에서 처럼 해보세용~~
^^




LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
상태는 가져올 수 있지만, 직접 위젯에서 상태를 토글시킬 수는 없습니다~