【问题标题】:How to get Android GPS location如何获取 Android GPS 位置
【发布时间】:2013-05-06 02:15:03
【问题描述】:

干杯,我正在尝试通过 Android 获取当前的 GPS 位置。我也关注了this TutorialVogellas article。虽然它不起作用。使用 LocationManager.NETWORK_PROVIDER 时,无论我站在哪里,我总是得到纬度 51 度和经度度 9 度。使用 LocationManager.GPS_PROVIDER 时,我什么也得不到。

虽然使用 GMaps 时一切正常:S 不知道为什么。如何像 GMaps 一样获取当前 GPS 位置?

这是我的代码:

package com.example.gpslocation;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;

public class GPS_Location extends Activity implements LocationListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gps__location);

    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}

@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__location, menu);
    return true;
}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

    int latitude = (int) (location.getLatitude());
    int longitude = (int) (location.getLongitude());

    Log.i("Geo_Location", "Latitude: " + latitude + ", Longitude: " + longitude);
}

@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

}

}

【问题讨论】:

标签: java android google-maps gps location


【解决方案1】:

这是你的问题:

int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());

纬度和经度是double-值,因为它们以度为单位表示位置。

通过将它们转换为int,您将丢弃逗号后面的所有内容,这会产生很大的不同。见"Decimal Degrees - Wiki"

【讨论】:

  • 已经认为这很愚蠢。你已经证明了它;P Ty
【解决方案2】:

试试看:

public LatLng getLocation()
    {
     // Get the location manager
     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
     Criteria criteria = new Criteria();
     String bestProvider = locationManager.getBestProvider(criteria, false);
     Location location = locationManager.getLastKnownLocation(bestProvider);
     Double lat,lon;
     try {
       lat = location.getLatitude ();
       lon = location.getLongitude ();
       return new LatLng(lat, lon);
     }
     catch (NullPointerException e){
         e.printStackTrace();
       return null;
     }
    }

【讨论】:

  • 感谢您的回答,尽管我已经尝试过您上面的代码,只是将自己的代码剪切为最简单的解决方案来向您展示问题;P 无论如何谢谢
【解决方案3】:

这段代码有一个问题:

int latitude = (int) (location.getLatitude());
int longitude = (int) (location.getLongitude());

您可以将int 更改为double

double latitude = location.getLatitude();
double longitude = location.getLongitude();

