使用 GPS 获取当前位置

Posted

技术标签:

【中文标题】使用 GPS 获取当前位置【英文标题】:get current Location with GPS 【发布时间】:2016-12-01 08:30:13 【问题描述】:

我想每 30 秒获取一次当前的纬度和经度,但我可以在每 30 秒内获取相同的坐标,它不会改变我使用 Gps 服务类,它位于下面。当我移动到设备时如何更改位置。

public class GPSService extends Service implements LocationListener 

    // saving the context for later use
    private final Context mContext;

    // if GPS is enabled
    boolean isGPSEnabled = false;
    // if Network is enabled
    boolean isNetworkEnabled = false;
    // if Location co-ordinates are available using GPS or Network
    public boolean isLocationAvailable = false;

    // Location and co-ordinates coordinates
    Location mLocation;
    double mLatitude;
    double mLongitude;

    // Minimum time fluctuation for next update (in milliseconds)
    private static final long TIME = 30000;
    // Minimum distance fluctuation for next update (in meters)
    private static final long DISTANCE = 20;

    // Declaring a Location Manager
    protected LocationManager mLocationManager;

    public GPSService(Context context) 
        this.mContext = context;
        mLocationManager = (LocationManager) mContext
                .getSystemService(LOCATION_SERVICE);

    

    /**
     * Returs the Location
     *
     * @return Location or null if no location is found
     */
    public Location getLocation() 
        try 

            // Getting GPS status
            isGPSEnabled = mLocationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);

            // If GPS enabled, get latitude/longitude using GPS Services
            if (isGPSEnabled) 
                mLocationManager.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER, TIME, DISTANCE, this);
                if (mLocationManager != null) 
                    mLocation = mLocationManager
                            .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    if (mLocation != null) 
                        mLatitude = mLocation.getLatitude();
                        mLongitude = mLocation.getLongitude();
                        isLocationAvailable = true; // setting a flag that
                                                    // location is available
                        return mLocation;
                    
                
            

            // If we are reaching this part, it means GPS was not able to fetch
            // any location
            // Getting network status
            isNetworkEnabled = mLocationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

            if (isNetworkEnabled) 
                mLocationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER, TIME, DISTANCE, this);
                if (mLocationManager != null) 
                    mLocation = mLocationManager
                            .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (mLocation != null) 
                        mLatitude = mLocation.getLatitude();
                        mLongitude = mLocation.getLongitude();
                        isLocationAvailable = true; // setting a flag that
                                                    // location is available
                        return mLocation;
                    
                
            
            // If reaching here means, we were not able to get location neither
            // from GPS not Network,
            if (!isGPSEnabled) 
                // so asking user to open GPS
                askUserToOpenGPS();
            

         catch (Exception e) 
            e.printStackTrace();
        
        // if reaching here means, location was not available, so setting the
        // flag as false
        isLocationAvailable = false;
        return null;
    

    /**
     * Gives you complete address of the location
     *
     * @return complete address in String
     */
    public String getLocationAddress() 

        if (isLocationAvailable) 

            Geocoder geocoder = new Geocoder(mContext, Locale.getDefault());
            // Get the current location from the input parameter list
            // Create a list to contain the result address
            List<Address> addresses = null;
            try 
                /*
                 * Return 1 address.
                 */
                addresses = geocoder.getFromLocation(mLatitude, mLongitude, 1);
             catch (IOException e1) 
                e1.printStackTrace();
                return ("IO Exception trying to get address:" + e1);
             catch (IllegalArgumentException e2) 
                // Error message to post in the log
                String errorString = "Illegal arguments "
                        + Double.toString(mLatitude) + " , "
                        + Double.toString(mLongitude)
                        + " passed to address service";
                e2.printStackTrace();
                return errorString;
            
            // If the reverse geocode returned an address
            if (addresses != null && addresses.size() > 0) 
                // Get the first address
                Address address = addresses.get(0);
                /*
                 * Format the first line of address (if available), city, and
                 * country name.
                 */
                String addressText = String.format(
                        "%s, %s, %s",
                        // If there's a street address, add it
                        address.getMaxAddressLineIndex() > 0 ? address
                                .getAddressLine(0) : "",
                        // Locality is usually a city
                        address.getLocality(),
                        // The country of the address
                        address.getCountryName());
                // Return the text
                return addressText;
             else 
                return "No address found by the service: Note to the developers, If no address is found by google itself, there is nothing you can do about it.";
            
         else 
            return "Location Not available";
        

    



    /**
     * get latitude
     *
     * @return latitude in double
     */
    public double getLatitude() 
        if (mLocation != null) 
            mLatitude = mLocation.getLatitude();
        
        return mLatitude;
    

    /**
     * get longitude
     *
     * @return longitude in double
     */
    public double getLongitude() 
        if (mLocation != null) 
            mLongitude = mLocation.getLongitude();
        
        return mLongitude;
    

    /**
     * close GPS to save battery
     */
    public void closeGPS() 
        if (mLocationManager != null) 
            mLocationManager.removeUpdates(GPSService.this);
        
    

    /**
     * show settings to open GPS
     */
    public void askUserToOpenGPS() 
        AlertDialog.Builder mAlertDialog = new AlertDialog.Builder(mContext);

        // Setting Dialog Title
        mAlertDialog.setTitle("Location not available, Open GPS?")
        .setMessage("Activate GPS to use use location services?")
        .setPositiveButton("Open Settings", new DialogInterface.OnClickListener() 
            public void onClick(DialogInterface dialog, int which) 
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
                
            )
            .setNegativeButton("Cancel",new DialogInterface.OnClickListener() 
                public void onClick(DialogInterface dialog, int which) 
                    dialog.cancel();
                    
                ).show();
    

    /** 
     * Updating the location when location changes
     */
    @Override
    public void onLocationChanged(Location location) 
        mLatitude = location.getLatitude();
        mLongitude = location.getLongitude();
    

    @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;
    


