마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

gps 소스 ioexception 값만 들어오네요

0 추천
public class MainActivity  extends Activity implements OnClickListener, Runnable {
 
 private Location loc;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState); 
     // TODO Auto-generated method stub
    
  LocationManager locManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
        
  Criteria reqment = new Criteria();
  //reqment.setAccuracy(Criteria.ACCURACY_FINE);
  reqment.setAccuracy(Criteria.NO_REQUIREMENT);
  reqment.setAltitudeRequired(false);
  reqment.setBearingRequired(false);
  reqment.setCostAllowed(true);
  reqment.setPowerRequirement(Criteria.POWER_LOW);
  
  String provider = locManager.getBestProvider(reqment, true);
  Toast.makeText(getApplicationContext(), "best provider :"+provider, Toast.LENGTH_SHORT).show();
  
  String results = LocationManager.GPS_PROVIDER+":"+ locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)+"\n"
    + LocationManager.NETWORK_PROVIDER+":"+ locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
  Toast.makeText(getApplicationContext(), results, Toast.LENGTH_SHORT).show();
  
  
  loc = locManager.getLastKnownLocation(provider);
  LocUpdate(loc);
  
  LocationListener locListener = new LocationListener() {
       
   @Override
   public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub
    Toast.makeText(getApplicationContext(), "location listener", Toast.LENGTH_SHORT).show();
    LocUpdate(location);
        
   }

@Override
   public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub
    LocUpdate(null);
   }@

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
    
   }
   
  };  
  locManager.requestLocationUpdates(provider, 0, 0, locListener);
 }
 
 private void LocUpdate(Location loc) {
  
  String str;
  String addrStr = null;
  
  if(loc != null){
   
   double lat = loc.getLatitude();
   double lng = loc.getLongitude();
   str = "(위도:"+lat+", 경도:"+lng+")";
   Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
   
   //List<Address> locations =  null;
   Geocoder geocoder = new Geocoder(this, Locale.getDefault());
   try {
    List<Address> addresses = geocoder.getFromLocation(lat, lng, 1); 
    
    
    //if(addresses != null && addresses.size() > 0 ) {
    if(addresses.size() > 0 ) {
     
     Address mAddress = addresses.get(0);
     StringBuilder strBlder = new StringBuilder();
     String buf;
     
     for(int i=0; (buf=mAddress.getAddressLine(i)) != null; i++) {
      strBlder.append(buf+"\n");
     }
     
     
     place = strBlder.toString();
     
     Toast.makeText(MainActivity.this, place, Toast.LENGTH_SHORT).show();
    }else{
     place = "??";
    }
   } catch (IOException e) {
    e.printStackTrace();
    place = "Unknown";
    Toast.makeText(MainActivity.this, place, Toast.LENGTH_SHORT).show();
    }
  }
 }
   

 

실폰에 실습결과

unknown만 출력됩니다. 왜 이럴까용?

 

bestprovider 는 network로 나오구요,,'

그럼 현재 와이파이가 되는 곳에 있으니까 geocoder를 이용해서 현재 주소값이 나와야는데

ioexception 만 발생하네요 ㅠ

 

앤드류이드 (6,190 포인트) 님이 2013년 7월 22일 질문
IOException이 어디서 발생하죠?
Android API에서 구글 서버에 접속하는 부분에서 발생하는 거면
서버 이상이거나 네트워크 불안정이겠죠.
그곳이 아니라면 자신이 코딩한 곳이 문제이니까 그 곳을 수정하면 될것 같네요.

2개의 답변

+1 추천

ioexception 발생시 해당 exception message가 어떤건가요?

저 같은 경우에는 실제 스마트폰에서 잘 동작하다가 "service not available"  exception이 종종 발생하였고

이는 최근 4.x대 ICS에서까지 발생하였습니다.

유일한 해결책은 폰을 리부팅하면 다시 정상적으로 동작하더군요.

하지만 문제될때마다 리부팅하라고는 할 수 없어서 exception발생시 다른 방법으로(http + json) 주소를 구하도록 했습니다.

참고: https://code.google.com/p/android/issues/detail?id=38009

대왕초보 (160 포인트) 님이 2013년 7월 22일 답변
0 추천
aucd29 (218,390 포인트) 님이 2013년 7월 22일 답변
위사이트는 저번에 링크해주셔서 봤는데요. 그 사이트는 역지오코딩이 없어서 곤란합니다.ㅠㅠ 지금 위경도까지는 잘 받아오는데 역지오코딩에서 ioexception이 발생하는거거든요 ㅠ
exception 나면 google 에서 데이터 요청하심 될 터인데요?
찾아보신건가요?

    private static final String FROM_GOOGLE =
            "http://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&sensor=false&language=en";

private void fromGoogle(Context context, GpsHelper gps) throws Exception {
        String uri = String.format(FROM_GOOGLE, gps.getLatitude(), gps.getLongitude());

        AndroidHttpClient http = AndroidHttpClient.newInstance("Android");
        JSONObject res = new JSONObject(http.execute(new HttpGet(uri), new BasicResponseHandler()));
        JSONArray results = (JSONArray) res.get("results");

        for (int i = 0; i < results.length(); i++) {
            JSONObject result = results.getJSONObject(i);
            if (result.has("address_components")) {
                JSONArray addressComponents = result.getJSONArray("address_components");

                for (int j = 0; j < addressComponents.length(); j++) {
                    JSONObject addressComponent = addressComponents.getJSONObject(j);

                    if (result.has("types")) {
                        JSONArray types = addressComponent.getJSONArray("types");
                        for (int k = 0; k < types.length(); k++) {
                            if ("locality".equals(types.getString(k)) && cityName == null) {
                                if (addressComponent.has("long_name")) {
                                    cityName = addressComponent.getString("long_name");
                                } else if (addressComponent.has("short_name")) {
                                    cityName = addressComponent.getString("short_name");
                                }
                            }

                            if ("sublocality".equals(types.getString(k))) {
                                if (addressComponent.has("long_name")) {
                                    cityName = addressComponent.getString("long_name");
                                } else if (addressComponent.has("short_name")) {
                                    cityName = addressComponent.getString("short_name");
                                }
                            }
                        }

                        sendMessage(0, cityName);
                    }
                }
            }
        }
    }
...