onLocationChanged () никогда не вызывался

Я пишу код, который приносит текущее местоположение, но он не дает мне местоположение, потому что он никогда не вызывает onLocationChanged() .Есть ли способ найти место.

mobileLocation приходит 0 для этого случая, поэтому выполнение переходит в блок else.

мой код

public class FindLocation {
private LocationManager locManager;
private LocationListener locListener;
private Location mobileLocation;
private String provider;

public FindLocation(Context ctx){
    locManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
    locListener = new LocationListener() {
        @Override
        public void onStatusChanged(String provider, int status,
                Bundle extras) {
        }
        @Override
        public void onProviderEnabled(String provider) {
        }
        @Override
        public void onProviderDisabled(String provider) {
        }
        @Override
        public void onLocationChanged(Location location) {
            System.out.println("mobile location is in listener="+location);
            mobileLocation = location;
        }
    };
    locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener);              
    if (mobileLocation != null) {
        locManager.removeUpdates(locListener); 
        String londitude = "Londitude: " + mobileLocation.getLongitude();
        String latitude = "Latitude: " + mobileLocation.getLatitude();
        String altitiude = "Altitiude: " + mobileLocation.getAltitude();
        String accuracy = "Accuracy: " + mobileLocation.getAccuracy();
        String time = "Time: " + mobileLocation.getTime();
        Toast.makeText(ctx, "Latitude is = "+latitude +"Longitude is ="+londitude, Toast.LENGTH_LONG).show();
    } else {
        System.out.println("in find location 4");
        Toast.makeText(ctx, "Sorry location is not determined", Toast.LENGTH_LONG).show();
    }
}
   }

6 ответов


вы никогда не получаете местоположение или только как вы пишете в своем комментарии " иногда он получает местоположение, но не во время щелчка."?

возможно, ваш код быстрее, чем LocationManager, который еще не вызвал onLocationChanged(). Измените код, чтобы получить последнее известное местоположение, или дождитесь вызова locListener:

locManager.requestLocationUpdates(
  LocationManager.GPS_PROVIDER, 1000, 1, locListener);
mobileLocation = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (mobileLocation != null) {

Я запускаю мое приложение на реальном устройстве . я использую сеть вместо GPS и onLocationChanged называется:

locMan.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, this, null);

Я вещь, которую вы забыли разрешение

<uses-permission android:name="android.permission.ACCESS_GPS" />
        <uses-permission android:name="android.permission.ACCESS_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.INTERNET" />

или

объявить правильный класс, как

public class MyLocationListener implements LocationListener {
@Override
  public void onLocationChanged(Location arg0) {
    latitude = arg0.getLatitude();
    longitude = arg0.getLongitude();
  }

}

import android.app.ActivityManager;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.media.AudioManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.IBinder;
import android.os.PowerManager;
import android.util.Log;

import org.json.JSONObject;

import java.util.List;


public class AndroidLocationServices  extends Service {

    PowerManager.WakeLock wakeLock;
    String MODULE="AndroidLocationServices",TAG="";
    private LocationManager locationManager;
    double getLattitude=0,getLogitude=0;
    private static final long MIN_TIME_BW_UPDATES = 1; // 1 minute
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0;


    public AndroidLocationServices() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        preferences=getSharedPreferences(GlobalConfig.PREF_NAME, MODE_PRIVATE);
        PowerManager pm = (PowerManager) getSystemService(this.POWER_SERVICE);

        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DoNotSleep");

        // Toast.makeText(getApplicationContext(), "Service Created",
        // Toast.LENGTH_SHORT).show();

        Log.e("Google", "Service Created");

    }

    @Override
    @Deprecated
    public void onStart(Intent intent, int startId) {
        // TODO Auto-generated method stub
        super.onStart(intent, startId);

        Log.e("Google", "Service Started");

        locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

        //locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2500, 0, listener);
        locationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER,  MIN_TIME_BW_UPDATES,  MIN_DISTANCE_CHANGE_FOR_UPDATES, listener);


    }



    public LocationListener listener = new LocationListener() {

        @Override
        public void onLocationChanged(Location location) {
            // TODO Auto-generated method stub

            Log.e("Google", "Location Changed");
            location.setAccuracy(100);

            if (location == null)
                return;
                    getLattitude=location.getLatitude();
                    getLogitude=location.getLongitude();

                    Log.e("latitude", getLattitude + "");
                    Log.e("longitude", getLogitude + "");


        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }
    };

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();

//        wakeLock.release();

    }


}

Манифест:

  <service android:name=".services.AndroidLocationServices"/>

запустить службу перед использованием:

 startService(new Intent(this, AndroidLocationServices.class));

сразу после locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener) добавьте следующий код:

locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, locListener);

EDIT: исправлен код благодаря комментарию @Fabian Streitel.


в моем случае приложение не просит разрешения. Хотя я добавил разрешения в menifest файл. Поэтому я не смог разрешить своему приложению доступ к местоположению.

в качестве исправления я вручную пошел в: Settings->Permissions->Your location и включил разрешение местоположения для моего приложения в стадии разработки. И это решило мою проблему.

Я предполагаю, что эта проблема возникает только тогда, когда приложение установлено через Android Studio. Я надеюсь, что это не произойдет, когда приложение будет установлено из Google Играть.