2017-09-26 144 views
0

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

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) {} 
    } 
} 

我的清单:

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 
} 

回答

0

两件事情:

  1. 在doInBackground while循环导致每次无限循环

    <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" /> 
    

    我的权限检查当LocationProvider失败时提供位置。它通常很危险。更好地使一些“卫士”绕 - 至少简单的计数器:

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

    • 可用并接通设备上的全球定位系统(我猜它可能在不同的设备上进行测试后发布,其中GPS被关断)

    • ?可能的权限问题。由于API 23对于位置和其他“危险”服务,除了在声明中声明之外,应该由用户接受一次(第一次调用应用程序时弹出)。如果用户“拒绝”服务 - GPS提供商将始终返回空值。

    • 此外,考虑的情况下使用 “getBestProvider” 如果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); 
      

代码从用户请求许可:

 // 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! 
    /////////////////////////////////////////////////////////////////////////////// 
+0

谢谢为你的答案。 - GPS已打开(我可以在Google地图上获取位置) - 在调用GpsAsync之前检查权限 - 对于应用程序,我们需要一个精确的位置,然后我们使用GPS提供商 –

+0

再次,从API 23中检查代码中的权限是不够的。用户必须明确同意或拒绝使用某种服务即位置)。 我会在这样的弹出窗口的答案示例中更新。 – Cadet

+0

我要求用户许可!查看我的请求中的更新以了解如何。 –