L'accès LocationManager/: LocationListener de la classe
Je suis un peu perdu ici: Dans mon activité principale, je m'inscrire à un LocationManager et le connecter à un: LocationListener à utiliser myLocation.getLatitude() et autres.
Maintenant, j'ai besoin d'utiliser les méthodes d'une autre classe.
Je ne peux pas utiliser ces objets d'une autre classe parce que je ne peux pas intantiate l'activité principale.
Je ne peux pas utiliser les méthodes de lecture pour passer le L. Manager ou L. Écouteur autour, car celles-ci sont non - statique de nouveau.
Donc, en général, comment puis-je accéder à des objets que j'ai créé dans l'activité principale?
Tous les conseils sur la façon d'organiser ce mieux? Est le: LocationListener classe au sein de l'activité principale de classe une chose stupide à faire en général?
public class URNavActivity extends Activity
{
public LocationManager mlocManager;
public LocationListener mlocListener;
...
}
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
actVar=this;
initGraph();
setMap();
gpsEnable();
initMyLocation();
getItems();
initOverlay();
}
public void gpsEnable ()
{
mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mlocListener = new MyLocationListener();
mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
}
public class MyLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location loc)
{
loc.getLatitude();
loc.getLongitude();
myMap.getController().setCenter(new GeoPoint(lati, longi));
}
OriginalL'auteur asco | 2011-10-13
Vous devez vous connecter pour publier un commentaire.
D'abord et avant tout votre: LocationListener ne devrait pas faire partie d'une activité. Les activités ont un cycle de vie et peuvent venir à l'être, et être détruit, par l'Androïde cadre sur une base comme-nécessaire. Par conséquent, les variables d'instance de votre Activité devra être ré-initialisées dans votre activité est onResume() la méthode, les rendant totalement inadaptés pour le stockage à long terme.
. Commencez par créer un collant service pour gérer le démarrage et l'arrêt de l'emplacement des mises à jour. Être collante signifie que l'instance de service se bloque entre les invocations et, par conséquent, vous pouvez utiliser correctement les variables d'instance et de savoir qu'ils conservent leurs valeurs jusqu'à ce que le service est terminé. Ce service devrait également mettre en œuvre l': LocationListener interface, et maintenant, il peut stocker l'Emplacement notifié lors de l'onLocationChanged est invoquée:
Vous avez maintenant un service, vous pouvez démarrer et arrêter l'emplacement des mises à jour que vous en avez besoin. Cela vous permet également de continuer à recevoir et à traiter des modifications de l'emplacement même lorsque votre application est en arrière-plan, si c'est ce que vous voulez.
Vous avez maintenant deux choix sur la façon de faire que des informations de Localisation disponibles: Utiliser le contexte.sendBroadcast() pour propager le nouvel Emplacement (par exemple) à une activité, ou d'utiliser le service d'approche pour permettre à d'autres classes d'invoquer l'exposé de l'API et d'obtenir la position. Voir http://developer.android.com/guide/topics/fundamentals/bound-services.html pour plus de détails sur la création d'une borne de service.
Noter qu'il y a beaucoup d'autres aspects à l'écoute pour l'emplacement des mises à jour que je n'ai pas inclus ici, par souci de clarté.
La première de beaucoup d'autres réponses ici sur stackoverflow, ce qui fonctionne! J'ai manqué ` implémente: LocationListener " dans mon code. J'ai créé un auditeur à l'intérieur du service et eu de problème pour arrêter cela. PS: vous pouvez utiliser
onDestroy() { locationManager.removeUpdates(this); locationManager = null; stopSelf(); super.onDestroy(); }
pour arrêter le gestionnaire.Merci beaucoup! Mais comment vérifier pour l'exécution des autorisations ici?
Le manifeste.la permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(ce qui se Manifeste.la permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, "Permission non accordée", Toast.LENGTH_SHORT).show(); return START_STICKY; }
OriginalL'auteur Phil
Je voudrais proposer deux élégantes manières d'accéder à votre objet à partir de n'importe où:
utilisation ProjectApp classe. Cette classe peut être consulté à partir de toute activité en appelant simplement getApplication().
ProjectApp app = (ProjectApp)getApplication();
J'ai utilisé une combinaison des deux:
Vous pouvez voir que GlobalData est un singleton classe qui implémente LocationResult de l'interface, ce qui signifie qu'il va envoyer la mise à jour de l'emplacement de cet objet.
Quand j'en ai besoin pour obtenir la mise à jour de l'emplacement, je le prends GlobalData.
Ici est MyLocation implémentation de la classe (j'ai utilisé un code de ici et apporté quelques modifications:
OriginalL'auteur Asaf Pinhassi
Je vais vous parler en général, puisque j'ai eu le même problème:
Comment gérer l': LocationListener et éclairé cet écouteur pour accéder à l'activité ..
C'était ma essayer :
De L'Auditeur :
init l'auditeur dans le MainActivity comme ceci :
Je ne sais pas si ça aide ? mais c'était ma solution ...
OriginalL'auteur Abdullah