2016-02-04 112 views
1

我嘗試在Android中使用GPS_Provider查找位置。當嘗試使用Network_Provider獲得位置比它給我的位置和調用回調函數正常,但是當我嘗試使用GPS_Provider獲得位置比它給我的位置 &也不會調用回調函數的LocationListeneronLocationChangedGPS位置提供程序在Android中給我空位置

我的代碼是:

LocationManager lm; 
    boolean isNetwork = false; 
    Location location; 
    LocationListener locationListener; 
    LocationListener loc; 
    MyLocation myLocation; 
    Location location1; 

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

     lm = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 

     try { 
      myLocation = new MyLocation(); 

      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       // TODO: Consider calling 
       Log.e("Location", "Permission Not Given"); 
       return; 
      } 
      Log.e("Location", "Permission is Given"); 
      lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLocation); 
      location1=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     }catch(Exception e) 
     { 

     } 
    } 

MyLocation.class

public class MyLocation implements LocationListener { 
    @Override 
    public void onLocationChanged(Location location) { 

     if(location!=null) 
     { 

      String lat,Longi; 
      lat=String.valueOf(location.getLatitude()); 
      Longi=String.valueOf(location.getLongitude()); 

      Log.e("Latitude: " , lat); 
      Log.e("Longitude: " , Longi); 

     } 
     else 
      Log.e("Location is null", "Location not Found"); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     Log.e("Latitude: " ,""+ provider+ " Status: "+status); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     Log.e("Latitude: " , provider); 
    } 
} 

它給我的logcat錯誤如下:

02-04 00:50:52.280 14480-14480/com.arc.locationusingnetwork E/Location: Permission is Given 
02-04 00:50:52.360 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 46 
02-04 00:50:52.370 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 49 
02-04 00:50:52.370 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 50 
02-04 00:50:52.380 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 50 
02-04 00:50:52.380 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 50 
02-04 00:50:52.390 14480-14480/com.arc.locationusingnetwork E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 52 
+2

添加完整日誌跟蹤 –

+0

@VPS:嘗試使用Google Fused Location API進行位置更新。 * GPS不能在屋頂下工作。 – kevz

+0

'location1 = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);'你在說這是空嗎? –

回答

2

老LocationListener的類是可能棄用。您應該使用Android使用FusedLocationApi來獲取當前位置或通過FusedLocationAPI的LocationListener接收位置更新。

這是一個很好的教程使用FusedLocationApi:Android Location API

+0

不推薦使用。 – j4rey89

+0

可能是,但官方Android指南建議使用FusedLocationApi進行位置相關操作。我也遇到了舊的LocationListener的問題(接收空值)。使用新API後問題解決了。 –

+0

FusedLocationApi更準確,消耗更多電量。 LocationListener不太準確,它跳躍(就像它會在一點顯示你,然後下一秒你在另一個點),消耗更少的電量,因此如果你需要一個粗略的估計位置LocationListener是有用的。我沒有使用LocationListener的問題。 – j4rey89

0

您需要將您的設備調用LocationListeneronLocationChanged作爲 LocationListener用於接收來自LocationManager通知時的位置發生了變化。如果已使用LocationManager.requestLocationUpdates(String, long, float, LocationListener)方法向位置管理器服務註冊了LocationListener,則會調用這些方法。

現在沒有保證getLastKnownLocation總是返回Location因爲它返回最後的位置,但如果剛安裝的應用或用戶沒有明確的數據,那麼全球定位系統最後已知的位置,則返回null因此處理這個你應該將你的設備,使onLocationChanged是稱爲(我建議移動打開,以便設備連接到gps快)。

OR

您可以使用FusedLocationProviderApi,因爲它是最新API和可用的可能性名列前茅的Android得到的位置。 google docs : Getting the Last Known Location

0

您是否檢查過您的GNSS/GPS是否已啓用?

boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
相關問題