2013-07-11 43 views
79

Tôi đang gặp sự cố khi nhận tọa độ vị trí hiện tại của mình bằng cách sử dụng nhà cung cấp NETWORK của hệ thống vị trí Android.Cách nhận vị trí hiện tại trong Android

Đã đọc rất nhiều hướng dẫn và triển khai 4 hoặc 5 lớp hiện có cho dự án của tôi và tất cả chúng đều cho tôi tọa độ cuối cùng chứ không phải là tọa độ hiện tại.

Tôi khá chắc chắn rằng vấn đề là điều cơ bản mà tôi thiếu nhưng tôi không thể hiểu chính xác nó là gì.

Codes Tôi đang sử dụng hiện nay:

Đây là Hoạt động chính của tôi

package com.example.locationtests; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    GPSTracker mGPS = new GPSTracker(this); 

    TextView text = (TextView) findViewById(R.id.texts); 
    if(mGPS.canGetLocation){ 
    mGPS.getLocation(); 
    text.setText("Lat"+mGPS.getLatitude()+"Lon"+mGPS.getLongitude()); 
    }else{ 
     text.setText("Unabletofind"); 
     System.out.println("Unable"); 
    } 
} 

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

} 

Đây là lớp tôi đang sử dụng để theo dõi:

package com.example.locationtests; 

import android.app.AlertDialog; 
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.provider.Settings; 
import android.util.Log; 

public final class GPSTracker implements LocationListener { 

    private final Context mContext; 

    // flag for GPS status 
    public 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 = 1; // 10 meters 

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

    // Declaring a Location Manager 
    protected LocationManager locationManager; 

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

    /** 
    * Function to get the user's current location 
    * 
    * @return 
    */ 
    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext 
        .getSystemService(Context.LOCATION_SERVICE); 

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

      Log.v("isGPSEnabled", "=" + isGPSEnabled); 

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

      Log.v("isNetworkEnabled", "=" + isNetworkEnabled); 

      if (isGPSEnabled == false && isNetworkEnabled == false) { 
       // no network provider is enabled 
      } else { 
       this.canGetLocation = true; 
       if (isNetworkEnabled) { 
        location=null; 
        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) { 
        location=null; 
        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) { 
      e.printStackTrace(); 
     } 

     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 Dialog Title 
     alertDialog.setTitle("GPS is settings"); 

     // Setting Dialog 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) { 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

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

} 

Đây là AndroidManifest của tôi. xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.locationtests" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <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"></uses-permission> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.location" android:required="true" /> 
    <uses-feature android:name="android.hardware.location.gps" android:required="false" /> 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.locationtests.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Tính năng GPS Acctualy hoạt động tốt, nhưng không định vị NETWORK. Khi Ive quay thiết bị GPS trên cordinates liên tục thay đổi trong khi di chuyển im, nhưng dosnt happence cùng khi tôi có tắt nó đi và chuyển tiếp trên NETWORK_PROVIDER

+0

kiểm tra http://developer.android này.com/training/location/retrieve-current.html – OMAK

+1

Cách easist là sử dụng thư viện cấp cao hơn như thế này: https://github.com/delight-im/Android-SimpleLocation – caw

+0

có một lib dễ dàng để làm như vậy ...... rất dễ thực hiện .. có giao diện https://github.com/Gaganjdeep/GetMyLocationLIbrary.git HOẶC http://shortcutsandroid.blogspot.in/2016/03/get-current-location-in -activity-in.html –

Trả lời

107

Trước tiên, bạn cần phải xác định một LocationListener để xử lý thay đổi địa điểm.

private final LocationListener mLocationListener = new LocationListener() { 
    @Override 
    public void onLocationChanged(final Location location) { 
     //your code here 
    } 
}; 

Sau đó lấy LocationManager và yêu cầu cập nhật vị trí

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REFRESH_TIME, 
      LOCATION_REFRESH_DISTANCE, mLocationListener); 
} 

Và cuối cùng hãy chắc chắn rằng bạn đã thêm sự cho phép trên Manifest,

Đối với chỉ sử dụng mạng dựa trên địa điểm sử dụng này

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

Đối với vị trí dựa trên GPS, cái này

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
+0

Acctualy GPS possitioning hoạt động tốt, nhưng NETWORK định vị dosn't. Khi Ive biến thiết bị GPS trên dây điện tiếp tục thay đổi trong khi di chuyển im, nhưng hạnh phúc dosnt cùng một khi tôi đã tắt nó đi –

+4

Hãy nhớ rằng, độ chính xác giữa GPS và vị trí dựa trên NETWORK thực sự là lớn. Hôm qua tôi đã được thử nghiệm trong nó, trong khi di chuyển trên xe buýt, GPS đã cho độ chính xác 3-5 mét và MẠNG như 1Km. Vì vậy, có được trong một xe buýt/xe hơi và và thấy sự khác biệt giữa hai người. – Axxiss

+7

@Axxiss cách bạn nhận được LOCATION_REFRESH_TIME, LOCATION_REFRESH_DISTANCE, mLocationListener); – Amitsharma

9

Bạn cần phải viết mã trong OnLocationChanged phương pháp, bởi vì phương pháp này là được gọi khi vị trí đã thay đổi. I E. bạn cần lưu vị trí mới để trả lại nếu getLocation được gọi.

Nếu bạn không sử dụng onLocationChanged, nó sẽ luôn là vị trí cũ.

2

Tôi đang sử dụng this tutorial và nó hoạt động tốt cho ứng dụng của tôi.

Trong hoạt động của tôi, tôi đặt mã này:

GPSTracker tracker = new GPSTracker(this); 
    if (!tracker.canGetLocation()) { 
     tracker.showSettingsAlert(); 
    } else { 
     latitude = tracker.getLatitude(); 
     longitude = tracker.getLongitude(); 
    } 

cũng kiểm tra nếu giả lập của bạn chạy với Google API

+22

GPSTracker là gì? –

+20

lật nếu cân nhắc – pomber

+1

lợi thế của việc lật "nếu" là gì? – drulabs