2017-08-30 4 views
0

Intentでbase64イメージを送信しようとしています。画像が大きい場合は、最初に内部ストレージに保存してから、パスから取り出してIntentに送信する必要があります。問題は、アンドロイドが次のように私にトーストを与えているということです。Intentを通してbase64イメージを送信するには?

アップロードに失敗しました。データが含まれていないためアップロードできませんでした。

私はcontextに合格した私のカスタムWebViewですべてが行われていると言います。多分それは問題ですか?私のAPIは、私がここにコードを入れて21です:

this.webView.setDownloadListener((new DownloadListener() { 
       @Override 
       public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { 

         try { 
          if(url != null) { 
           FileOutputStream fos; 
           fos = context.openFileOutput("image.png", Context.MODE_PRIVATE); 
           byte[] decodedStr = Base64.decode(url, Base64.DEFAULT); 
           fos.write(decodedStr); 


           Intent sendIntent = new Intent(); 
           sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
           sendIntent.setAction(Intent.ACTION_SEND); 
           sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File("file://" + context.getFilesDir() + "/chart.png"))); 
           sendIntent.setType("image/png"); 
           getContext().startActivity(sendIntent); 
           fos.flush(); 
           fos.close(); 
          } 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        }     
      })); 

マイbase64では、次のようになります。

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArgAAAIACAYAAABpWR83AAAgAElEQVR4Xux9B3xU15X+ESBUEEIVgbpAgCq9V9tg3B1jO3FLcUnsuCa2s7v/TeJksym7yaa6pttOcY2Nu8 

それははるかに長いです。私はちょうどここに私の質問をより読みやすくするためのカットバージョンを入れました。

ありがとうございました!

@EDIT

私は彼が達成するために何を望んでいるかは明らかではないことを感じています。私はこのチュートリアルを利用作ってるんだ:https://developer.android.com/training/sharing/send.html しかし、異なっているものがあるbase64で画像

** @ EDIT 2 **

変更方法putExtra()に今他のアプリは、画像を読み取ることができませんが

答えて

0

インテントでデータを送信する場合、1 MBにトランザクション制限があることに注意する必要があります。アクティビティのみに送信するuri、およびonCreateメソッド、新しい開始アクティビティのロードイメージ。

+0

うん、わかってるよ。だから、イメージをインテントに直接送信するのではなく、内部ストレージを使用しているのです。 – soommy12

1

このコードでは多くのバグがあります

  • あなたはopenFileOutput()経由getFilesDir()に画像を書いているが、サードパーティ製のアプリがそのディレクトリに

  • をファイルへの権限を持っていないあなたが使用しているが、あなたはIntentUriを入れているのAndroid 7.0+

  • 上では動作しませんfile:Uri、あなたはstartActivity()を呼び出す前に、ファイルをクローズしていないかACTION_SEND作品(EXTRA_STREAMを使用)

  • ないsetData()、ビア(これは実際に動作するはずですが、それはあなたがコードレビューに怒鳴られますものの一種です)

- あなたはあなたのファイルの内容がPNGファイルでない場合、MIMEタイプは image/pngある

を主張するあなたがそれらを修正した場合でも、私はあなたの前提を疑問視。この惑星には約70億人の人々がいる。 IMHOでは、base64でエンコードされたファイルを他のアプリに入れることを望む人はほとんどいません。そのアプリはそのファイルを使用できないためです。ユーザーが画像を共有できるようにする場合は、 は画像のベースコードではなく、画像を共有します。

+0

画像は私によって作成されません。私はbase64でイメージを得て、それを変更することはできません – soommy12

+1

@ soommy12:申し訳ありませんが、私は誤解しました。あなたの質問のタイトルは、あなたが "Intentを通してbase64イメージを送る"ことを試みていないので、誤解を招きます。イメージをデコードしました。あなたは「意図を通してイメージを送る」ことを試みています。それは私の述べたバグの一つと私の最後の段落の懸念を排除するので、私は取り消し線でそれらを修正しました。 – CommonsWare

+0

それは大丈夫です。私はすでにコードとその 'putExtra()'を使っています。しかし、MessangerやInstagramがこの画像を読むことができないことは知っています。内部ストレージへのアクセス権がないためですか?それを修正するには? – soommy12

関連する問題