[J2ME] Utilisation appareil photo du mobile

Fermé
calaglin2 Messages postés 44 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 21 septembre 2009 - 27 janv. 2009 à 22:23
 Candycash31 - 7 août 2010 à 01:12
Bonjour,
Je vous explique mon problème : je dois développer sur téléphone portable un midlet permettant de décrypter les QRcodes.

Actuellement j'en suis à l'étape de la prise de controle de la caméra de mon mobile et j'ai réussi à trouver un code sur le net que j'ai modifié un peu.
J'arrive à en faire un .jar et .jad puis à l'installer sur mon mobile ( un samsung player addict ) mais le problème vient à l'exécution quand mon mobile me sort une exception : "Java a détecté une exception. L'application va se fermer" sans autre précision.

Dans ce midlet je n'utilise que JSR-135 ( que possède mon portable ) donc je ne comprends pas l'erreur et surtout je ne vois pas comment je peux adapter le code à mon mobile.

voici mon code en deux classes :

QRMidlet.java


import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.rms.*;

public class QRMidlet extends MIDlet implements CommandListener {

private Display display;
private Form resultForm;
private Form waitForm;
private Form settingsForm;
private Command exitCommand;
private Command cameraCommand;
private Command cancelCommand;
private Command captureCommand;
private Command callCommand;
private Command openCommand;
private Command smsCommand;
private Command settingsCommand;
private Command saveSettingsCommand;
private StringItem resultStringItem;
private ChoiceGroup resolutionChoiceGroup;
private Gauge waitGauge;
private Player player;
private VideoControl videoControl;
private Canvas canvas;

private int captureProfile = 0;

private RecordStore db = null;

private boolean started = false;

private String midletName = "QRMidlet";

public QRMidlet() {

}

public void startApp() {

if (started == false) {
started = true;

display = Display.getDisplay(this);

loadSettings();


exitCommand = new Command("Exit", Command.EXIT, 1);
cameraCommand = new Command("Camera", Command.SCREEN, 1);
cancelCommand = new Command("Cancel", Command.CANCEL, 2);
captureCommand = new Command("Capture", Command.SCREEN, 1);
settingsCommand = new Command("Settings", Command.SCREEN, 2);
saveSettingsCommand = new Command("Save", Command.OK, 1);
callCommand = new Command("Call", Command.ITEM, 2);
openCommand = new Command("Open", Command.ITEM, 2);
smsCommand = new Command("Send SMS", Command.ITEM, 2);

settingsForm = new Form(midletName);
String[] resolutions = {"Automatic", "160x120", "320x240", "640x480"};
resolutionChoiceGroup = new ChoiceGroup("Resolution: ", Choice.EXCLUSIVE, resolutions, null);
settingsForm.append(resolutionChoiceGroup);
settingsForm.addCommand(saveSettingsCommand);
settingsForm.addCommand(cancelCommand);
settingsForm.setCommandListener(this);

waitForm = new Form(midletName);
waitGauge = new Gauge("Processing, please wait...", false, Gauge.INDEFINITE, Gauge.CONTINUOUS_RUNNING);
waitForm.append(waitGauge);


try {

player = createPlayer();
player.realize();

videoControl = (VideoControl)player.getControl("VideoControl");

canvas = new CameraCanvas(this);

videoControl.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, canvas);
videoControl.setDisplayFullScreen(true);
videoControl.setVisible(true);
} catch (Exception e) {
handleException(e);
}
canvas.addCommand(exitCommand);
canvas.addCommand(captureCommand);
canvas.addCommand(settingsCommand);
canvas.setCommandListener(this);
showCamera();
} else {

if (display.getCurrent() == canvas) {
try {
player.start();
} catch (Exception e) {
handleException(e);
}
}
display.setCurrent(display.getCurrent());
}
}

public void pauseApp() {
if (player != null) {
try {
player.stop();
} catch (Exception e) {
handleException(e);
}
}
}

public void destroyApp(boolean unconditional) {
if (player != null) {
videoControl = null;
try {
player.stop();
} catch (Exception e) {
handleException(e);
}
player.deallocate();
player.close();
player = null;
}
}

