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

위치값 받는 프로젝트 진행 중인데요ㅠㅠ(위치관리자 문제)

0 추천
이번에 제가 하는 프로젝트는 위치값(위도,경도를 받아서)

소켓통신으로 값을 보내는 것입니다.

그런데 , 핸드폰 마다 구동이 다르게 됩니다.

갤럭시3, 갤럭시 노트1(아이스크림샌드위치 /4.01)에서 되던 아래의 소스가

갤럭시2(아이스크림샌드위치/4.01)에서 구동이 안됩니다.

위도 경도 값을 아예 못받아 오고 있는데 뭐가 잘못된 걸까요? ㅠㅠ

버전은 갤럭시노트1 과 갤럭시2가 같은데 갤럭시2 자체가 위치값을 못받아 오는 걸까요??

도움 부탁드립니당....ㅠㅠㅠ

package com.example.gps_map;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;

import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class GPS_Map extends FragmentActivity {

    private GoogleMap mmap;

    private LocationManager locationManager;
    private String provider;
 
    public double lat = 0.0;
    public double lng = 0.0;
    public double in1 = 0.0;
    public double in2 = 0.0;
    public int thread_flag=0;
   
   @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_gps__map);
  GooglePlayServicesUtil.isGooglePlayServicesAvailable(GPS_Map.this);
  
  startlocattionService();
  
  requestThread thread = new requestThread();
    
  thread.lat=lat;
  thread.lng=lng;
  
  thread.start();
  
  while(thread_flag==0);
  
  Log.d("value","Oncreate_in1:"+in1);
    
  initmap();
  
 
   }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.gps__map, menu);
  return true;
 }
 
 
   
    @Override
 public void onBackPressed() {
  this.finish();
 }

 

    private void startlocattionService() {
     

       
     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
     
        MyLocationListener listener = new MyLocationListener();
       
        long minTime = 100000000;
        float minDistance = 1000;
 
        // GPS를 이용한 위치 요청
        locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER,
                    minTime,
                    minDistance,
                    listener);
 
        // 네트워크를 이용한 위치 요청
        locationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER,
                minTime,
                minDistance,
                listener);
       
        try {
            Location lastLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (lastLocation != null) {
                 lat = lastLocation.getLatitude();
                 lng = lastLocation.getLongitude();
                        
 
              Toast.makeText(getApplicationContext(), "Last Known Location : " + "Latitude : "+ lat + "\nLongitude:"+ lng, Toast.LENGTH_LONG).show();
            }
        } catch(Exception ex) {
            ex.printStackTrace();
        }
       Toast.makeText(getApplicationContext(), "위치 확인이 시작되었습니다. 로그를 확인하세요.", Toast.LENGTH_SHORT).show();
 
    }

  public void initmap(){
   
   if(mmap==null){
    mmap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    
    if(mmap!=null){
     
     addmarker();
     
    }
   }

  }
  
  public void addmarker(){
   
  CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(-31.90,115.86));//-31.90,115.86
  CameraUpdate zoom = CameraUpdateFactory.zoomTo(16);
  MarkerOptions marker = new MarkerOptions()
       .position(new LatLng(-31.90,115.86))
      .title("I'm Here♥");

  mmap.moveCamera(center);
  mmap.animateCamera(zoom);
  mmap.addMarker(marker).showInfoWindow();
  }

 
   

 class MyLocationListener implements LocationListener{
  
 
  @Override
 public void onLocationChanged(Location location) {
 
      Log.d("myLog"  , "onLocationChanged: !!"  + "onLocationChanged!!");
  
//   startlocattionService();
//   
//   requestThread thread = new requestThread();
//     
//   thread.lat=lat;
//   thread.lng=lng;
//   
//   thread.start();
//   
//   while(thread_flag==0);
//   
//   Log.d("value","Oncreate_in1:"+in1);
//     
//   initmap();
   
   
   
   
  
  }
     
 
 @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
  
 }
 

}

class requestThread extends Thread{
 
 public double lat=0.0;
 public double lng=0.0;
 
 public void run(){
//  while(true){
//   try {
//    request();
//    Thread.sleep(100);
//   } catch (InterruptedException e) {
//    // TODO Auto-generated catch block
//    e.printStackTrace();
//   }
//  }
  

  request();
 }

 public void request(){
  

  try {
   Socket Socket = new Socket("175.252.148.13",5001);
   System.out.println("Client started");
   

   
   ObjectOutputStream outstream = new ObjectOutputStream(Socket.getOutputStream());
      
   
   outstream.writeDouble(lat);
   outstream.writeDouble(lng);
   
   outstream.flush();
   
   ObjectInputStream instream = new ObjectInputStream(Socket.getInputStream());
   
   in1 = instream.readDouble();
   in2 = instream.readDouble();

   Log.d("value","in1:"+in1);
   Log.d("value","in2:"+in2);
 
   thread_flag=1;
   
   Socket.close();

    
   
  } catch (IOException e) {
   
   e.printStackTrace();
  }
   

  
 
  }
 
  

 
 }
}
나묘 (140 포인트) 님이 2013년 11월 5일 질문
재부팅시켜보세요 그럼 아마 댈듯

1개의 답변

0 추천

글쎄요.. 음.. 제가 봤을때는 

지금 리스너에 GPS 랑 network 좌표를 둘다 가져 오라 했는데.. 

저게 onLocationChanged()가 GPS 랑 network 두가지 타입 모두 반영되어서 값을 뱉는건지 모르겠네요.. 

저는 둘다 비교 하려 했을때 매니저 2개를 각각 따로 굴렸습니다만.. 

여튼..

"현재 위 코드는 GPS 가 아닌 Network 으로만 위치 정보를 받고만 있다"

라는 가정 아래 말씀 드리겠습니다. 

혹시 갤럭시S2가 wifi 나 3g 가 연결이 되어 있는지요? 

제가 알기로 wifi 로는 주변에 공유기 갯수가 3개 이상 되어야 되고 

3g 는 가장 가까운 송신탑 위치를 받는걸로 아는데.. 

갤럭시 s3 나 노트에서 되던 코드가 갤럭시 s2 에서 안된다면 

1. wifi 가 연결되지 않았거나 주변에 공유기 갯수가 부족

2. 3g(lte또는  LTE-A)가 되지 않아 주변 송신 위치를 찾을수가 없다. 

로 예상이 되네요.. 삽질 답변이라면 안습.. 그리고 잠수.. 

익명사용자 님이 2013년 11월 6일 답변
...