Aller au contenu

[Résolu] Appli pour Android 1.6, avec des fonctionnalités pour 2.2?


Kricek

Recommended Posts

Coucou tout le monde!

Ma question est la suivante:

Est-il possible de développer une appli qui serait prévue pour Android 1.6 minimum mais qui, selon la version du téléphone, pourrait utiliser des fonctionnalités de l'API 8?

Concrètement, j'ai une base de donnée et je souhaite faire un moteur de recherche.

Mais pour la recherche, plusieurs fonctions seraient dispo: Ecriture, Recherche manuelle dans la liste, Reconnaissance vocale, et autres...

Sauf que la reconnaissance vocale (SpeechRecognizer), par exemple, n'est apparemment dispo que depuis l'API 8. Cela voudrait dire que mon appli est condamnée à ne fonctionner que sur les Android 2.2? Car je pensais, au moment du chargement de mon interface, faire une vérification de la version d'Android installée, et, en fonction du résultat, activer ou non les fonctionnalités disponibles...

Est ce que c'est possible et si oui, de quelle manière?

Merci d'avance...

Edit : En utilisant la classe "RecognizerIntent" disponible depuis l'API 3, je n'ai plus de souci de compatibilité.

Lien vers le commentaire
Partager sur d’autres sites

oui c'est possible grâce à la "reflection" (ou "réflexion")

tu as 2 approches :

- une nouvelle fonction est rajoutée dans une classe existante (ex : le multitouch MotionEvent.getPointerCount() n'est dispo que depuis l'API 5)

- une nouvelle classe est disponible

Le principe est le même :

ne jamais "faire appel à" ni mentionner dans le code "visible" une fonction/classe qui peut ne pas exister

Dans le premier cas, tu fais un truc du genre MaClasse.class.getMethod()

Je te conseille de lire la doc

Dans le deuxième cas, il faut utiliser une classe "wrapper" (je crois)

En gros, tu demandes à charger la classe qui peut "ne pas exister" avec Class.forName()

Si ça passe, ça veut dire que tu peux utiliser une classe qui ferra interface entre ton code et l'autre classe

Lien vers le commentaire
Partager sur d’autres sites

un exemple :

	this.locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);

	String provider = null;

	try
	{
		Field passiveProviderField = LocationManager.class.getField("PASSIVE_PROVIDER");

		Object passiveProviderObject = passiveProviderField.get(null);

		if (passiveProviderField != null && passiveProviderObject instanceof String)
		{
			provider = (String) passiveProviderObject;
		}
	}
	catch (SecurityException e)
	{
		e.printStackTrace();
	}
	catch (NoSuchFieldException e)
	{
		e.printStackTrace();

		provider = LocationManager.NETWORK_PROVIDER;
	}
	catch (IllegalArgumentException e)
	{
		e.printStackTrace();
	}
	catch (IllegalAccessException e)
	{
		e.printStackTrace();
	}

	if (provider == null)
	{
		provider = LocationManager.NETWORK_PROVIDER;
	}

	this.locationManager.requestLocationUpdates(provider, 0, 1, this);

Le provider "passive" n'est dispo que depuis le SDK 8.

Si il n'est pas dispo, alors j'utilise le provider "network" (qui fait plus ou moins la même chose, mais n'utilise pas le GPS)

Tu remarquera que JAMAIS je ne fais directement référence à LocationManager.PASSIVE_PROVIDER

Cet exemple s'applique à la première "approche" que j'ai expliqué : nouvelle méthode/variable disponible

Lien vers le commentaire
Partager sur d’autres sites

Lol je venais de te répondre sur l'autre topic... Tu as été plus rapide que moi... lol...

Et tout d'abord merci du coup de main.

Dans mon cas, je pense que la première partie est celle qui me concerne...

Mais comment ne pas faire appel à une classe inexistante dans le code visible?

Il y a du code "invisible"?

Ca commence à devenir poilu, comme code...

En fait, c'est un projet pour un stage de fin d'étude.

Le souci, c'est qu'il ne me reste qu'un mois pour faire ca...

Le Class.ForName() me parle, je l'ai utilisé en JAVA, avec JDBC... Mais on n'a pas trop eu de détails là dessus...

En gros, avec ca, tu "Forces" ta machine à charger une classe en mémoire?

Lien vers le commentaire
Partager sur d’autres sites

	this.locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);

	String provider = null;

	try
	{


                                               //Je n'ai pas compris ces deux lignes...
		Field passiveProviderField = LocationManager.class.getField("PASSIVE_PROVIDER");
		Object passiveProviderObject = passiveProviderField.get(null);



                                               //... Mais j'imagine qu'ici, tu testes si tu as réussi à initialiser un "passive_provider", c'est ca?
                                               // Et donc, si il est instancié, c'est que la version est ok, sinon, c'est que la version n'est pas bonne...?
		if (passiveProviderField != null && passiveProviderObject instanceof String)
		{
			provider = (String) passiveProviderObject;
		}
	}

