2017-09-26 139 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

我要求用戶許可!查看我的請求中的更新以瞭解如何。 –