2012-12-11 30 views
5

OK, tôi đã dành một loạt thời gian tìm kiếm và đọc, chứ không phải chỉ trang web này. Hầu hết các chủ đề đối phó với GPS hoặc cố gắng để có được nó để làm việc trong một trình mô phỏng. Tài liệu tại developer.android.com chỉ giải thích tối đa một điểm. Tôi không thể có được một điều đơn giản để làm việc. Giống như hầu hết mọi người có vấn đề này, tôi chỉ muốn có vị trí cuối cùng được biết từ nhà cung cấp mạng và không nhận được nó, ngay cả sau khi tôi sử dụng bản đồ Google (sử dụng nhà cung cấp mạng vì GPS bị tắt) và nó cho tôi thấy chỉ cách 1/8 đến 1/4 dặm. Ok, do đó, "nhà cung cấp" (tháp di động/wi-fi nếu được bật) đang sửa chữa các bản đồ của Google. Tôi thử ứng dụng của mình và không thể có được vị trí đã biết cuối cùng. Tôi thậm chí không cố gắng để hiển thị nó trong Bản đồ, tôi đang có nó in lat và dài tọa độ vào màn hình sau khi một nút bấm để có được vị trí. Tài liệu không nói gì về vị trí cuối cùng phải được thực hiện từ cùng một hoạt động. Nó nói nó sẽ trả về vị trí đã biết cuối cùng từ nhà cung cấp được chỉ định. Tôi đang chỉ định NETWORK_PROVIDER mà tài liệu nói là tháp di động và wi-fi. (Và vâng, tôi có được bảo hiểm trong bản kê khai.)getLastKnownĐịa điểm từ NETWORK_PROVIDER trên điện thoại trả về null

Có ai biết nó hoạt động như thế nào không? Tôi chưa thấy giải thích tốt, ngay cả trên trang web của Google. Nếu bạn không thể nói, tôi thất vọng. Nó rõ ràng là một cái gì đó tôi đang làm (hay không), vì vậy tôi không đổ lỗi cho bất cứ điều gì/bất cứ ai, nhưng bản thân mình, ngoại trừ tài liệu mà rơi một chút quá ngắn cho nhu cầu của tôi.

CẬP NHẬT: Tôi hiện đang sử dụng trình xử lý vị trí và nhận vị trí, tôi đoán vị trí cuối cùng. Có vẻ hợp lý để có thể có được vị trí cuối cùng mà không bắt đầu cập nhật vị trí thông qua một người nghe vị trí, nhưng tôi đã không, và bây giờ tôi đang có một người nghe vị trí.

Vấn đề của tôi là tôi không thể thay đổi vị trí. Mã của tôi hiện không làm bất cứ điều gì ngoại trừ cố gắng để có được cập nhật vị trí thông qua người nghe, và cũng chấp nhận một nút bấm để cướp vị trí đã biết cuối cùng. Google Maps sẽ cho tôi xem tôi đang ở đâu, nhưng tôi cứ bị một vị trí 20 dặm trong mã của tôi. Tôi có một cảm giác có một cơ hội tôi thực sự có thể nhận được một vị trí mới, nhưng tôi có thể có một lỗi sử dụng khai báo cuối cùng/tĩnh đang giữ cho tôi lưu trữ và sử dụng vị trí đó khi tôi cần nó. Tệp kê khai của tôi có quyền truy cập internet và fine_location và xml cho hoạt động hoạt động tốt - nó chỉ cung cấp nút để bật/tắt tìm kiếm trực tiếp cho vị trí, nút để truy xuất lastknownlocation và xem văn bản để hiển thị vĩ độ và kinh độ. Tôi đã cố gắng loại bỏ những điều không cần thiết để giữ cho điều này không quá dài.

public class RMain extends Activity { 

public boolean islivesearchon; 
public static double netlistentime = 0 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds 
public static double netlistendistance = 0 * 1609.344; // miles * conversion to meters 
public static double gpslistentime = 30 * 60 * 1000; // minutes * 60 sec/min * 1000 for milliseconds 
public static double gpslistendistance = 0 * 1609.344; // miles * conversion to meters 

private static Location currentlocation; 
private LocationManager locationManager; 
private LocationListener locationListener; 
public static Criteria criteria; 
public TextView latview; 
public TextView longview; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_rmain); 

    latview = (TextView) findViewById(R.id.display_latitude); 
    longview = (TextView) findViewById(R.id.display_longitude); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    // setup bestProvider 
    criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    String bestprovider = locationManager.getBestProvider(criteria, true); 

    // get an initial current location 
    currentlocation = locationManager.getLastKnownLocation(bestprovider); 
    latview.setText(Double.toString(currentlocation.getLatitude())); 
    longview.setText(Double.toString(currentlocation.getLongitude())); 

    // Define locationListener interface 
    locationListener = new LocListener(); 

    // React to LiveSearch toggle button press 
    final Button livesearch = (Button) findViewById(R.id.button_livesearch); 
    livesearch.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      TextView livesearchview = (TextView) findViewById(R.id.button_livesearch); 
      boolean isNetEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
      boolean isGpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      if(islivesearchon) { 
       locationManager.removeUpdates(locationListener); 
       islivesearchon = false; 
       livesearchview.setText("Live Search is OFF"); 
      } 
      else { 
       // ideally should check for !isProviderEnabled first, then provide option for turning it on 
       if(isNetEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, (long) netlistentime, (float) netlistendistance, locationListener); 
        islivesearchon = true; 
        livesearchview.setText("Live Search is ON"); 
       } 
       // ideally should check for !isProviderEnabled first, then provide option for turning it on 
       if(isGpsEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, (long) gpslistentime, (float) gpslistendistance, locationListener); 
        islivesearchon = true; 
        livesearchview.setText("Live Search is ON"); 
       } 
      } 
     } 
    }); 

    // Respond to Get Location button click to get last known location 
    final Button getlocation = (Button) findViewById(R.id.button_getlocation); 
    getlocation.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      String bestprovider = locationManager.getBestProvider(criteria, true); 
      Location lastlocation = locationManager.getLastKnownLocation(bestprovider); 

      latview.setText(Double.toString(lastlocation.getLatitude())); 
      longview.setText(Double.toString(lastlocation.getLongitude())); 
     } 
    }); 

} 

