Comment puis-je obtenir continu emplacement des mises à jour en android, comme dans Google Maps?
Je suis en train de construire un ami de suivi de l'application android. Alors que mon ami activé l'application et s'en va avec son GPS et cellulaire des données sur, j'ai besoin de trace de lui sur mon appareil. C'est le concept.
J'ai mis en place: LocationListener classe et maintenant je peux obtenir la dernière mise à jour de location de Gps ou Réseau mais n'est pas mis à jour, sauf si je lance Google Maps et retourner à ma demande. Après recherche sur google, j'ai appris que l'emplacement du cache est mis à jour uniquement par GMaps.!
- Est-il une autre façon de mettre à jour en permanence emplacement?
- Que faire si j'ai besoin d'obtenir de l'continue emplacement après l'appareil est verrouillé, sans faire usage de Wakelock?
C'est ma position auditeur classe:
package com.amazinginside;
/** AMAZING LOCATION SUPPORT CLASS, Devoloped By SANGEETH NANDAKUMAR */
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
public class AmazingLocation extends Service implements LocationListener
{
private final Context mContext;
boolean isGPSEnabled = false;
boolean isNetworkEnabled = false;
boolean canGetLocation = false;
Location location;
double latitude=0.0;
double longitude=0.0;
//MINIMUM DISTANCE FOR UPDATE (meters)
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 0; //0 Meters
//MINIMUM TIME BETWEEN UPDATES
private static final long MIN_TIME_BW_UPDATES = 1000 * 0; //0 Seconds
//LOCATION MANAGER
protected LocationManager locationManager;
//CONSTRUCTOR
public AmazingLocation(Context context)
{
this.mContext = context;
getLocation();
}
//LOCATION PROVISION
public Location getLocation()
{
try
{
//GET LOCATION MANAGER
locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE);
//CHECK GPS STATE
isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
//CHECK NETWORK STATE
isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled)
{
//NO LOCATION PROVIDERS
}
else
{
this.canGetLocation = true;
/** GET LOCATION FROM NETWORK */
//FIRST GET LOCATION FROM NETWORK
if (isNetworkEnabled)
{
//REQUEST LOCATION
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null)
{
//START WITH LAST KNOWN LOCATION
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//EXTRACT LOCATION
if (location != null)
{
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
/** GET LOCATION FROM GPS SENSOR */
//THEN GET LOCATION FROM GPS
if (isGPSEnabled)
{
if (location == null)
{
//REQUEST GPS LOCATION
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
if (locationManager != null)
{
//EXTRACT LAST KNOWN LOCATION
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//RETURN LOCATION
if (location != null)
{
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
return location;
}
//STOP GPS SENSOR
public void stopUsingGPS()
{
if(locationManager != null)
{
locationManager.removeUpdates(AmazingLocation.this);
}
}
//EXTRACT LATTITUDE
public double getLatitude()
{
if(location != null)
{
latitude = location.getLatitude();
}
//return latitude
return latitude;
}
//EXTACT LONGITUDE
public double getLongitude()
{
if(location != null)
{
longitude = location.getLongitude();
}
//return longitude
return longitude;
}
//CAN I GET THE LOCATION.?
public AmazingStatus canGetLocation()
{
AmazingStatus status=new AmazingStatus();
if(this.canGetLocation)
{
status.setStatus(true);
status.setErrorcode(0);
status.setErrormsg("Task completed");
}
else
{
status.setStatus(false);
status.setErrorcode(145);
status.setErrormsg("Please turn on GPS access manually");
}
return status;
}
//SHOW LOCATION SETTINGS
public AmazingStatus showSettingsAlert()
{
final AmazingStatus status=new AmazingStatus();
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
alertDialog.setTitle("REQUIRES LOCATION ACCESS");
alertDialog.setMessage("Please allow GPS access to this app");
//POSSITIVE REPLY
alertDialog.setPositiveButton("Allow", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog,int which)
{
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
status.setStatus(true);
status.setErrorcode(0);
status.setErrormsg("Task completed");
}
});
//NEGATIVE REPLY
alertDialog.setNegativeButton("Deny", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int which)
{
status.setStatus(false);
status.setErrorcode(408);
status.setErrormsg("User denied permission");
dialog.cancel();
}
});
//Showing Alert Message
alertDialog.show();
return status;
}
//UNUSED OVERRIDE METHORDS...
@Override
public void onLocationChanged(Location location)
{
getLocation();
}
@Override
public void onProviderDisabled(String provider)
{
}
@Override
public void onProviderEnabled(String provider)
{
getLocation();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
getLocation();
}
@Override
public IBinder onBind(Intent arg0)
{
return null;
}
}
Mon onCreate()
méthode:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//CREATE A BUTTON HANDLER
Button start_btn=(Button)findViewById(R.id.start_location_streaming);
//ON BUTTON CLICK EVENT
start_btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//REPEAT A METHORD AT SPECIFIC INTERVALS
Timer myTimer = new Timer();
myTimer.schedule(new TimerTask()
{
@Override
public void run()
{
TimerMethod();
}
}, 0, 8000);
}
}); }
Ce sont d'autres méthodes:
private void TimerMethod()
{
//START METHORD
this.runOnUiThread(Timer_Tick);
}
//LOCATION REPORTING METHORD
private Runnable Timer_Tick = new Runnable()
{
public void run()
{
Toast.makeText(MainActivity.this, "Current latitude : "+Double.toString(getLocation().latitude), Toast.LENGTH_SHORT).show();
Toast.makeText(MainActivity.this, "Current longitude : "+Double.toString(getLocation().longitude), Toast.LENGTH_SHORT).show();
}
};
private LatLng getLocation()
{
//CREATE A LOCATION CLASS INSTANCE
AmazingLocation gps = new AmazingLocation(this);
//RETRIVE LOCATION
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
//RETURN LOCATION
LatLng loc=new LatLng(latitude,longitude);
return loc;
}
Maintenant, le problème est, le toast montre juste précédemment connu de l'emplacement et de ne pas mettre à jour, à moins que j'ai ouvert Google Maps et retourné.
Toute aide sera très bien pour moi.
Je vous remercie, Monsieur Gabriel. En fait, je suis surpris, parce que de ce code a été pré cassé. Permettez-moi de consulter le lien que vous avez fourni.
Salut Kannan.. Êtes-vous en mesure de résoudre ce problème?
C'est un problème avec mon Google Play Services. Fondue Fournisseur d'Emplacement œuvres
OriginalL'auteur Kannan | 2017-01-06
Vous devez vous connecter pour publier un commentaire.
Utilisation Fusionné fournisseur d'emplacement dans Android définir votre intervalle:
Pour un exemple de créer votre activité de ce genre:
Google play services requis:
Solution de travail, de Nice, de la gestion de l'état. Merci
Cela fonctionne parfaitement. Mais il vous manque mGoogleApiClient.connect();
Ce code ne fonctionne pas pour moi. erreur java.lang.NoClassDefFoundError: Échec de la résolution: l'icom/google/android/gms/common/api/Api$zzc;
OriginalL'auteur Pushpendra
Je crois que plutôt que de réinventer la roue, vous pouvez utiliser l'une des bibliothèques tierces qui sont faciles à mettre en oeuvre et dans ce cas, la batterie efficace. Celui de la bibliothèque que j'ai trouvé est SmartLocation. Vous pouvez ajouter la dépendance suivant dans votre construction.gradle (app) pour commencer à utiliser la bibliothèque.
Après l'ajout de la dépendance, vous devez reconstruire le projet pour obtenir les références.
Titre d'exemple, vous pouvez essayer le code suivant dans votre Activité.
Vous pouvez arrêter de suivi et de localisation dans onStop() méthode
SmartLocation bibliothèque vous donnera plus que ce qui est prévu, juste essayer cette fois.
Remarque: assurez-vous que votre application n'ont ACCESS_FINE_LOCATION et ACCESS_COARSE_LOCATION (les deux) pour avoir des résultats précis. N'oubliez pas de demander l'autorisation au moment de l'exécution pour Android 6.0 et au-dessus.
Certainement. Mais j'en ai besoin pour le faire fonctionner, et puis je vais faire marquer
sa meilleure voie - meilleure méthode - et facile - merci allooooot
OriginalL'auteur Hitesh Pamnani
Vous devez utiliser la version d'android de services, plutôt que l'application elle-même. De cette façon, vous aurez à réaliser pour exécuter le code en permanence en arrière-plan et vous recevrez l'emplacement, même si l'application se ferme.
https://www.tutorialspoint.com/android/android_services.htm
oui. Si l'interface de l'application n'est pas fermée,l': LocationListener doit être en cours d'exécution sans être tué. Je pense qu'il ne met pas à jour parce que vous avez d'activer le gps sur et demandera l'emplacement. Ce que Google Maps n'est qu'il tourne sur le gps et mises à jour de l'emplacement actuel,donc c'est pourquoi vous obtenez emplacement mis à jour lorsque vous ouvrez G. Cartes.
Grâce tec technologys, j'ai essayé avec le GPS et 4G, le service de données à commutation de Sur. J'ai besoin d'un moyen de se débarrasser d'précédemment connu de l'emplacement exact de mise à jour continuelle de pins. Cela se produit uniquement lorsque je lance Google Maps et retourné. Seulement, Google Maps est en mesure de mettre à jour l'emplacement des captures. J'ai besoin de mise à jour dans mon application
J'ai googlé un peu, et j'ai trouvé ceci: developer.android.com/training/location/... . C'est à partir de android site officiel et sais qu'il y a une sorte de mise à jour LastKnownLocation à partir de votre application. S'il vous plaît vérifier, il peut résoudre votre problème.
C'est une bonne initiative ami. Permettez-moi de le vérifier
OriginalL'auteur Technologuy
Cette bibliothèque peut être pratique. Il a tout ce que vous devez faire pour l'emplacement de mise à jour comme demander la permission et réglez l'intervalle de temps.
https://github.com/bikcrum/LocationUpdate
OriginalL'auteur Bikram