2017-08-22 46 views
0

AndroidRetrofitを使用してビットマップをサーバーに投稿しようとしています。Retrofit/Androidを使用してサーバーにビットマップをPOSTする方法

現在、私はファイルを投稿する方法を知っていますが、ビットマップを直接送信したいと考えています。

これは、ユーザーがデバイスから画像を選択できるためです。私は帯域幅を節約するためにサイズを変更してからサーバーに送信し、優先的にロードしたり、サイズを変更したり、ローカルストレージにファイルとして保存したり、ファイルをポストしたりする必要はありません。

誰でもビットマップを投稿する方法を知っていますRetrofit

答えて

0
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

あなたはバイト配列にあなたのビットマップに変換することができ、その後のポストの後、他のサーバーにこのバイト配列を使用すると、たとえば1つのtemporyファイルを作ることができます

File file = new File(this.getCacheDir(), filename); 

直接サーバー

にuplaodファイル
3

ファーストで要求を作成した後

//create a file to write bitmap data 
File f = new File(context.getCacheDir(), filename); 
f.createNewFile(); 

//Convert bitmap to byte array 
Bitmap bitmap = your bitmap; 
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.JPEG, 0 /*ignored for PNG*/, bos); 
byte[] bitmapdata = bos.toByteArray(); 

//write the bytes in file 
FileOutputStream fos = new FileOutputStream(f); 
fos.write(bitmapdata); 
fos.flush(); 
fos.close(); 

を提出するためにあなたのビットマップを変換しますあなたのサービスコールは、この

interface Service { 
    @Multipart 
    @POST("/yourEndPoint") 
    Call<ResponseBody> postImage(@Part MultipartBody.Part image); 
} 

ように見えるそしてちょうどビットマップからファイルを作成し、あなたのAPI

Service service = new Retrofit.Builder().baseUrl("yourBaseUrl").build().create(Service.class); 
Call<okhttp3.ResponseBody> req = service.postImage(body); 
req.enqueue(new Callback<ResponseBody>() { 
    @Override 
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { 
     // Do Something 
    } 

    @Override 
    public void onFailure(Call<ResponseBody> call, Throwable t) { 
     t.printStackTrace(); 
    } 
}); 
+0

を呼び出すことは時間がかかりすぎるべきで

RequestBody reqFile = RequestBody.create(MediaType.parse("image/*"), f); MultipartBody.Part body = MultipartBody.Part.createFormData("upload", e.getName(), reqFile); 

あなたのファイルをアップロードするためにMultipart ...さこれを高速化することも可能ですし、asynctaskでローダーを表示するだけで済みますか? –

+0

ビットマップからファイルを作成するのは長いプロセスで、メモリが必要です。あなたはAsynctaskかTheadを使うべきです。 UIをブロックしないように、MainThreadからファイルの作成を移動する必要があります。そして、はい、このプロセスでローダーを表示します。 –

+0

私はしたが、それは毎回25〜30秒かかる...カムからキャプチャするとき。 –

関連する問題