private class LocListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location latestlocation) { 
     // Called when a new location is found by the network location provider. 
     currentlocation.set(latestlocation); 
     latview.setText(Double.toString(currentlocation.getLatitude())); 
     longview.setText(Double.toString(currentlocation.getLongitude())); 
    } 

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

    @Override 
    public void onProviderEnabled(String provider) {} 

    @Override 
    public void onProviderDisabled(String provider) {} 
}; 

}

+1

Bạn có sim trong điện thoại của mình không? –

+1

Chỉ cần đặt bất kỳ vị trí nào tại thời điểm bắt đầu ứng dụng trước, sau đó truy xuất getLastKnownLocation ... –

+0

Xin cảm ơn các bạn. Có, tôi chỉ mô phỏng bên trong điện thoại của tôi - trình giả lập trong Eclipse không phải lúc nào cũng chạy đúng cho tôi. – crispy

Trả lời

7

Hãy thử kiểm tra điều này ... sau khi gọi onLocationChange của bạn, sau đó các giá trị cũ bạn có thể sử dụng vị trí đã biết cuối cùng.

locationManager = (LocationManager)this.getSystemService(LOCATION_SERVICE); 

     location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if (location != null) { 

      old_latitude=location.getLatitude(); 
      old_longitude=location.getLongitude(); 
      Log.d("old","lat : "+old_latitude); 
      Log.d("old","long : "+old_longitude); 

      this.onLocationChanged(location); 
     } 
+0

Tôi thậm chí chưa đặt phương thức thay đổi địa chỉ. Có vẻ như tôi sẽ có thể nhận được vị trí được biết cuối cùng từ NETWORK_PROVIDER, như được mô tả trong tài liệu, nhưng tôi thậm chí không thể có được điều đó. Tôi bây giờ sẽ chỉ cần đi tất cả ra và đặt tất cả các mã trong để có được một vị trí dựa trên cuối cùng, tốt nhất, mới nhất, vv ... và xem nó như thế nào. Tôi đang học JAVA và nó chỉ là bực bội khi cố gắng làm những gì tài liệu làm cho nó nghe như nó phải làm. Tôi hình dung nếu tôi không thể rút ra lệnh đơn giản này, hãy quên đi tất cả các công cụ vị trí khác ... – crispy

+0

chỉ cần sử dụng onlocationchanged() một lần, sau đó, bạn sẽ nhận được lastlocation cuối cùng() mọi lúc :). cho đến khi vị trí thay đổi một lần nữa. điều này sẽ làm việc chắc chắn :) – Rahul

4

Nó trả về 'null', khi dịch vụ bị vô hiệu hóa trong Settings> Location and Security> vị trí thông qua mạng

Vì vậy, có thể xảy ra khá thường xuyên.

+0

Cảm ơn. Điện thoại của tôi có "Dịch vụ vị trí của Google" được chọn, "Dịch vụ GPS độc lập" hiện không được chọn và "Dịch vụ vị trí VZW" (dịch vụ vị trí do Verizon cung cấp) được chọn. Một lần nữa, Google sẽ nhận được một sửa chữa có và không có wi-fi (tốt hơn với wi-fi), và không có GPS. Tôi ngay lập tức đi vào ứng dụng của tôi và tôi không thể có được bất kỳ vị trí cuối cùng - luôn luôn 0,0 lat và 0,0 dài. Tôi bắt đầu nghĩ rằng nó cung cấp vị trí cuối cùng mà ứng dụng MY đã truy xuất từ ​​nhà cung cấp được chỉ định.Tôi đã tìm thấy một chủ đề khác mà ai đó đã đề cập đến điều này có thể xảy ra do lý do bảo mật. – crispy

+0

Xin vui lòng ngay ans của tôi. và đóng câu hỏi –

+0

Câu trả lời hay .. Tôi đã thử nghiệm điều này trên Micromax và Samsung. Hoàn hảo. – Siddharth

Các vấn đề liên quan