public void commandAction(Command c, Displayable s) {
if (c.getCommandType() == Command.EXIT) {
destroyApp(true);
notifyDestroyed();
} else if (c == cameraCommand) {
showCamera();
} else if (c == cancelCommand) {
showCamera();
} else if (c == captureCommand) {
capture();
} else if (c == callCommand) {
dispatchPlatformRequest();
} else if (c == openCommand) {
dispatchPlatformRequest();
} else if (c == smsCommand) {
dispatchPlatformRequest();
} else if (c == settingsCommand) {
closeCamera();
showSettings();
} else if (c == saveSettingsCommand) {
saveSettings();
showCamera();
}
}

private Player createPlayer() {
Player mPlayer = null;

try {
mPlayer = Manager.createPlayer("capture://video");
} catch (Exception e) {
handleException(e);
}

return mPlayer;
}

private void showCamera() {
try {
display.setCurrent(canvas);
player.start();
} catch (Exception e) {
handleException(e);
}
}

public void closeCamera() {
try {
player.stop();
} catch (Exception e) {
handleException(e);
}
}

public void capture() {
try {

display.setCurrent(waitForm);

} catch (Exception me) {
handleException(me);
}
}

public void showResult(String result) {

resultForm = new Form(midletName);
resultStringItem = new StringItem("Result: ", result);
resultForm.addCommand(exitCommand);
resultForm.addCommand(cameraCommand);

if (result.startsWith("tel:")) {
resultForm.addCommand(callCommand);
} else if (result.startsWith("http://")) {
resultForm.addCommand(openCommand);
} else if (result.startsWith("sms:")) {
resultForm.addCommand(smsCommand);
}
resultForm.append(resultStringItem);
resultForm.setCommandListener(this);

display.setCurrent(resultForm);
}

private void dispatchPlatformRequest() {
try {
platformRequest(resultStringItem.getText());
} catch (ConnectionNotFoundException cnfe) {
handleException(cnfe);
}
destroyApp(true);
notifyDestroyed();
}

public String getCaptureSettings() {
String captureString = null;
if (captureProfile == 1) {
captureString = "encoding=jpeg&width=160&height=120";
} else if (captureProfile == 2) {
captureString = "encoding=jpeg&width=320&height=240";
} else if (captureProfile == 3) {
captureString = "encoding=jpeg&width=640&height=480";
} else {
captureString = null;
}
return captureString;
}

private void loadSettings() {
try {
db = RecordStore.openRecordStore("settings", true);
if (db.getNumRecords() > 0) {
byte[] record = db.getRecord(1);
String cp = new String(record);
captureProfile = Integer.parseInt(cp);
} else {
captureProfile = 0;
}
db.closeRecordStore();
} catch (RecordStoreException rse) {
handleException(rse);
}
}

private void saveSettings() {
int choice = resolutionChoiceGroup.getSelectedIndex();
boolean settingsChanged = false;
if ((choice == 0) && (captureProfile != 0)) {
captureProfile = 0;
settingsChanged = true;
} else if ((choice == 1) && (captureProfile != 1)) {
captureProfile = 1;
settingsChanged = true;
} else if ((choice == 2) && (captureProfile != 2)) {
captureProfile = 2;
settingsChanged = true;
} else if ((choice == 3) && (captureProfile != 3)) {
captureProfile = 3;
settingsChanged = true;
}
if (settingsChanged == true) {
try {
db = RecordStore.openRecordStore("settings", true);
String cp = Integer.toString(captureProfile);
byte[] record = (cp).getBytes();
if (db.getNumRecords() == 0) {
db.addRecord(record, 0, record.length);
} else {
db.setRecord(1, record, 0, record.length);
}
db.closeRecordStore();
} catch (RecordStoreException rse) {
handleException(rse);
}
}
}

private void showSettings() {
resolutionChoiceGroup.setSelectedIndex(captureProfile, true);
display.setCurrent(settingsForm);
}

public VideoControl getVideoControl() {
return videoControl;
}

public void handleException(Exception e) {
System.err.println(e);
}
}








CameraCanvas.java



import javax.microedition.lcdui.*;