我为 Myclass 调用 getLocation 方法

double latitudem2, longitudem2;
String cnvrt_latitude2,cnvrt_longitude2;

if (mGPSService2.isLocationAvailable == false) 

        cnvrt_latitude2 = "0";
        cnvrt_longitude2 = "0";

        // Or you can continue without getting the location, remove the return; above and uncomment the line given below
        // address = "Location not available";
     else 


        mGPSService2.getLocation();


        // Getting current location co-ordinates
        latitudem2 = mGPSService2.getLatitude();
        longitudem2 = mGPSService2.getLongitude();
        //Toast.makeText(getApplicationContext(), "Latitude:" + latitudem + " | Longitude: " + longitudem, Toast.LENGTH_LONG).show();

        cnvrt_latitude2 = String.valueOf(latitudem2);
        cnvrt_longitude2 = String.valueOf(longitudem2);

    

【问题讨论】:

【参考方案1】:

我使用了不同的方法。我认为你应该使用 Google play。

dependencies 
..
compile 'com.google.android.gms:play-services:8.4.0'
..

在你的活动中:

private void initGoogleClient() 
     googleClient = new GoogleApiClient.Builder(this)
         .addConnectionCallbacks(this)
         .addOnConnectionFailedListener(this)
         .addApi(LocationServices.API)
         .build();

然后注册您的应用:

LocationRequest req = new LocationRequest();
req.setInterval(60 * 60 * 1000);
req.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(googleClient, req, this);

您可以根据自己的要求更改优先级。 不要忘记在你的 Activity 中实现监听器

public class MainActivity extends AppCompatActivity
        implements GoogleApiClient.OnConnectionFailedListener,
                   GoogleApiClient.ConnectionCallbacks,
                   LocationListener 
...

我做了类似的东西来根据当前位置知道紫外线指数。你可以看看我的post。

【讨论】:

当我运行我的方法时,它可以工作,当我在我的手机上移动到 android 5.0 的手机纬度和经度时,但是当我尝试使用我的平板电脑时,它的 android 4.2 位置没有改变。你知道这个问题吗? 听起来有点奇怪..您可以尝试使用我的代码并检查它是否有效。对我来说效果很好。

以上是关于使用 GPS 获取当前位置的主要内容,如果未能解决你的问题,请参考以下文章

使用gps从纬度和经度获取当前位置

iOS 使用 GPS 设备获取当前位置

Android 使用GPS获取地理位置

使用 Xamarin 返回 0 获取当前 gps 位置

Android:如何使用 GPS 提供程序获取离线当前位置?

如何使用 Google App 或 GPS 获取当前位置? [复制]