Bonjour à tous,
Je suis débutant en programmation Android et j'ai un exercice d'un professeur avec la correction sauf que le code de la correction ne marche pas sur mon IDE Android Studio, le professeur n'utilise pas Android Studio alors il ne sait pas qu'est ce qui provoque le problème. J'utilise cet exercice car je dois rendre un projet d'application complète et j'aurais aimé utilisé cette localisation mais comme ça ne marche pas, je viens vers vous car sur le net je ne trouve que des vieux codes qui produisent le même type d'erreur (sûrement un problème de version du SDK minimum ou de version de compilation).
Visiblement j'ai démarré mon projet avec un SDK minimum en 4.3 (API 18) mais lorsque je compile ça compilerait avec la version 7.0, et même si je recrée un projet ça ne me demande pas la version du compilateur, du coup j'ai installé le pack pour compiler en version 4.4 et lorsque je change la classe R disparait et du coup plein d'erreurs se produisent. Donc j'ai voulu supprimer la version 7.0 mais la erreur interne de l'IDE alors je n'y touche pas non plus.
Le but de l'exercice étant que lorsque nous cliquons sur un bouton "Position", la position de l'utilisateur s'affiche dans un Toast.
(D'ailleurs j'aimerais faire afficher l'adresse exacte plutôt que seulement la position dans un EditText, mais on pourra voir cela plus tard).
Je vais poster le code du professeur avec les commentaires sur le site mais si on résout le problème je le supprimerais car si le professeur tombe dessus ça fait mauvais genre vous croyez pas?
Code Java :
layout.xml:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136 import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.util.List; /* * L'activité OuSuiJE permet de mettre en uvre le service de localisation * d'android. */ public class ActiviteOuSuisJe extends Activity { /* * On garde une référence vers le LocationManager et vers le listener qui sera à * l'écoute des changements de localisation. */ private LocationManager lm; private LocationListener ll; /* * Nous gardons aussi une référence vers le bouton de notre interface pour * contrôler son état d'activation. */ private Button btn; @Override public void onCreate(final Bundle b){ super.onCreate(b); this.setContentView(R.layout.ex3_main); /* * On récupère une référence vers le bouton de notre interface. */ this.btn = (Button)this.findViewById(R.id.ex3_main_btn); /* * On récupère une référence vers le LocationManager grace à «l'appel système * android» getSystemService(). */ this.lm = (LocationManager)this.getSystemService(LOCATION_SERVICE); /* * On définit ensuite un objet de type LocationListener en implantant ses 4 * méthodes */ this.ll = new LocationListener() { /* * En fait, seule la première méthode nous intéresse dans cet exemple. */ @Override public void onLocationChanged(final Location loc) { /* * Cette méthode récupère la Localisation et on la passe à une méthode * utilisataire privée. Pour la traiter. */ analyseLocation(loc); /* * On en profite pour réactiver le bouton puisqu'une position a été trouvée. */ btn.setEnabled(true); } @Override public void onStatusChanged(String arg0, int arg1, Bundle arg2){} @Override public void onProviderEnabled(String arg0){} @Override public void onProviderDisabled(String arg0){} }; } /* * Cette méthode utilitaire prend en paramètre un objet Location. À partir de * cet objet Location on crée une URI geo qui identifiera la donnée d'un Intent * implicite portant l'action VIEW. Cet intent sera utilisé pour démarrer une * activité de capable d'afficher la position géographique. * Comme les applications de cratographie sous Android ne sont pas standard, un * téléphone peut très bien ne pas avoir une telle application et dans ce cas * startActity() lèvera une Exception, pour éviter cela on utilise le * PackageManager. */ private void analyseLocation(final Location l){ Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:" +l.getLatitude()+","+l.getLongitude())); /* * Il n'y a pas en standard dans l'environnement Android d'application * de visualisation cartographique. L'application Google Maps que l'on * retrouve installé sur la plupart des telephone Android est la * propriete de Google et donc n'existe pas en standard sur le * simulateur. Il est donc recommande de verifier la presence d'une * activite cartographique avant de faire le startActivity pour eviter * une exception. */ PackageManager packageManager = getPackageManager(); List<ResolveInfo> activities = packageManager.queryIntentActivities(i, 0); if(activities.size() > 0){ this.startActivity(i); } } /* * La méthode ouSuisJe est appélée par le UIThread chaque foid que l'utilisateur * clique sur le bouton de notre interface graphique. (attribut onClick dans le * fichier XML). */ public void ouSuisJe(final View v){ /* * On commence par interroger le LocationManager pour voir si une position est * déjà connue, grace à la méthode gegetLastKnownLocation(). Comme on ne demande * pas une information nouvelle, nous allons utiliser le PASSIVE_PROVIDER pour * récupérer notre info. */ final Location l = this.lm.getLastKnownLocation( LocationManager.PASSIVE_PROVIDER); /* * Si l'information n'existe pas ou qu'elle a plus d'une heure, on en redemande * une plus fraiche au système. */ if(null == l || (System.currentTimeMillis()-l.getTime() > 3600e3)){ Toast.makeText(this, "On demande une nouvelle info ("+l , Toast.LENGTH_LONG).show(); v.setEnabled(false); /* * On enregistre le listener pour une acquisition de position en s'appuyant sur * le GPS. */ this.lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, ll, null); } else{ Toast.makeText(this, "uses last known location", Toast.LENGTH_LONG).show(); this.analyseLocation(l); } } }
string.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Position" android:hint="Position :" android:onClick="ouSuisJe" android:id="@+id/ex3_main_btn" /> </LinearLayout>
AndroidManifest.xml:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <resources> <string name="app_name">ED6</string> <string name="ousuisje_name">Où suis je ?</string> </resources>
Je vais préciser les lignes qui posent problème dans le code Java dans la méthode ouSuisJe() :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="fr.ed7" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <application android:label="@string/app_name" > <activity android:name="ActiviteOuSuisJe" android:label="@string/ousuisje_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Et:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 final Location l = this.lm.getLastKnownLocation( LocationManager.PASSIVE_PROVIDER);
Ces lignes ont le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 this.lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, ll, null);
Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException`
This inspection looks at Android API calls that have been annotated with various support annotations (such as RequiresPermission or UiThread) and flags any calls that are not using the API correctly as specified by the annotations.
Examples of errors flagged by this inspection:
Passing the wrong type of resource integer (such as R.string) to an API that expects a different type (such as R.dimen).
Forgetting to invoke the overridden method (via super) in methods that require it
Calling a method that requires a permission without having declared that permission in the manifest
Passing a resource color reference to a method which expects an RGB integer value.
J'ai déjà fait les permissions alors je ne comprends pas bien, j'ai saisie que dans la version 7.0 il faut ajouter quelque chose, mais j'aimerais bien que ça fonctionne et malgré plusieurs recherches sur Internet avec des tutoriels et tout rien ne m'éclaire car ce sont des vieux tutos qui utilisent de vieilles versions, comment faites-vous aujourd'hui?
Merci à tous pour vos réponses, en vous en remerciant par avance.
Pikkoro359
Partager