【问题标题】:Can't get device position无法获取设备位置
【发布时间】:2019-01-23 10:04:15
【问题描述】:

我需要在主要活动开始时获取设备的当前位置,所以我使用了位置管理器和所有这些东西。但我无法获得设备的当前位置,也不知道为什么。在这里,我发布清单权限和我的代码。 (完整的堆栈跟踪是如此之长)

清单

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission
    android:name="com.example.mapexdemo.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-feature android:name="android.hardware.location.network" />

代码

ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
   if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
       Toast.makeText(MainActivity.this, "NO GPS", Toast.LENGTH_LONG).show();
       System.out.print("OknO");
   } else if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
       System.out.print("OK0");
       if(ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
               != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission
               (MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
           ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION);
           System.out.print("ok01");
       } else {
           Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

           Location location1 = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

           Location location2 = locationManager.getLastKnownLocation(LocationManager. PASSIVE_PROVIDER);

           System.out.print("ok011");

           if (location != null) {
               double latti = location.getLatitude();
               double longi = location.getLongitude();
               lattitude = String.valueOf(latti);
               longitude = String.valueOf(longi);
               Toast.makeText(MainActivity.this, "Your current location is"+ lattitude + longitude, Toast.LENGTH_SHORT).show();
               System.out.print("OK1");

       } else if(location1 != null){
               double latti = location1.getLatitude();
               double longi = location1.getLongitude();
               lattitude = String.valueOf(latti);
               longitude = String.valueOf(longi);
               System.out.print("OK2");
               Toast.makeText(MainActivity.this, "Your current location is"+ lattitude + longitude, Toast.LENGTH_SHORT).show();
           } else if (location2 != null){
               double latti = location2.getLatitude();
               double longi = location2.getLongitude();
               lattitude = String.valueOf(latti);
               longitude = String.valueOf(longi);
               Toast.makeText(MainActivity.this, "Your current location is"+ lattitude + longitude, Toast.LENGTH_SHORT).show();
                System.out.print("OK3");
           } else {
               Toast.makeText(MainActivity.this, "Unable to trace your location", Toast.LENGTH_SHORT).show();
                System.out.print("OK4");
           }
       }
   }

【问题讨论】:

  • 如果设备位置未知,locationManager.getLastKnownLocation() 调用将返回 null。并且不一定知道最近是否没有应用程序(包括您的应用程序)请求位置更新。即使它返回一个位置,它也可能不是最新的。
  • 哪里失败了?它是在权限上失败还是您根本没有在您的位置中获取任何数据?
  • @JesperPurup 如果我检查纬度和经度,它们是空的
  • @MarkusKauppinen 抱歉,我不太理解您的评论

标签: java android location


【解决方案1】:

用户权限检查后使用fusedLocationProvider

 public FusedLocationProviderClient mFusedLocationProvider;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //In onCreate define the provider like this
    mFusedLocationProvider =LocationServices.getFusedLocationProviderClient(this);
}

// 然后在你的监听器或任何你想获取位置的地方使用这样的提供者

mFusedLocationProvider.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
    @Override
    public void onSuccess(Location location) {
    // Got last known location. In some rare situations this can be null.
            if (location != null) {
                // Logic to handle location object
                // here you can handler the location location.getLatitude &   location.getLongitude
            }

    }
});

【讨论】:

  • 谢谢,但我无法解决问题。当片段开始时,我需要一次位置。我需要一个聪明的解决方案,因为我只找到跟踪位置的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多