public class CameraCanvas extends Canvas {
private QRMidlet mQRMidlet;

public CameraCanvas(QRMidlet midlet) {
mQRMidlet = midlet;
}

public void paint(Graphics g) {

g.setColor( 0x0000000 );
g.fillRect(0, 0, this.getWidth(), this.getHeight());
};

public void keyPressed(int keyCode) {
int action = getGameAction(keyCode);
if (action == FIRE) {
mQRMidlet.capture();
}
}
}





Précédemment j'avais fait un code encore plus simple avec quasiment seulement un Manager.createPlayer et j'avais l'erreur : MediaException: createPlayer() failed


Merci d'avance de vos réponses...
A voir également:

6 réponses

calaglin2 Messages postés 44 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 21 septembre 2009 13
28 janv. 2009 à 09:37
J'aimerais en particulier savoir comment je pourrais adapter ce code pour qu'il fonctionne sur mon mobile

merci
0
calaglin2 Messages postés 44 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 21 septembre 2009 13
28 janv. 2009 à 21:08
personne n'a d'idée ?

Je me suis renseigné et ça viendrait peut être du locator "capture://video" dans le Manager.createPlayer(locator). Il faut peut être je que customise un locator pour que ça marche.

Mais comment ?
0
MYTEKOS Messages postés 2 Date d'inscription mercredi 28 janvier 2009 Statut Membre Dernière intervention 29 janvier 2009
29 janv. 2009 à 12:05
Bonjour,
Je ne suis pas développeur Java y compris J2ME mais comme je suis à la même recherche de fonctionnalité que vous à savoir comment utiliser les QR Code sur un portable.
A ce sujet permettez moi quelques remarques :
1 ) il s'agit plutôt d'un décodage de QR Code que de décryptage,
2 ) Il est curieux que les sociétés qui ont développé un outil de décodage QR Code permettent le téléchargement gratuit de leur application mais par modèle de téléphone ( je parle de téléphone équipé de java par défaut )
JAVA J2ME ne semble pas interopérable ! sur les téléphones portables entre modèles qui en sont équipé !
3 ) Certains tel portables comme les samsung ne veulent pas laisser installer et executer les fichiers jar et jad.
J'ai utilisé mon serveur web perso pour charger le .jar et .jad ( voir problème de signatures de fichiers en fonction des modèles )
4 ) avec vous utiliser un émulateur ( cas des samsung ) ?
Je l'ai installé sur windows mais il n'y a pas d'émulateur de l'appareil photo par la webcam si dispo sur le P.C.
Enfin bref pas évident pour réaliser quelque chose sur le portable.
J'ai développé il y a longtemps en assembler et turbo basic ( mais java je le lis mais je ne comprends pas toujours ) et pour émuler c'est une autre histoire.
Je n'ai pas vu d'ouvrage en français sur J2ME et appliqué aux portables.l
Votre développement peut m'aider également...
J'ai un SGH D800 en autre.
Merci pour avance pour votre réponse.
0
calaglin2 Messages postés 44 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 21 septembre 2009 13
29 janv. 2009 à 20:54
Je me suis bien renseigné sur le sujet depuis mon dernier post. En effet j2me ne semble pas être interopérable au niveau de la gestion des médias sur téléphone portable car le fonctionnement du midlet va dépendre de la configuration du portable. Il faut donc parfois adapter le code en fonction du portable que l'on utilise.

J'ai un autre samsung ( un E900 ) et pour installer un programme il faut entrer un genre de code constructeur pour débloquer le menu d'installatiion. Je ne sais si c'est pareil pour les autres modèles...

Pour l'émulateur j'utilise celui de sun. Je le trouve assez bon.
La dernière version de la plateforme de développement est vraiment pratique si vous ne l'avez pas : https://www.oracle.com/java/technologies/javameoverview.html

Il est vrai qu'avec tous ces problèmes, ce n'est vraiment pas pratique pour développer quelque chose.

L'erreur que je rencontrais avant était certainement dû à mon .jad ou .jar . Depuis que je suis passé à la dernière version de la plateforme de développement de sun, java ne s'arrête plus sans explication.

Le problème maintenant est que le Player refuse de se créer et je crois avoir trouvé pourquoi : mon téléphone ne supporte pas la capture vidéo...

