2016-06-26 8 views
1

FileSytemStorage.getAppHomePath()dirに保存されている画像を生成しています。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 

だから私はNPEを取得し、そのように、私ドン場合:私は今、私は私のアクションメソッドに(Codename One documentationに基づいて)次のコードを使用しています理由です...、電子メール経由でSMSを、それを共有する必要がありますファイルが存在するかどうかテストしませんが、NPEはありませんが、イメージはまだ失われています(シミュレータとデバイスの両方)。次のように

スタックトレースは次のとおりです。

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) 

私のアプリが生成され、ファイルが共有アプリにづけしていないことになります。 here for Androidとアドバイスをして追加の許可を加えなければなりませんか?

ご注意:私はそれがこの問題に関連しているかどうかを知りませんが、私はもうエクリプスからコードネームつ設定メニューにアクセスすることはできません(多分CN1のLIBのVへのアップグレード以来115)

すべてのヘルプは大歓迎します、だからここ

乾杯

+0

必要な権限が必要です。 nullポインタ例外のスタックは何ですか? –

+0

私はスタックトレースを追加しました。 – HelloWorld

+0

あなたは私にアイデアをくれました。私はfindValidateMontageShareButton3()がnullを返していたかどうかをテストしました。だから説明できませんが、 '((ShareButton)c).setImageToShare(fullOutputPath、" image/png ");'に変わり、NPEは消えました。不幸にも私が送るメッセージはまだ画像を見逃しています。 – HelloWorld

答えて

1

(すなわち画像が偽の電子メールクライアントに表示されます=>下の画像を参照)シミュレータで動作します答えの一部です。

Image in the fake email client

だから、共有ボタンは、アクションメソッド(ユーザーが共有ボタンをクリックしたときにトリガーされる、すなわち法)で設定することができないことが表示されます。それは以前に設定しなければなりません。 `

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"); 

を次にコード読み取り共有ボタンに関連するonActionメソッドで:

// 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"); 
      } 
     } 
    }); 

私はそれとそれをテストし、次のように

その結果、beforeShow方法で私のコードを読み込み、シミュレータでは動作しますが、デバイスでは動作しませんでした。いずれかのpngまたはjpegファイルでは、ファイルをSMSまたは電子メールに添付することはできません(Androidのエラーメッセージ "異常なファイル、添付ファイルできません")。

ただし、2回目にするとファイルを添付することができます。だから今はイメージが欠けているわけではありませんが、それはまだ恥ずかしいです(最初に)添付することはできません。

+0

ありがとう、それは修正すべきコンポーネントの誤動作のようです。次のEDTサイクルに共有ボタンの操作を延期し、コードを最初に処理して問題を効果的に解決できるようにします。 –

+0

私はその間にできる回避策がありますか、CN1のアップグレードを待つのが良いでしょうか?いつ準備が整っているのか分かりますか? – HelloWorld

+1

ライブラリーは毎週金曜日に更新されるので、1日か2日待つことができます。 –

関連する問題