여자친구와 쓸려고 오빠믿지? 같은 어플을 만들고 있습니다. ㅎㅎ(단둘이 쓸꺼니 법적인 얘긴 안하셔도..;;ㅎㅎ)
근데 위치정보를 구하면서 provider 를 gps와 network 를 동시에 이용해서 하는데
gps는 실외에선 문제없이 잘잡는데
개발을 당연히~ 실내에서하다보니 network 가 우선적으로 잡히는데 주소가 경주로 잡힙니다..
위치정보 구할때 network 가 wifi AP 정보가지고 구한다고 알고있는데
제가 지금은 진주에 있고 학교가 경주라 얼마전까진 계속 경주에 있었습니다.
인터넷 ip는 당연히 진주쪽을 가르치고있고 무선공유기는 경주에서 쓰던거 그대로 가져온거구요.
혹시나 위치정보가 예전에 마지막 위치를 가르치나 싶어서 밖에 나가서 위치잡아서 진주로 위치잡히는걸 확인했는데
다시 집으로 들어와서 잡아보면 경주로 바뀌네요..
어찌 해야할지 모르겠네요 ㅠㅠ
제가 쓰는 소스 전문을 올려 볼께요..(코드하이라이트가 이상하게 나와서 그냥 올릴께요;;)
package kr.netcrew.italk.activity;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import kr.netcrew.italk.R;
import kr.netcrew.italk.iTalk;
import kr.netcrew.italk.json.LocationJSON;
import kr.netcrew.mobileapp.bean.italk.LocationBean;
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.os.Handler;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class LocationSendActivity extends Activity implements OnClickListener, LocationListener {
private static final String TAG = iTalk.makeLogTag(SettingActivity.class);
//private DBHelper db = new DBHelper(LocationSendActivity.this);
//private final String userId = italk.getUserId();
private Handler mHandler = new Handler();
private LocationManager lm;
String providerHigh;
String providerLow;
int lmCount1 = 0;
int lmCount2 = 0;
/**
* 레이아웃용
*/
Button btnLocationLookup;
TextView txtLocationView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.locationsend);
/**
* 레이아웃
*/
btnLocationLookup = (Button) findViewById(R.id.locationsend_btn_lookup);
txtLocationView = (TextView) findViewById(R.id.locationsend_txt_locationview);
btnLocationLookup.setOnClickListener(this);
/**
* 실내랑 실외를 동시 지원하기 위해 Provider 를 network와 gps 둘다 사용한다.
*/
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@Override
public void onClick(View arg0) {
Log.d(TAG, "onClick Method : " + arg0.getId());
iTalk italk = (iTalk) getApplication();;
switch(arg0.getId()){
case R.id.locationsend_btn_lookup:
// 인증된 계정이 없으면 해당 버튼이 동작되지 않음
if(italk.getUserId() == null){
Toast.makeText(this, "계정이 인증되지 않았습니다.", Toast.LENGTH_LONG).show();
break;
}
Criteria criteriaGps = new Criteria();
criteriaGps.setAccuracy(Criteria.ACCURACY_FINE);
criteriaGps.setPowerRequirement(Criteria.POWER_HIGH);
criteriaGps.setAltitudeRequired(true);
criteriaGps.setBearingRequired(false);
criteriaGps.setSpeedRequired(true);
criteriaGps.setCostAllowed(true);
Criteria criteriaNetwork = new Criteria();
criteriaNetwork.setAccuracy(Criteria.ACCURACY_COARSE);
criteriaNetwork.setPowerRequirement(Criteria.POWER_LOW);
criteriaNetwork.setAltitudeRequired(false);
criteriaNetwork.setBearingRequired(false);
criteriaNetwork.setSpeedRequired(false);
criteriaNetwork.setCostAllowed(true);
providerHigh = lm.getBestProvider(criteriaGps, true);
providerLow = lm.getBestProvider(criteriaNetwork, true);
lm.requestLocationUpdates(providerHigh, 0, 0, this);
lm.requestLocationUpdates(providerLow, 0, 0, this);
Log.d(TAG, "ProviderHigh : " + providerHigh);
Log.d(TAG, "ProviderLow : " + providerLow);
btnLocationLookup.setText("조회중..");
btnLocationLookup.setEnabled(false);
break;
}
}
@Override
public void onLocationChanged(final Location location) {
Log.d(TAG, "GPS Best Provider : " + location.getProvider());
Log.d(TAG, "Location : " + location.getLatitude() + ", " + location.getLongitude());
Log.d(TAG, "Accuracy : " + location.getAccuracy());
mHandler.post(new Runnable() {
@Override
public void run() {
String viewStr;
Geocoder geoCoder = new Geocoder(LocationSendActivity.this, Locale.KOREAN);
viewStr = new StringBuilder()
.append("<b>위도</b> : ").append(location.getLatitude()).append(" <b>경도</b> : ").append(location.getLongitude())
.append("<br />")
.append("<b>Provider</b> : ").append(location.getProvider())
.append(" <b>Altitute</b> : ").append(location.getAltitude())
.append("<br />")
.append("<b>Speed</b> : ").append(location.getSpeed())
.append("m/s <b>Accuracy</b> : ").append(location.getAccuracy())
.append("m<br />")
.append("<b>업데이트 시간</b> : ").append(new Date().toLocaleString())
.append("<br /><br /><b>주소 목록</b><br />")
.toString();
try {
List<Address> addresses = geoCoder.getFromLocation(location.getLatitude(), location.getLongitude(), 10);
for(int i = 1; i <= addresses.size(); i++){
Address addr = addresses.get(i-1);
for(int j = 0; j <= addr.getMaxAddressLineIndex(); j++){
viewStr = new StringBuilder(viewStr)
.append(addr.getAddressLine(j))
.append(" ")
.toString();
Log.d(TAG, addr.getAddressLine(j));
}
viewStr = new StringBuilder(viewStr).append("<br />\n")
.toString();
}
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(LocationSendActivity.this, "주소 가져 오기 실패", Toast.LENGTH_LONG).show();
}
/**
* GPS는 7회/ network는 2회 조회후 업데이트 종료
*/
if(location.getProvider().equals("gps")){
lmCount1++;
if(lmCount1 >= 7) stopLocationLookup(location, "gps");
} else {
lmCount2++;
if(lmCount2 >= 2) stopLocationLookup(location, "network");
}
viewStr = new StringBuilder(viewStr)
.append("<br />\n")
.append("Provider GPS : ").append(lmCount1)
.append(" / Provider Network : ").append(lmCount2)
.toString();
txtLocationView.setText(Html.fromHtml(viewStr));
}
});
}
/**
* 현재 위치 조회가 끝난후 실행될 메소드
*/
private void stopLocationLookup(final Location location, final String locationType) {
//lm.removeGpsStatusListener(this);
lm.removeUpdates(this);
btnLocationLookup.setText("서버로 전송중");
iTalk italk = (iTalk) getApplication();;
LocationBean bean = new LocationBean();
bean.setAccuracy(location.getAccuracy());
bean.setAltitude(location.getAltitude());
bean.setLatitude(location.getLatitude());
bean.setLongitude(location.getLongitude());
bean.setLocationType(locationType);
bean.setProvider(location.getProvider());
bean.setSpeed(location.getSpeed());
bean.setUserId(italk.getUserId());
LocationJSON json = new LocationJSON();
try {
json.procLocationSend(bean);
} catch (Exception e) {
Log.d(TAG, "Exception 발생");
Log.d(TAG, e.getLocalizedMessage());
Log.d(TAG, e.getMessage());
Log.d(TAG, e.getCause().toString());
if(e.getMessage().equals("Connection timed out")){
// 서버 연결이 실패 했을 때 나오는 에러
Toast.makeText(this, "서버와 연결에 실패 하여 위치 정보 전송에 실패 하였습니다.", Toast.LENGTH_LONG).show();
}
e.printStackTrace();
}
btnLocationLookup.setText("조회");
btnLocationLookup.setEnabled(true);
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
}