2016-02-04 70 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); 
相关问题