【讨论】:

    【解决方案4】:

    最初的问题是通过将latlon 更改为double 来解决的。

    我想用Location location = locationManager.getLastKnownLocation(bestProvider);向解决方案添加评论 它可以在其他应用程序为此进行侦听时找出最后一个已知位置。例如,如果自设备启动后没有应用程序这样做,代码将返回零(我最近花了一些时间来解决这个问题)。

    另外,当locationManager.removeUpdates(this);不需要时停止收听是一个好习惯

    此外,即使拥有manifest 中的权限,当在设备上的 Android 设置中启用位置服务时,该代码仍然有效。

    【讨论】:

      【解决方案5】:

      摘录:-

      try 
              {
                cnt++;scnt++;now=System.currentTimeMillis();r=rand.nextInt(6);r++;
                  loc=lm.getLastKnownLocation(best);
                  if(loc!=null){lat=loc.getLatitude();lng=loc.getLongitude();}
      
                  Thread.sleep(100);
                  handler.sendMessage(handler.obtainMessage());
               } 
              catch (InterruptedException e) 
              {
                  Toast.makeText(this, "Error="+e.toString(), Toast.LENGTH_LONG).show();
              }
      

      正如您在上面看到的,一个线程与用户界面活动的主线程一起运行,该线程持续显示 GPS 纬度、经度以及当前时间和随机掷骰子。

      如果您好奇,请查看完整代码: GPS Location with a randomized dice throw & current time in separate thread

      【讨论】:

        【解决方案6】:

        为这个项目工作了一天。它可能对你有用。 我压缩并组合了网络和 GPS。 MainActivity.java中直接即插即用 (显示结果有一些DIY功能)

         ///////////////////////////////////
        ////////// LOCATION PACK //////////
        // 
        //  locationManager: (LocationManager) for getting LOCATION_SERVICE
        //  osLocation: (Location) getting location data via standard method
        //  dataLocation: class type storage locztion data
        //    x,y: (Double) Longtitude, Latitude
        //  location: (dataLocation) variable contain absolute location info. Autoupdate after run locationStart();
        //  AutoLocation: class help getting provider info
        //  tmLocation: (Timer) for running update location over time
        //  LocationStart(int interval): start getting location data with setting interval time cycle in milisecond
        //  LocationStart(): LocationStart(500)
        //  LocationStop(): stop getting location data
        //
        //  EX:
        //    LocationStart(); cycleF(new Runnable() {public void run(){bodyM.text("LOCATION \nLatitude: " + location.y+ "\nLongitude: " + location.x).show();}},500);
        //
        
        LocationManager locationManager;
        Location osLocation;
        public class dataLocation {double x,y;}
        dataLocation location=new dataLocation();
        public class AutoLocation extends Activity implements LocationListener {
            @Override public void onLocationChanged(Location p1){}
            @Override public void onStatusChanged(String p1, int p2, Bundle p3){}
            @Override public void onProviderEnabled(String p1){}
            @Override public void onProviderDisabled(String p1){}
            public Location getLocation(String provider) {
                if (locationManager.isProviderEnabled(provider)) {
                    locationManager.requestLocationUpdates(provider,0,0,this);
                    if (locationManager != null) {
                        osLocation = locationManager.getLastKnownLocation(provider);
                        return osLocation;
                    }
                }
                return null;
            }
        }
        Timer tmLocation=new Timer();
        public void LocationStart(int interval){
            locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
            final AutoLocation autoLocation = new AutoLocation();
            tmLocation=cycleF(new Runnable() {public void run(){ 
                        Location nwLocation = autoLocation.getLocation(LocationManager.NETWORK_PROVIDER);
                        if (nwLocation != null) {
                            location.y = nwLocation.getLatitude();
                            location.x = nwLocation.getLongitude();
                        } else {
                            //bodym.text("NETWORK_LOCATION is loading...").show();
                        }
                        Location gpsLocation = autoLocation.getLocation(LocationManager.GPS_PROVIDER);
                        if (gpsLocation != null) {
                            location.y = gpsLocation.getLatitude();
                            location.x = gpsLocation.getLongitude();    
                        } else {
                            //bodym.text("GPS_LOCATION is loading...").show();
                        }   
                    }}, interval);
        }
        public void LocationStart(){LocationStart(500);};
        public void LocationStop(){stopCycleF(tmLocation);}
        
        //////////
        ///END//// LOCATION PACK //////////
        //////////
        
        
        /////////////////////////////
        ////////// RUNTIME //////////
        //
        // Need library:
        //  import java.util.*;
        //
        // delayF(r,d): execute runnable r after d millisecond
        //   Halt by execute the return: final Runnable rn=delayF(...); (new Handler()).post(rn);
        // cycleF(r,i): execute r repeatedly with i millisecond each cycle
        // stopCycleF(t): halt execute cycleF via the Timer return of cycleF
        // 
        // EX:
        //   delayF(new Runnable(){public void run(){ sig("Hi"); }},2000);
        //   final Runnable rn=delayF(new Runnable(){public void run(){ sig("Hi"); }},3000);
        //     delayF(new Runnable(){public void run(){ (new Handler()).post(rn);sig("Hello"); }},1000);
        //   final Timer tm=cycleF(new Runnable() {public void run(){ sig("Neverend"); }}, 1000);
        //     delayF(new Runnable(){public void run(){ stopCycleF(tm);sig("Ended"); }},7000);
        //
        public static Runnable delayF(final Runnable r, long delay) {
            final Handler h = new Handler();
            h.postDelayed(r, delay);
            return new Runnable(){
                @Override
                public void run(){h.removeCallbacks(r);}
            };
        }
        public static Timer cycleF(final Runnable r, long interval) {
            final Timer t=new Timer();
            final Handler h = new Handler();
            t.scheduleAtFixedRate(new TimerTask() {
                    public void run() {h.post(r);}
                }, interval, interval);
            return t;
        }
        public void stopCycleF(Timer t){t.cancel();t.purge();}
        public boolean serviceRunning(Class<?> serviceClass) {
            ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
                if (serviceClass.getName().equals(service.service.getClassName())) {
                    return true;
                }
            }
            return false;
        }
        //////////
        ///END//// RUNTIME //////////
        //////////
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-17
          • 1970-01-01
          • 2016-07-30
          • 1970-01-01
          • 2016-09-19
          • 1970-01-01
          • 2013-12-11
          • 1970-01-01
          相关资源
          最近更新 更多