Android:在Play商店发布后无法获取当前位置

时间:2017-09-26 17:25:49

标签: android gps location

我使用此代码获取当前位置,它工作正常。但在商店发布后,它就再也无法使用了。应用程序保持锁定在doInBackground函数中。

private class GpsAsync extends AsyncTask<Void, Integer, Boolean> {
    private ContactLocationListener contactLocationListener;
    private Location location;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        contactLocationListener = new ContactLocationListener();
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, contactLocationListener);
    }

    @Override
    protected Boolean doInBackground(Void... voids) {
        while (location == null) {}
        return null;
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);
        textViewLatitude.setText(String.valueOf(location.getLatitude()));
        textViewLongitude.setText(String.valueOf(location.getLongitude()));
    }

    public class ContactLocationListener implements LocationListener {
        @Override
        public void onLocationChanged(Location loc) {
            location = loc;
        }
        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {}
        @Override
        public void onProviderEnabled(String s) {}
        @Override
        public void onProviderDisabled(String s) {}
    }
}

我的清单:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />

我的许可检查:

if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 50);
} else {
    // start GpsAsync
}

1 个答案:

答案 0 :(得分:0)

两件事:

  1. 每当LocationProvider无法提供位置时,doInBackground中的while循环会导致无限循环。它一般很危险。最好做一些&#34;警卫&#34;周围 - 至少是简单的柜台:

    protected Boolean doInBackground(Void... voids) {
         Integer count = 0  
         while (location == null||count<10000) {count++}
         return null;
    }
    
  2. 关于为什么提供程序在发布后为位置返回null的问题。有几个可能的原因,请检查:

    • GPS是否可用并在设备上开启?(我想它可能会在发布后在不同的设备上进行测试,其中GPS已关闭)

    • 可能的权限问题。自API 23以来,对于位置和其他&#34;危险&#34;服务,除了在清单中声明之外,它应该被用户接受一次(第一次调用应用程序时弹出)。如果用户&#34;拒绝&#34;服务 - GPS提供商将始终返回null。

    • 另外,请考虑使用&#34; getBestProvider&#34;如果GPS不可用,如下所示

      LocationManager locationManager;
      String svcName = Context.LOCATION_SERVICE;
      locationManager = 
      (LocationManager)getSystemService(svcName);
      Criteria criteria = new Criteria();
      criteria.setAccuracy(Criteria.ACCURACY_FINE);
      criteria.setPowerRequirement(Criteria.POWER_LOW);
      criteria.setAltitudeRequired(false);
      criteria.setBearingRequired(false);
      criteria.setSpeedRequired(false);
      criteria.setCostAllowed(true);
      String provider = locationManager.getBestProvider(criteria, true);
      locationManager.getLastKnownLocation(provider);
      l = locationManager.getLastKnownLocation(provider);
      
  3. 要求用户许可的代码:

            // first check the permission in manifest:
            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    
    
                //  then ask for GPS permission from user:
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            }
    
         ///////////////////////////////////////////////////////////////////////////////
         ///// NOTE: Even if we declared the permission in manifest, user can decline.
         /// So we anyway will do try/catch on pemission exception later on!
         ///////////////////////////////////////////////////////////////////////////////