안녕하세요.
추운날씨에 감기 조심하십시요. ^-^)
아래에 질문글을 올렸는데, 아무런 답변이 없어서 이렇게 다시 갱신하게 되었습니다.
혼자서 해결해볼려고 열심히 코드를 봤는데도, 제 지식의 짧음으로 인해 해결 방법이 생각이 안나네요.
질문 사항은 아래와 같이 정리해 봤습니다.
1. 현재 위치 주소만 가져오는거기때문에 com.google.android.maps을 사용하지 않습니다. 따라서 goole map과 관련된 api 설정도 안했으며, 물론 api key도 입력하지 않았습니다. 맞는거겠죠?
2. Code2에서 Service로 상속받고 Code1에서 startService을 할 경우 Log.d("MyTag", "MyLocation Invoked");의 내용조차 실행되지 않습니다. 왜 그런걸까요? 제가 작성한 코드에 문제가 있는 건가요? 아니면 제가 중요한 무엇인가를 빠뜨린 걸까요?
남는 시간 틈틈이 개발을 하고 있는데, 이부분때문에 하루 이상을 소비하고 있습니다.
구글링을해봐도 맞는 답을 찾기 힘드네요.
알려주시면 정말 감사하겠습니다. ^^)
[Code1]
Button stopService;
...
stopService = (Button)findViewById(R.id.btn_test2);
...
stopService.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// 위치정보를 호출합니다.
Intent intent = new Intent(BeSafeActivity.this,MyLocation.class);
startService(intent);
}
});
...
[Code2]
package com.android.besafe;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.app.Activity;
import android.content.Context;
import android.location.Address;
import android.location.Criteria;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
public class MyLocation extends Service implements LocationListener{
String provider;
LocationManager locationManager;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
Log.d("MyTag", "MyLocation Invoked");
String context=Context.LOCATION_SERVICE;
locationManager=(LocationManager)getSystemService(context);
Location location = locationManager.getLastKnownLocation(bestProvider());
locationManager.requestLocationUpdates(bestProvider(),1000,0, this);
updateLocation(location);
Log.d("MyTag", "context: "+context);
}
public String bestProvider(){
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setSpeedRequired(true);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
provider = locationManager.getBestProvider(criteria, true);
Log.d("MyTag", "bestProvider() Invoked");
return provider;
}
public void updateLocation(Location location) {
Log.d("MyTag","location: "+location);
if(location!=null){
double latitude = location.getLatitude();
double longitude = location.getLongitude();
List<Address> addresses = null;
Geocoder gc = new Geocoder(this, Locale.getDefault());
try{
addresses = gc.getFromLocation(latitude, longitude, 1);
String now_address = addresses.get(0).getAddressLine(0);
Log.d("MyTag","현재위치: "+now_address);
}catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
}
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
@Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } }
네 필요한 permission은 다 설정해놔서 permission 관련 에러는 발생하지 않습니다.
제가 서비스 등록을 Manifest 파일에 등제하지 않아서, 아래와 같이 등재하고 실행해봤는데 역시 어떠한 로그도 기록되지 않습니다.
<service android:name="MyLocation" android:enabled="true">
</service>
혹시나 서비스 등록에 필요한 intent-filter 항목을 제가 빠드려서 그런걸까요??
로컬의 서비스를 실행할꺼니 intent-filter항목은 상관없을듯 한데;
안되는 이유를 모르겟네요 ㄷㄷ;;;
이래 저래 찾아봐도 startService(intent)를 하기위해서는
Service를 상속받은 클래스를 만들고
메니페스트파일에 선언하면 된다고만 나오네요 ㄷ;
아 그런가요? 신경써주셔서 감사합니다. 엡뽀님.. 아예 동작하지 않는것을 보니 제가 무엇인가를 빠뜨린것 같은데, 그게 무엇인지 정확히 모르겠습니다;;




1. 네 상관없습니다.
2.AndroidManifest.xml 파일에
<service android:name="xxx.xxx.xxx.MyLocation " />등록하신거죠???;
이거 말고는 onCreate() 함수 호출이 안되는 이유는 딱히 모르겟네요 ㅜㅜ;;
혹시나 싶어서 추가적으로 말씀드리는건데요
위치정보를 알기 위해서는 권한도 필요합니다~
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
그리고 지속적으로 위치정보를 갱신하기위해서 LocationListener를 구현하셧는데
서비스는 looper클래스가 포함되지 않아
locationManager.requestLocationUpdates(bestProvider(),1000,0, this); 를 하셔도
전혀 변화 따위는 감지 되지않습니다.
핸들러 생성한후에 핸들러에게 메세지를 보낸뒤 핸들러에서
locationManager.requestLocationUpdates(bestProvider(),1000,0, this); 실행을 하셔야 할겁니다.