2016-06-26 2 views
1

Je génère une image enregistrée dans FileSytemStorage.getAppHomePath() dir. Je dois maintenant la partager par e-mail, SMS ... Voilà pourquoi je suis en utilisant le code suivant (basé sur Codename One documentation) dans ma méthode d'action:Image toujours manquante dans le message reçu lors du partage d'une image dans Codename One

long time = new Date().getTime(); 

    String fullOutputPath = FileSystemStorage.getInstance().getAppHomePath() 
      + "Montage_" + Long.toString(time) + ".png"; 

    // Save the image with the ImageIO class 
    try (OutputStream os = FileSystemStorage.getInstance().openOutputStream(fullOutputPath)){ 
     ImageIO.getImageIO().save(montage.getMontageImage(), os, ImageIO.FORMAT_PNG, 1.0f); 

     } 


    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

     // Enable image sharing (outside the try/catch so that the outputstream in closed for sure) 
     if (FileSystemStorage.getInstance().exists(fullOutputPath)) { 
      Dialog.show("Saved", "Photo collage saved to " + fullOutputPath 
        + " (file size = " + FileSystemStorage.getInstance().getLength(fullOutputPath) +" B)", "OK", null); 
      //Photo collage saved to file://home/Montage_14669... .png (file size = 50387B) 

      findValidateMontageShareButton3().setImageToShare(fullOutputPath, "image/png"); 
      // Null pointer exception 

donc de cette façon que j'obtenir un NPE et si je don t tester si le fichier existe il n'y a pas NPE mais l'image est toujours manquante (à la fois dans le simulateur et sur le périphérique).

La trace de la pile est la suivante:

java.lang.NullPointerException 
at userclasses.StateMachine.onPage3_ValidateMontageShareButton3Action(StateMachine.java:852) 
at generated.StateMachineBase.handleComponentAction(StateMachineBase.java:757) 
at com.codename1.ui.util.UIBuilder$FormListener.actionPerformed(UIBuilder.java:2835) 
at com.codename1.ui.util.EventDispatcher.fireActionSync(EventDispatcher.java:459) 
at com.codename1.ui.util.EventDispatcher.fireActionEvent(EventDispatcher.java:362) 
at com.codename1.ui.Button.fireActionEvent(Button.java:411) 
at com.codename1.ui.Button.released(Button.java:442) 
at com.codename1.ui.Button.pointerReleased(Button.java:530) 
at com.codename1.ui.Form.pointerReleased(Form.java:2627) 
at com.codename1.ui.Form.pointerReleased(Form.java:2563) 
at com.codename1.ui.Component.pointerReleased(Component.java:3158) 
at com.codename1.ui.Display.handleEvent(Display.java:2025) 
at com.codename1.ui.Display.edtLoopImpl(Display.java:1067) 
at com.codename1.ui.Display.mainEDTLoop(Display.java:996) 
at com.codename1.ui.RunnableWrapper.run(RunnableWrapper.java:120) 
at com.codename1.impl.CodenameOneThread.run(CodenameOneThread.java:176) 

Il semble que le fichier mon application génère n'est pas accessible à l'application de partage. Dois-je ajouter une permission supplémentaire comme conseillé here for Android?

S'il vous plaît noter: Je ne sais pas si elle est liée à ce problème, mais je ne peux pas accéder au menu Codename Réglages One d'Eclipse plus (peut-être depuis la mise à niveau à CN1 lib v 115)

Toute aide appréciée ,

Vive

+0

Les autorisations nécessaires doivent être en place. Quelle est la pile de l'exception du pointeur nul? –

+0

J'ai ajouté la trace de la pile. – HelloWorld

+0

Vous m'avez donné une idée. J'ai testé si findValidateMontageShareButton3() renvoyait null et c'était en effet. Donc, bien que je ne puisse pas l'expliquer, j'ai changé pour '((ShareButton) c) .setImageToShare (fullOutputPath," image/png ");' et le NPE est parti. Malheureusement, le message que j'envoie manque encore l'image. – HelloWorld

Répondre

1

voici donc une partie de la réponse qui fonctionne dans le simulateur (ie l'image apparaît dans le client de messagerie faux => voir l'image ci-dessous).

Image in the fake email client

Il semble donc que le bouton de partage ne peut pas être mis en place dans la méthode d'action (la méthode qui est déclenché lorsque l'utilisateur clique sur le bouton de partage). Il doit être configuré précédemment.

Par conséquent, dans la méthode beforeShow mon code se lit comme suit: `

FontImage.setMaterialIcon(findValidateMontageShareButton3(), FontImage.MATERIAL_CHECK_CIRCLE); 


    final long time = new Date().getTime(); 

    // We generate the montage filename JPG otherwise it cannot be sent 
    montage.setMontageFullPath(FileSystemStorage.getInstance().getAppHomePath() 
      + "Montage_" + Long.toString(time) + ".jpg"); 

    // We assign the montage filename to the share button BEFORE we can click the button (otherwise the 
    // filename cannot be taken into account) 
    findValidateMontageShareButton3(f).setImageToShare(
     montage.getMontageFullPath(), "image/jpeg"); 

Ensuite, dans la méthode onAction lié au bouton de partage du code lit:

// Save the image with the ImageIO class 
    // We wait until the file is completely written to continue 
    Display.getInstance().invokeAndBlock(new Runnable() { 

     @Override 
     public void run() { 
      try (OutputStream os = FileSystemStorage.getInstance().openOutputStream(montage.getMontageFullPath())){ 
       ImageIO.getImageIO().save(montage.getMontageImage(), os, ImageIO.FORMAT_JPEG, 1); 

      } catch (IOException e) { 
       Dialog.show("Erreur", "Impossible de sauvegarder le montage! Merci de vérifier l'espace disque disponible.", null, "OK"); 
      } 
     } 
    }); 

Je l'ai testé et travaillé sur le simulateur mais pas sur l'appareil. Soit avec un fichier png ou un fichier jpeg, le fichier ne peut pas être attaché au SMS ou à l'email (message d'erreur Android "fichier anormal, fichier joint ne peut pas"). Cependant, si je le fais une deuxième fois, le fichier peut être joint. Alors maintenant, l'image ne manque pas mais elle ne peut pas être attachée (la première fois) ce qui est encore embarrassant.

+0

Merci, cela semble être un mauvais comportement du composant qui doit être corrigé. Nous remettrons l'action du bouton de partage au prochain cycle EDT, ce qui permettra à votre code de traiter en premier et de résoudre efficacement le problème. –

+0

Y at-il une solution de contournement que je peux faire entre les deux, ou je ferais mieux d'attendre la mise à niveau CN1 lib? Avez-vous une idée quand il devrait être prêt? – HelloWorld

+1

Les bibliothèques se mettent à jour tous les vendredis donc je suppose que vous pouvez attendre un jour ou deux –