Quand je fais System.getProperty("supports.video.capture") il me renvoie false.

Je pense qu'il y a bien un moyen de contourner cela, mais comment ?
0
MYTEKOS Messages postés 2 Date d'inscription mercredi 28 janvier 2009 Statut Membre Dernière intervention 29 janvier 2009
29 janv. 2009 à 23:41
Bonsoir,
Pour répondre à votre message :
1) Interopérabilité entre portable :

J'ai trouvé cela en me promenant sur un autre forum :
"La seule chose que tu as à regarder c'est la version du MIDP (détermine les APIs de bases que va posséder la lib embarquée) et
les APIs propriétaire (plus dur à connaître) tel que pour faire du jeu -> Nokia (en plus de celle de MIDP 2.0)
ou alors des filtres pour les tel faisant téléphone ...
Donc au final, la chose la plus importante à regarder est la version de MIDP et surtout la façon dont tu vas pouvoir
uploadé tes progs de ton PC vers le tel ...
car c'est souvent bien la merde de ce côté là et par exemple pour moi, je ne peux le faire qu'en passant apr le net donc obliger de me faire mon serveur à chaque fois (cf mon tut video sur ce sujet pour plus d'informations ...)"
=> il faut si j'ai compris avoir les bon pré requis c'est à dire le bon MIDP
ET ADAPTATION DU CODE VEUT DIRE NON 100 % INTERROPERABILITE CE QUI N EST PAS TRES DANS LA PHILOPHIE DE JAVA ( WRITE ONCE RUN ANYWHERE )

2 ) SAMSUNG demande un code : oui mais il faut que je revérifie ( avec un JAR et JAD ) sur mon SGH D800.
NOKIA est plus souple à ce niveau mais il faut charger le JAR et JAD par le serveur web
J'utilise un NOKIA 2630 ( il possède java,un appareil photo,Bluetooh pour la com ,il est plat et peut démarrer dans SIM ) mais ne fonctionne avec aucun logiciel de décodade de QR Code ou Datamatrix Pourquoi ne trouve t il pas les ressources video => très dommage et pas très cher pour mon application de décodage de QR Code.

3 ) Selon mes informations il ne serait pas possible de faire du décodage à la volée ( comme sous windows mobile ) car java demande des autorisations avant chaque cliché !

4 ) je n'ai pas encore essayé la dernière version de la plateforme de sun ( une un peu anciène seulement )
Cela sera la prochaine étape !

5 ) Si j'ai bien compris vous en ête à la capture de l'image mais le traitement du décodage QR Code n'est pas
encore implémenté ....
Pensez vouz utiliser une blibliothèque open source ? ( j'ai quelques pistes mais je ne sais pas l'implémenter)
Pas facile JAVA n'est ce pas !
Cldt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
calaglin2 Messages postés 44 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 21 septembre 2009 13
1 févr. 2009 à 20:45
1) C'est vrai qu'on est plus du tout dans la philosophie de java !
Merci pour les infos ! C'est vrai qu'il faut regarder la version du MIDP et de la config CLDC et en plus il faut se méfier des portables qui ont les bonnes bibliothèques mais empêchent leurs exploitation ! ( genre la capture vidéo avec la JSR-135 )

2)C'est vrai que NOKIA est beaucoup plus souple ! je travaille maintenant avec un 6600 slide et il y a une grosse différence !
Pour votre NOKIA 2630 quelle erreur affiche t-il ?

3)J'essaie aussi de creuser cette question...

5)J'en suis maintenant au décodage de QRCode et j'essaie effectivement d'utiliser des projets open source
J'en ai trouvé deux :

http://qrdemo.com/
https://github.com/zxing/zxing
0
svp je veux trouver un logiciel de lecture et de décodage d'un code datamatrix ou d'un code à barre
0
c'est urgent svp
0
Bonjour,

j'ai un samsung player addict et depuis peu de temps il m'affiche le message suivant :
"Java a détecté une exception. l'application va se fermer."
et j'ai remarqué que depuis, je ne peux plus jouer a un jeu que j'ai acheté et téléchargé.
Vous pouvez me dire quoi faire ? svp
0