2014-03-30 2 views
3

저는 GPS를 사용하는 사용자의 현재 위치를 얻고 자하는 프로젝트에서 일하고 있습니다. 많은 자습서를 읽고 코드를 작성하려고했습니다. 이 코드는 에뮬레이터에서 잘 작동합니다. DDMS를 사용하여 latittude와 경도를 보낼 때마다 에뮬레이터가이를 감지합니다. 주요 문제는 실제 장치에서 작동하지 않는다는 것입니다. 하지만, 내가 시도한 장치는 인터넷에 접속되어 있으며 GPS가 열려 있습니다. 매니페스트 파일에 필요한 권한을 추가했습니다.안드로이드에서 GPS를 사용하여 현재 위치를 얻으십시오.

public class MainActivity extends Activity { 

TextView lat; 
TextView lon; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    lat=(TextView)findViewById(R.id.textView2); 
    lon=(TextView)findViewById(R.id.textView4); 
    LocationManager lm=(LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    LocationListener ll=new myLocationListener(); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0, ll); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
    class myLocationListener implements LocationListener{ 

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 
    if(location!=null){ 
     double pLat=location.getLatitude(); 
     double pLong=location.getLongitude(); 
     lat.setText(Double.toString(pLat)); 
     lon.setText(Double.toString(pLong)); 
    } 
} 

@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 

} 

} 
} 

나는 도움이 필요 매니페스트 파일

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.INTERNET"/> 

의 권한하시기 바랍니다.

+0

당신은 간단한 위치 API이 라이브러리를 사용할 수 있습니다 : https://github.com/delight-im/Android-SimpleLocation – caw

+0

@Marco W github.com/delight-im/Android- SimplifiedLocation은 제대로 작동하지 않으며 항상 0.0 위도와 경도를 반환합니다. – TejaDroid

+0

@TejaDroid이 두 가지 지원 문제는 도움이 될 것입니다 : https://github.com/delight-im/Android-SimpleLocation/issues/3 및 https://github.com/delight-im/Android-SimpleLocation/issues/4 – caw

답변

5
GPSTracker gps = new GPSTracker(this); 
double latitude = gps.getLatitude(); 
double longitude = gps.getLongitude(); 

사용이 GPS 서비스 :

import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.provider.Settings; 
import android.util.Log; 

public class GPSTracker extends Service implements LocationListener { 

    private final Context mContext; 

    // flag for GPS status 
    boolean isGPSEnabled = false; 

    // flag for network status 
    boolean isNetworkEnabled = false; 

    // flag for GPS status 
    boolean canGetLocation = false; 

    Location location; // location 
    double latitude; // latitude 
    double longitude; // longitude 

    // The minimum distance to change Updates in meters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 

    // The minimum time between updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute 

    // Declaring a Location Manager 
    protected LocationManager locationManager; 

    public GPSTracker(Context context) { 
     this.mContext = context; 
     getLocation(); 
    } 

    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext 
        .getSystemService(LOCATION_SERVICE); 

      // getting GPS status 
      isGPSEnabled = locationManager 
        .isProviderEnabled(LocationManager.GPS_PROVIDER); 

      // getting network status 
      isNetworkEnabled = locationManager 
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 


      if (!isGPSEnabled && !isNetworkEnabled) { 
       // no network provider is enabled 
      } else { 
       this.canGetLocation = true; 
       if (isNetworkEnabled) { 
        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("Network", "Network"); 
        if (locationManager != null) { 
         location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
       // if GPS Enabled get lat/long using GPS Services 
       if (isGPSEnabled) { 
        if (location == null) { 
         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         Log.d("GPS Enabled", "GPS Enabled"); 
         if (locationManager != null) { 
          location = locationManager 
            .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
       } 
      } 

     } catch (Exception e) { 
     } 
     return location; 
    } 

    /** 
    * Stop using GPS listener Calling this function will stop using GPS in your 
    * app. 
    * */ 
    public void stopUsingGPS() { 
     if (locationManager != null) { 
      locationManager.removeUpdates(GPSTracker.this); 
     } 
    } 

    /** 
    * Function to get latitude 
    * */ 
    public double getLatitude() { 
     if (location != null) { 
      latitude = location.getLatitude(); 
     } 
     // return latitude 
     return latitude; 
    } 

    /** 
    * Function to get longitude 
    * */ 
    public double getLongitude() { 
     if (location != null) { 
      longitude = location.getLongitude(); 
     } 

     // return longitude 
     return longitude; 
    } 

    /** 
    * Function to check GPS/wifi enabled 
    * 
    * @return boolean 
    * */ 
    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 

    /** 
    * Function to show settings alert dialog On pressing Settings button will 
    * lauch Settings Options 
    * */ 
    public void showSettingsAlert() { 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

     // Setting DialogHelp Title 
     alertDialog.setTitle("GPS is settings"); 

     // Setting DialogHelp Message 
     alertDialog 
       .setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

     // On pressing Settings button 
     alertDialog.setPositiveButton("Settings", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         Intent intent = new Intent(
           Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
         mContext.startActivity(intent); 
        } 
       }); 

     // on pressing cancel button 
     alertDialog.setNegativeButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int which) { 
         dialog.cancel(); 
        } 
       }); 

     // Showing Alert Message 
     alertDialog.show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     float bestAccuracy = -1f; 
     if (location.getAccuracy() != 0.0f 
      && (location.getAccuracy() < bestAccuracy) || bestAccuracy == -1f) { 
       locationManager.removeUpdates(this); 
     } 
     bestAccuracy = location.getAccuracy(); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    public float getAccurecy() 
    { 
     return location.getAccuracy(); 
    } 

} 
+0

