J'écris un code qui indique l'emplacement actuel, mais il ne me donne pas l'emplacement car il n'appelle jamais onLocationChanged()
. Y a-t-il un moyen de le localiser?.
mobileLocation arrive à 0 dans ce cas, donc l'exécution passe au bloc else.
Mon code est
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();
}
}
}
N'obtenez-vous jamais un emplacement ou seulement lorsque vous écrivez dans votre commentaire "parfois, il obtient un emplacement mais pas au moment du clic"?
Votre code est peut-être plus rapide que LocationManager, qui n'a peut-être pas encore appelé onLocationChanged (). Changez votre code pour obtenir le dernier emplacement connu ou attendez que votre locListener ait été appelé:
locManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER, 1000, 1, locListener);
mobileLocation = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (mobileLocation != null) {
je lance mon application sur un appareil réel . J'utilise le réseau au lieu du GPS et onLocationChanged est appelé
locMan.requestSingleUpdate(LocationManager.NETWORK_PROVIDER, this, null);
Je pense que tu as oublié la permission
<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" />
OR
Déclarer la classe appropriée comme
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();
}
}
Manifeste:
<service Android:name=".services.AndroidLocationServices"/>
Démarrer le service avant utilisation:
startService(new Intent(this, AndroidLocationServices.class));
Directement après locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locListener)
, ajoutez le code suivant:
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1, locListener);
EDIT: corrigé le code grâce au commentaire de @Fabian Streitel.
Dans mon cas, l'application ne demandait pas d'autorisations. Bien que j'ai ajouté les autorisations dans le fichier de manifeste. Je n'ai donc pas pu autoriser mon application à accéder à l'emplacement.
Pour résoudre ce problème, je suis allé manuellement à: Settings->Permissions->Your location
et j'ai activé l'autorisation de localisation pour mon application en cours de développement. Et cela a résolu mon problème.
Je suppose que ce problème survient uniquement lorsque l'application est installée via Android Studio. J'espère que cela ne se produira pas lorsque l'application sera installée à partir de Google Play.