...........

Lien vers le commentaire
Partager sur d’autres sites

je te conseille de lire un tuto java sur la réflexion (ou reflection)

Field passiveProviderField = LocationManager.class.getField("PASSIVE_PROVIDER");

permet de récupérer le champ/variable "PASSIVE_PROVIDER" de la classe LocationManager

Object passiveProviderObject = passiveProviderField.get(null);

permet de récupérer la valeur de ce champ

je passe "null", car c'est une variable static

suffit de lire la doc des classes Class, Field et Method :P

Lien vers le commentaire
Partager sur d’autres sites

Alors, en fait, je bosse sur une base de données des additifs alimentaires que j'ai montée.

Mais plusieurs options initialement prévues ne seront finalement pas réalisables...

Donc:

J'ai ma base de données, je voulais faire plusieuurs modes de recherche dans la base:

1) Entrer du texte dans un champs et recherche le texte dans la base

2) Chercher manuellement dans la base en listant TOUS les additifs

3) Dicter le nom ou le code d'un additif puis effectuer la recherche <------------ C'est au sujet de cette fonction...

4) Je pensais aussi à scanner le code barre du produit pour trouver les additifs "potentiellement" présents dans cette famille de produits, mais ca ne sera pas faisable, d'après mes recherches, la famille de produits dans un code EAN13 n'est pas indiquée... On a juste Pays, Entreprise, Code produit (interne à l'entreprise), et contrôle.

5) J'avais même pensé à une fonction OCR: Photographier la liste des ingrédients, récupérer le texte, et rechercher les mots dans la base pour voir s'il sont présents et donc si ce sont des additifs... Mais l'OCR n'est encore pas tout à fait fiable et surtout TRES longue! (Environ 30 secondes pour l'envoi du fichier, en WIFI !!!).

Bref, sur toutes ces fonctions, déjà 2 ont été retirées, je commencais à désespérer...

Bref, il me reste les fonctions 1, 2 et 3... Le souci, c'est que je ne voudrais pas que cette appli ne soit accessible QUE pour les andro 2.2... Mais vu qu'il y a de la reconnaissance vocale...

Edit :Pour les codes barres, j'avais commencé à me renseigner sur ZXing... mais j'ai abandonné, vu que la fonction ne se fera pas...

Edit 2: J'ai déjà commencé à me renseigner sur la classe "SpeechRecognizer"... Mais c'est encore un peu flou pour moi... lol

Lien vers le commentaire
Partager sur d’autres sites

Pour le 3) Tu as déjà une fonction de reconnaissance vocale sur le clavier virtuel du téléphone

au lieu de saisir au clavier dans un champ de texte, ça va écrire ce que tu dis

rien à faire de ce coté là donc...

par contre, je doute que ton téléphone reconnaisse des "codes"

4) en effet c'est ZXing (qui est liée à Barcode Scanner)

Il faut pré installer Barcode Scanner sur le téléphone, et y faire appel via des Intents (mécanisme de dialogue entre applications)

Lien vers le commentaire
Partager sur d’autres sites

Oui, j'ai vu qu'elle était présente directement sur le clavier...

Mais moi, je pensais plus à une fonction du style de Google recherche: Tu cliques sur un bouton, ca t'ouvre une dialogue pendant que tu parles... Un truc un peu plus accessible que le "petit" bouton sur le clavier pas forcément très visible pour un utilisateur lambda... Je voudrais un GROS bouton en plein milieu de l'écran... en gros... lol

Et pour ZXing, je ne pourrais pas le faire, car, à l'aide du code barre, je n'ai apparemment pas les moyens de savoir si le produit est: "Confiserie", "Boulangerie", "Patisserie", etc...

Edit : Et donc pour mon cas, vu que la reconnaissance ne fonctionnait pas en 1.6, je suis obligé de faire appel à Class.ForName()? Ceci dit, c'est assez bizarre car le bouton sur le clavier n'y était pas en 2.1 mais Google Recherche proposait déjà cette fonction, il me semble, non?

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...