2016-08-03 2 views
3

Я пытаюсь получить текущее местоположение устройства, используя метод LocationListener в Android. В некоторых телефонах это не работает или onlocationchanged не вызывается. Как мне найти место в таких случаях? В OnCreate:onlocationchanged не вызывается в Android

mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10, 0, this); 
mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); 

и это

@Override 
    public void onLocationChanged(Location location) { 

     latitude = location.getLatitude(); 
     longitude = location.getLongitude(); 
     Log.e("TAG","lat and long "+latitude+" "+longitude); 
} 

    @Override 
    public void onStatusChanged(String s, int i, Bundle bundle) { 

    } 

    @Override 
    public void onProviderEnabled(String s) { 

    } 

    @Override 
    public void onProviderDisabled(String s) { 

    } 

Но onLocationChanged не вызывается в версиях ниже Зефир

+0

Можете ли вы показать, как вы вызываете обновления местоположения? –

+0

@PabloBaxter Я обновил код –

+0

И это на всех телефонах ниже Marshmallow, или только один? –

ответ

2

использовать этот код работал во всех устройствах и испытываться:

private void getCurrentLocation() { 
//  Log.e("getLocation","Called"); 

     LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
     LocationListener locationListener = new LocationListener() { 
      @Override 
      public void onLocationChanged(Location location) { 
       mlat = location.getLatitude(); 
       mlon = location.getLongitude(); 
     String mLogn = Double.toString(mlon); 
       String mLatd = Double.toString(mlat); 
//    Log.e("mLogn",""+mLogn); 
//    Log.e("mLatd",""+mLatd); 
       mLogn=mLogn.trim(); 
       mLatd=mLatd.trim(); 
       if (mLatd==null || mLogn==null) { 
        if (mLatd.isEmpty()) { 
         mLatd = "No data found"; 
        } 
        if (mLogn.isEmpty()) { 
         mLogn = "No data found"; 
        } 
       } 

       // Log.e("Location",""+mlon+" "+mlat); 
//    Toast.makeText(CampaignTrain.this, "your location is " + mLogn + " " + mLatd, Toast.LENGTH_SHORT).show(); 

      } 

      @Override 
      public void onStatusChanged(String s, int i, Bundle bundle) { 

      } 

      @Override 
      public void onProviderEnabled(String s) { 

      } 

      @Override 
      public void onProviderDisabled(String s) { 

      } 
     }; 
     String locationProvide = LocationManager.NETWORK_PROVIDER; 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},COARSE_LOCATION_REQUEST_CODE); 
       return; 
      } 


     } 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){ 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},FINE_LOCATION_REQUEST_CODE); 
       return; 
      } 

     } 
     locationManager.requestLocationUpdates(locationProvide, 0, 0, locationListener); 
     Location lastLocation=locationManager.getLastKnownLocation(locationProvide); 


    } 

и установите разрешение во время выполнения:

int FINE_LOCATION_REQUEST_CODE=101; 
int COARSE_LOCATION_REQUEST_CODE=102; 

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
      switch (requestCode) 
      { 

       case COARSE_LOCATION_REQUEST_CODE: 
       { 
        if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED) 
        { 

        } 
        else 
        { 
         mLatd="User denied location"; 
         mLogn="User denied location"; 
        } 
        return; 
       } 
       case FINE_LOCATION_REQUEST_CODE: 
       { 
        if (grantResults.length>0 && grantResults[0]==PackageManager.PERMISSION_GRANTED) 
        { 

        } 
        else 
        { 
         mLatd="User denied location"; 
         mLogn="User denied location"; 
        } 
        return; 
       } 
      } 
     } 
+0

Спасибо. Позвольте мне попробовать –

+0

Он возвращает местоположение, но onlocationchanged дает мне мое прежнее местоположение. Мне нужно мое текущее местоположение. –

+0

LocationManager locationManager = (LocationManager) this.getSystemService (Context.LOCATION_SERVICE) добавляет эту строку ниже locationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, this); – Manish

Смежные вопросы