2013-07-16 38 views
13

Ứng dụng của tôi chỉ cần thô dịch vụ vị trí khi khởi động.Làm thế nào để có được vị trí thô sử dụng Wifi hoặc GSM hoặc GPS, tùy theo điều kiện nào có sẵn?

Cụ thể, tôi cần vị trí thô của ứng dụng để cung cấp cho người dùng thông tin cửa hàng gần đó.

Vị trí KHÔNG cần phải được cập nhật liên tục. Ngoài ra, bản địa hóa thô sẽ đủ trong trường hợp này.

Tôi muốn ứng dụng tự động chọn GSM hoặc wifi hoặc GPS, tùy vào điều kiện nào khả dụng.

Dịch vụ vị trí cũng phải là một lần để tiết kiệm năng lượng điện thoại.

Tôi có thể làm như thế nào?

Tôi đã thử sử dụng GPS riêng.

Vấn đề của tôi là tôi không biết cách dừng tính năng định vị liên tục làm mới của GPS. Tôi không biết làm thế nào để làm cho điện thoại chọn một trong ba phương pháp, một trong hai.

Một số mã mẫu hoặc ý tưởng được đánh giá cao.

+1

locationManager.requestLocationUpdates() phương pháp mất khoảng cách min và min thời gian trước khi nó sẽ cố gắng yêu cầu vị trí một lần nữa. Sử dụng các giá trị mà bạn yêu cầu. Khi bạn sử dụng xong, hãy hủy đăng ký người nhận để ngừng cập nhật. –

Trả lời

17

Dưới đây là một quan điểm nhất định:

private void _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); 
    try { 
     lat = location.getLatitude(); 
     lon = location.getLongitude(); 
    } catch (NullPointerException e) { 
     lat = -1.0; 
     lon = -1.0; 
    } 
} 

Tuy nhiên điều này có thể yêu cầu truy cập FINE_LOCATION. Vì vậy:

Một cách khác là sử dụng this sử dụng LocationManager.

Cách nhanh nhất có thể là sử dụng các vị trí Last Known với điều này, tôi đã sử dụng nó và nó khá nhanh:

private double[] getGPS() { 
LocationManager lm = (LocationManager) getSystemService(
    Context.LOCATION_SERVICE); 
List<String> providers = lm.getProviders(true); 

Location l = null; 

for (int i=providers.size()-1; i>=0; i--) { 
    l = lm.getLastKnownLocation(providers.get(i)); 
    if (l != null) break; 
} 

double[] gps = new double[2]; 
if (l != null) { 
    gps[0] = l.getLatitude(); 
    gps[1] = l.getLongitude(); 
} 

return gps; 
} 
1

Để nhận thông tin từ nhà cung cấp cụ thể, bạn nên sử dụng: LocationManager.getLastKnownLocation(String provider), nếu bạn muốn ứng dụng tự động chọn giữa các nhà cung cấp thì bạn có thể thêm nhà cung cấp với phương thức getBestProvider. Đối với ngừng làm mới vị trí GPS, tôi đã không khá bắt. Bạn chỉ cần nhận thông tin vị trí một lần hoặc bạn có cần giám sát các thay đổi vị trí định kỳ không?

EDIT: Nhân tiện, nếu bạn muốn thông tin vị trí của mình được cập nhật, bạn nên sử dụng phương pháp requestSingleUpdate của trình quản lý vị trí, với Tiêu chí được chỉ định. Trong trường hợp này nhà cung cấp cũng nên được lựa chọn tự động

+0

chỉ một lần. tức là ứng dụng ước tính vị trí chỉ khi nó được bắt đầu lần đầu tiên. Sau đó người dùng có thể chọn thủ công để làm mới vị trí –

7

Đây là một cách

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; 
       // First get location from Network Provider 
       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) { 
      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) { 
    } 

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

} 

Sử dụng nó theo cách này:

gps = new GPSTracker(PromotionActivity.this); 

// check if GPS enabled  
if(gps.canGetLocation()){ 
    double latitude = gps.getLatitude(); 
    double longitude = gps.getLongitude(); 
}else{ 
// can't get location 
// GPS or Network is not enabled 
// Ask user to enable GPS/network in settings 
    gps.showSettingsAlert();  
} 

Sử dụng tính năng này, bạn có thể có được vị trí tốt nhất hiện có.tôi hy vọng rằng sẽ giúp

+0

Cần phải cẩn thận với từ khóa "này" để gọi từ Hoạt động khác cần phải được thay thế bằng "mContext" – Sam

4

bạn có thể sử dụng LocationClient nó cung cấp một thống nhất/đơn giản hóa (Fused) vị trí API, hãy kiểm tra Video này cho các tài liệu giới thiệu và nền hoặc này developer guide

nhược điểm chính là bạn làm cho bạn ứng dụng phụ thuộc vào sự tồn tại của Google Play Services trên thiết bị.