이 코드는 실제 기기에서 잘 작동합니다. –

+0

예 잘 작동합니다. –

+0

확인. 감사합니다 :) 나는 에뮬레이터에서 시험해 보았고 잘 작동합니다. 곧 실제 장치로 시험해 보겠습니다. 귀하의 빠른 응답을 주셔서 감사합니다 –

1

이렇게 시도하십시오. 현지화 작업은 GPS를 시작해야하며 시간이 걸린다는 것을 기억해야합니다. 이 클래스에서는 GPS 구성 요소가 시작될 시간이 있어야하므로 결과를 얻으려면 지연이있는 현지화 작업을 수행합니다.

public class MyBestLocation { 
    LocationListener locationListenerGps = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      locationResult.gotLocation(location); 
      lm.removeUpdates(this); 
      lm.removeUpdates(locationListenerNetwork); 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 
    }; 
    LocationListener locationListenerNetwork = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 
      locationResult.gotLocation(location); 
      lm.removeUpdates(this); 
      lm.removeUpdates(locationListenerGps); 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 
    }; 
    //delay in seconds 
    private int DELAY = 1; 
    private Timer timer1; 
    private LocationManager lm; 
    private LocationResult locationResult; 
    private boolean gps_enabled = false; 
    private boolean network_enabled = false; 
    private ScheduledExecutorService scheduler; 
    private ScheduledFuture scheduledFuture; 

    public boolean getLocation(Context context, LocationResult result) { 
     // 
     locationResult = result; 
     if (lm == null) 
      lm = (LocationManager) context 
        .getSystemService(Context.LOCATION_SERVICE); 

     // checking weather providers are aviliable 
     try { 
      gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER); 
     } catch (Exception ex) { 
     } 
     try { 
      network_enabled = lm 
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
     } catch (Exception ex) { 
     } 

     // 
     if (!gps_enabled && !network_enabled) 
      return false; 

     if (gps_enabled) 
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, 
        locationListenerGps); 
     if (network_enabled) 
      lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, 
        locationListenerNetwork); 
     //---------------------- 
     // async executor method upgrade 
     timer1 = new Timer(); 
     timer1.schedule(new GetLastLocation(), DELAY*2000); 
     // ---------------- 

     // 
     /* scheduler = Executors.newSingleThreadScheduledExecutor(); 
     scheduler.schedule(new GetLastLocation(), DELAY, TimeUnit.SECONDS);*/ 
     return true; 
    } 

    // Timer for the latest location 

    public static abstract class LocationResult { 
     public abstract void gotLocation(Location location); 
    } 

    /** 
    * 
    * 
    * @author rafik991 
    */ 
    class GetLastLocation extends TimerTask { 
     @Override 
     public void run() { 


      lm.removeUpdates(locationListenerGps); 
      lm.removeUpdates(locationListenerNetwork); 

      Location net_loc = null, gps_loc = null; 
      if (gps_enabled) 
       gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
      if (network_enabled) 
       net_loc = lm 
         .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 

      // if there are both values use the latest one 
      if (gps_loc != null && net_loc != null) { 
       if (gps_loc.getTime() > net_loc.getTime()) 
        locationResult.gotLocation(gps_loc); 
       else 
        locationResult.gotLocation(net_loc); 

       return; 
      } 

      if (gps_loc != null) { 
       locationResult.gotLocation(gps_loc); 

       return; 
      } 
      if (net_loc != null) { 
       locationResult.gotLocation(net_loc); 

       return; 
      } 
//   locationResult.gotLocation(null); 
     } 

    } 

} 
+0

코드를 이해할 수 없습니다. 설명해주세요! –

관련 문제