Précédent   Forum des professionnels en informatique > Environnements de développement > WinDev > Windev Mobile
Windev Mobile Forum d'entraide sur la programmation Windev Mobile (Pocket PC, SmartPhone,...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/09/2011, 14h44   #1
Membre régulier
 
Homme Jean-Jacques MONOT
Responsable des études
Inscription : février 2010
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Jean-Jacques MONOT
Localisation : France

Informations professionnelles :
Activité : Responsable des études
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : février 2010
Messages : 96
Points : 78
Points : 78
Par défaut intégration de OSMDroid dans WM16 Android

Décidément, je suis le seul à publier sur le sujet WM16 & ANDROID ????

Comme vous le savez sans doute, WM16 n'offre qu'une API très limitée (espérons que la version 17 apportera du nouveau de ce côté là .. ).

Donc, après avoir développé une interface native pour le GPS, je me suis attaqué à l'affichage de cartes .... et là aussi, WM16 est très faible, alors que Google propose un addon MapView .... Bon le souci de l'add-on de Google, c'est qu'il faut une connnexion pour avoir les cartes Google Map en OTA (Over The Air).

Mais, il existe une librairie alternative "OSMDroid" (http://code.google.com/p/osmdroid/) qui permet d'avoir un affichage de cartes en utilisant des dalles préalablement chargées avec Mobile Atlas Creator et déposées sur la carte SD.

Pour intégrer OSMDroid dans WM16, il suffit de compiler en utilisant la librairie .jar de OSMDroid et de le spécifier dans WM16 au moment de la compilation.

Pour l'utilisation de OSMDroid, on peut créer une fonction native comme la suivante (exemple donné pour afficher une carte centrée sur 49°N/2°E dans une fenêtre créée dans WM16).

Etapes suivantes :
  1. bien maîtriser OSMDroid
  2. faire une belle moving map en utilisant les appels natifs au GPS

A suivre donc ... je suis preneur de vos expériences également




Code :
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
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;

////////////////////////////////
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
///////////////////////////

/////
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.GpsStatus.*;
import android.location.LocationManager;
import android.content.*;
import java.util.Iterator;

import android.util.Log;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public static void Open_map()
{
	// Variables
	// récupération du contexte
	Context tmpContext     = getContexteApplication();
	
	// variables OSMdroid
	MapController mapController;
	MapView mapView;
	
	// récupération de la view
	ViewGroup myView;
	myView = (ViewGroup) getView ("FEN_carte");
	
	// création d'une carte
	MapView map = new MapView(tmpContext, 256);
	
	// plug de la carte dans la view
	myView.addView(map, new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
	
	// ajout des boutons
	map.setBuiltInZoomControls(true);
	map.setMultiTouchControls(true);
	map.getController().setZoom(10);
	map.getController().setCenter(new GeoPoint(49000000, 2000000));
	
}
courdi95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 16h26   #2
Membre régulier
 
Homme Jean-Jacques MONOT
Responsable des études
Inscription : février 2010
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Jean-Jacques MONOT
Localisation : France

Informations professionnelles :
Activité : Responsable des études
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : février 2010
Messages : 96
Points : 78
Points : 78
PCSOFT vient d'annoncer la possibilité d'avoir un champ map en version 17 pour Android ...

Reste à savoir si on pourra afficher autre chose que des cartes Google. En attendant, c'est une demande que je viens de leur faire.
courdi95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/10/2011, 09h31   #3
Membre habitué
 
Homme Yannick M
Étudiant
Inscription : janvier 2010
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yannick M
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2010
Messages : 114
Points : 104
Points : 104
Hello !

Non, vous n'êtes pas seul à développer sur Android via WM je vous rassure ! Toutefois, vous posez des questions très précises sur des sujets qui n'ont peut-être pas été abordés étant donné les possibilités de WM 16 concernant Android.

Je lis à chaque fois avec attention vos posts, car ne sait-on jamais, ce sont des connaissances qui peuvent être utiles un jour.

Salutations
lazariel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2011, 17h53   #4
Membre régulier
 
Homme Jean-Jacques MONOT
Responsable des études
Inscription : février 2010
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Jean-Jacques MONOT
Localisation : France

Informations professionnelles :
Activité : Responsable des études
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : février 2010
Messages : 96
Points : 78
Points : 78
Je continue mes contributions .....

Aujourd'hui : comment ajouter un marqueur ?

C'est ici :

Code :
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
///////////////////////////
// app
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.content.*;
import java.util.Iterator;

////////////////////////////////
// osmdroid
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;

import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.ItemizedOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.util.constants.MapViewConstants;


///////////////////////////
// view
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;


///////////////////////////
// location
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.GpsStatus.*;
import android.location.LocationManager;

///////////////////////////
// widget
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

///////////////////////////
// ouverture de la carte
//////////////////////////
public static void Open_map()
{
	// Variables
	// récupération du contexte
	Context tmpContext     = getContexteApplication();
	
	// variables OSMdroid
	MapController mapController;
	
	// récupération de la view dans la fenêtre
	myViewGroup = (ViewGroup) getView ("FEN_carte");
	
	// création d'une carte
	myMapView = new MapView(tmpContext, 256);
	
	// plug de la carte dans la view
	myViewGroup.addView(myMapView, new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
	
	// ajout des boutons
	myMapView.setBuiltInZoomControls(true);
	myMapView.setMultiTouchControls(true);
	
	// ajout d'un controleur pour la carte
	mapController = myMapView.getController();
	mapController.setZoom(10);
	
	// création de Géopoints
	GeoPoint point2 = new GeoPoint(49000000, 2000000); // centre map here
	GeoPoint point3 = new GeoPoint(49000000+500, 2000000+500); // icon goes here
	
	// centrage de la carte
	mapController.setCenter(point2);
	
	// définition du proxy pour les ressources
	//mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
	mResourceProxy = new DefaultResourceProxyImpl(getContexteApplication());
	
	// création du tableau d'items overlay
	ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
	
	// ajout d'un item sur le Geopoint
	items.add(new OverlayItem("Here", "SampleDescription", point3));
	
	// création de l'overlay avec les items créés
	/* OnTapListener for the Markers, shows a simple Toast. */
	mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
			new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
					@Override
					public boolean onItemSingleTapUp(final int index,
					final OverlayItem item) {
							Toast.makeText(
							getActiviteEnCours(),
							"Item '" + item.mTitle, Toast.LENGTH_LONG).show();
							return true; // We 'handled' this event.
						}
					@Override
					public boolean onItemLongPress(final int index,
					final OverlayItem item) {
							Toast.makeText(
							getActiviteEnCours(), 
							"Item '" + item.mTitle ,Toast.LENGTH_LONG).show();
							return false;
						}
				}, mResourceProxy);
	
	// ajout de l'overlay à la carte	
	myMapView.getOverlays().add(mMyLocationOverlay);
}

// définition des variables en static en dehors de la procédure pour les rendre accessibles
static ItemizedOverlay<OverlayItem> mMyLocationOverlay;
static MapView myMapView;
static ViewGroup myViewGroup;
static ResourceProxy mResourceProxy;
courdi95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 11h28   #5
Membre habitué
 
Homme Yannick M
Étudiant
Inscription : janvier 2010
Messages : 114
Détails du profil
Informations personnelles :
Nom : Homme Yannick M
Localisation : Suisse

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2010
Messages : 114
Points : 104
Points : 104
Bonjour courdi95,

je vois que vous codez en Java en "natif" à l'interne de vos applications Android. Dans le cadre de développements futurs, j'aurai besoin de savoir quels sont les prérequis concernant les méthodes développées pour accéder à leurs éléments.

Dans l'exemple que vous soumettez ci-dessus, vous déclarez des méthodes statiques (et donc indépendantes à la classe) ainsi que des attributs eux-même statiques.

Ne peut-on pas simplement les déclarer Public en partant du principe que la méthode Java écrite dans WM créera un objet indépendant?

Meilleures salutations
lazariel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 17h10   #6
Membre régulier
 
Homme Jean-Jacques MONOT
Responsable des études
Inscription : février 2010
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Jean-Jacques MONOT
Localisation : France

Informations professionnelles :
Activité : Responsable des études
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : février 2010
Messages : 96
Points : 78
Points : 78
Citation:
Envoyé par lazariel Voir le message

Dans l'exemple que vous soumettez ci-dessus, vous déclarez des méthodes statiques (et donc indépendantes à la classe) ainsi que des attributs eux-même statiques.

Ne peut-on pas simplement les déclarer Public en partant du principe que la méthode Java écrite dans WM créera un objet indépendant?
Je n'ai pas essayé .... je vais le faire ....
courdi95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 17h15   #7
Membre régulier
 
Homme Jean-Jacques MONOT
Responsable des études
Inscription : février 2010
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Jean-Jacques MONOT
Localisation : France

Informations professionnelles :
Activité : Responsable des études
Secteur : High Tech - Électronique et micro-électronique

Informations forums :
Inscription : février 2010
Messages : 96
Points : 78
Points : 78
Et je continue mon exploration de OSMDroid ...

Aujourd'hui, j'utilise le GPS (le vrai ! pas simplement le LocationManager, que je force en GPS pur), pour centrer la carte....

Petites subtilités :
- création d'un FI (fenêtre interne) pour la carte, cela permet de garder un environnement de dialogue WM autour
- mise en place de LIB pour afficher un log et lat/lon

Le code est ici :

Code :
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196

///////////////////////////
// app
import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.content.*;
import java.util.Iterator;



////////////////////////////////
// osmdroid
import org.osmdroid.tileprovider.tilesource.TileSourceFactory;
import org.osmdroid.util.GeoPoint;

import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.ItemizedOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import org.osmdroid.views.util.constants.MapViewConstants;


///////////////////////////
// view
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;


///////////////////////////
// location
import android.location.GpsSatellite;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.GpsStatus.*;
import android.location.LocationManager;

///////////////////////////
// widget
import android.util.Log;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

///////////////////////////
// ouverture de la carte
//////////////////////////
public static void Open_map()
{
	// Variables
	// récupération du contexte
	Context tmpContext     = getContexteApplication();
		
	// récupération de la view dans la fenêtre
	FEN_carte = (ViewGroup) getView ("FEN_carte");
	myViewGroup = (ViewGroup) getView ("FI_map");
	
	myLogText = (TextView) getView ("LIB_log");
	myLogText.setText("lancement appli");

	SAI_longitude = (TextView) getView ("LIB_longitude");
	SAI_latitude = (TextView) getView ("LIB_latitude");
	
	// création d'une carte
	myMapView = new MapView(tmpContext, 256);
	
	// plug de la carte dans la view
	myViewGroup.addView(myMapView, new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
	//myView.addView(myMapView, new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
	
	// ajout des boutons
	myMapView.setBuiltInZoomControls(true);
	myMapView.setMultiTouchControls(true);
	
	// ajout d'un controleur pour la carte
	mapController = myMapView.getController();
	mapController.setZoom(10);
	
	// création de Géopoints
	GeoPoint centre_init = new GeoPoint(49000000, 2000000); // icon goes here
	
	// centrage de la carte
	mapController.setCenter(centre_init);
	
	// définition du proxy pour les ressources
	//mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
	mResourceProxy = new DefaultResourceProxyImpl(getContexteApplication());
	
	// création du tableau d'items overlay
	ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
	
	// ajout d'items
	items.add(new OverlayItem("49°N 2°E", "Foret de l'Hautil", centre_init));
	
	// création de l'overlay avec les items créés
	/* OnTapListener for the Markers, shows a simple Toast. */
	mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
			new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
					@Override
					public boolean onItemSingleTapUp(final int index,
					final OverlayItem item) {
							Toast.makeText(
							getActiviteEnCours(),
							"POI '" + item.mTitle, Toast.LENGTH_LONG).show();
							return true; // We 'handled' this event.
						}
					@Override
					public boolean onItemLongPress(final int index,
					final OverlayItem item) {
							Toast.makeText(
							getActiviteEnCours(), 
							"POI '" + item.mTitle ,Toast.LENGTH_LONG).show();
							return false;
						}
				}, mResourceProxy);
	
	// ajout de l'overlay à la carte	
	myMapView.getOverlays().add(mMyLocationOverlay);
	
	////////////////////////////////////
	// Récupération du contexte et du location manager
	Context myContext     = getContexteApplication();
	LocationManager mylocationManager = (LocationManager) myContext.getSystemService(Context.LOCATION_SERVICE);	
	
	//////////////////////////////////////////
	// Define a listener that responds to location updates
	LocationListener mylocationListener = new LocationListener() {
		
		public void onLocationChanged(Location location) {
			// Called when a new location is found by the network location provider.
			myLogText.setText("onLocationChanged");
			
			int lat = (int) (location.getLatitude() * 1E6);
			int lng = (int) (location.getLongitude() * 1E6);
			
			SAI_longitude.setText(String.valueOf(location.getLongitude()));
			SAI_latitude.setText(String.valueOf(location.getLatitude()));
			
			GeoPoint gpt = new GeoPoint(lat, lng);
			mapController.setCenter(gpt);

		}
		
		public void onStatusChanged(String provider, int status, Bundle extras) {
				myLogText.setText("onStatusChanged");
		}
		
		public void onProviderEnabled(String provider) {
			myLogText.setText("onProviderEnabled");
		}
		
		public void onProviderDisabled(String provider) {
			myLogText.setText("onProviderDisabled");
		}
		
	};
	//////////////////////////////////////
	
	///////////////////////////////////////
	// Define a listener that responds to GPS STATUS
	GpsStatus.Listener mygpsStatusListener = new GpsStatus.Listener() {
		
		public void onGpsStatusChanged(int event){
			myLogText.setText("onGpsStatusChanged");	
			
		}
		
	};
	
	///////////////////////////////////////
	
	// Register the listener with the Location Manager to receive location updates
	// on force GPS
	mylocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mylocationListener);
	mylocationManager.addGpsStatusListener(mygpsStatusListener);
	
	
}

// définition des variables en static en dehors de la procédure pour les rendre accessibles
static ItemizedOverlay<OverlayItem> mMyLocationOverlay;
static MapView myMapView;
static ViewGroup myViewGroup;
static ViewGroup FEN_carte;
static View myView;
static ResourceProxy mResourceProxy;
static MapController mapController;
static TextView myLogText;
static TextView SAI_longitude;
static TextView SAI_latitude;
courdi95 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h53.


 
 
 
 
Partenaires

Hébergement Web