【Android】ギャラリーから選択した写真をサーバーにアップロードする方法

1,315 views
Skip to first unread message

Kumamoto Shingo

unread,
Jan 30, 2014, 2:21:15 AM1/30/14
to android-g...@googlegroups.com
こんにちは。熊本と申します。
今回、ギャラリーから選択した写真をサーバーにアップロードする方法に
手間取っています。
かれこれ1週間も色々ネットで探したりしているのですが上手く行きません。
教えて頂けたら本当に助かります。
どうぞよろしくお願いします。

【実機】
SHARP AQUOS PHONE 

【OS】
Android:4.04

【参考にしたURL】
・ギャラリーから画像を取得する
・HTTP POSTによるファイルのアップロード

【やろうとしていること】
ギャラリーで選択した画像を、HttpClientで非同期処理で通信してサーバーに送る。

【備考】
選択した画像のパスが「content://media/external/images/media/379」になる。
それをStringに変換している。

【エラーの症状】
実機ではボタンを押したら、PleaseWait(Uploading...)というダイアログがでてその状態のまま。
EclipseではThreadPoolExecutor.classのページに飛び、w.unlock(); // allow interrupts の行で止まる。
エラーのConsolが出ないので困っている。


【コード】
<MainActivity>

public class MainActivity extends Activity implements OnClickListener

{

private static final int REQUEST_GALLERY = 0;

private ImageView imgView;

private Button btn1;

private Uri uri;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

android.os.Debug.waitForDebugger();

 

imgView = (ImageView)findViewById(R.id.imgview_id);

btn1 = (Button)findViewById(R.id.button1);

btn1.setOnClickListener(this);

// ギャラリー呼び出し

Intent intent = new Intent();

intent.setType("image/*");

intent.setAction(Intent.ACTION_GET_CONTENT);

startActivityForResult(intent, REQUEST_GALLERY);

}


@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if(requestCode == REQUEST_GALLERY && resultCode == RESULT_OK) {

try {

InputStream in = getContentResolver().openInputStream(data.getData());

Bitmap img = BitmapFactory.decodeStream(in);

uri = data.getData();

in.close();

// 選択した画像を表示

imgView.setImageBitmap(img); 

} catch (Exception e) {

}

}

@Override

public void onClick(View v) 

{

  // ボタン押下時

  if( v == btn1 )

  {

  Uri filePath = uri;

  String string = filePath.toString();


  UploadAsyncTask task = new UploadAsyncTask(this);

  task.execute(string);

  }

}

}



<UploadAsyncTask >

public class UploadAsyncTask  extends AsyncTask<String, Integer, Integer> {

ProgressDialog dialog;

Context context;

public UploadAsyncTask(Context context){

this.context = context; 

}

@Override

protected Integer doInBackground(String... params) {

try {

String fileName = params[0];

HttpClient httpClient = new DefaultHttpClient();

HttpPost httpPost = new HttpPost("http:/……");  //アップするアドレス

 ResponseHandler<String> responseHandler =

new BasicResponseHandler(); 

MultipartEntity multipartEntity = 

new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE)

File file = new File(fileName); 

FileBody fileBody = new FileBody(file, "image/jpeg")

multipartEntity.addPart("f1", fileBody);

 

httpPost.setEntity(multipartEntity); 

httpClient.execute(httpPost, responseHandler);

 } catch (ClientProtocolException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
e.printStackTrace(); 
}

    return 0;

}

@Override

protected void onPostExecute(Integer result) {

if(dialog != null){

dialog.dismiss(); 

}

  }

@Override 

protected void onPreExecute() {

dialog = new ProgressDialog(context);

dialog.setTitle("Please wait");

dialog.setMessage("Uploading...");

dialog.show();

}  

}















Hirokazu Fukami

unread,
Jan 30, 2014, 2:31:43 AM1/30/14
to android-g...@googlegroups.com
こんにちはfkmです。

ギャラリーから選択された画像は、かならずローカルのファイルになっている訳ではなかったりします。

なので、ContentResolverのopenInputStream(Uri)でストリームで開いて、
HttpClientに渡すようにしないとだめです。

http://developer.android.com/reference/android/content/ContentResolver.html#openInputStream(android.net.Uri)

2014/1/30 Kumamoto Shingo <season....@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com
> にメールを送信します。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。



--
-------------------------------------------------------------
深見 浩和(Hirokazu Fukami)

URI:http://www.fkmsoft.jp
email: f...@fkmsoft.jp

Kumamoto Shingo

unread,
Jan 30, 2014, 5:24:33 AM1/30/14
to android-g...@googlegroups.com
fkmさん、早速の返信ありがとうございます。

fkmさんの返信を見て色々と考えたのですが
イマイチぴんと来ていません。

ContentResolverのopenInputStream(Uri)を使いHttpClientに渡すってことですが、
HttpClientでは画像のパスが必要だと認識しています。
パス以外にHttpClientに何か渡すのであれば、どのようにしたらよろしいでしょうか??

力不足で度々の質問となってしまい申し訳ないです。

Hirokazu Fukami

unread,
Jan 30, 2014, 6:19:16 AM1/30/14
to android-g...@googlegroups.com
こんばんはfkmです。

ぐぐったらでてきました。
InputStreamBodyを使えばいい気がします。
http://androidadvent.blog.shinobi.jp/2012/multipartentity-post-file


2014/1/30 Kumamoto Shingo <season....@gmail.com>:

Katuhisa Uramoto

unread,
Jan 30, 2014, 6:22:44 AM1/30/14
to android-g...@googlegroups.com
(_ _;)横合いから割り込んで。

jQueryのupload-pluginで十分でしょ。
Hirokazu さんは、サーバサイドの研究もされたほうがいいのかな?


2014年1月30日 20:19 Hirokazu Fukami <fkm...@gmail.com>:



--
株式会社エクスファ
東京都新宿区喜久井町
代表 浦本勝久

プロトタイプ屋です。
あなたの考えや希望をカタチにします。
--

Kumamoto Shingo

unread,
Feb 1, 2014, 8:05:00 AM2/1/14
to android-g...@googlegroups.com
返信遅れました。
fkmさん、詳しくありがとうございます。
InputStreamBodyを使ったら、無事POSTすることができました。
ありがとうございます。


浦本さん
返信ありがとうございます。
jQueryのupload-pluginのやり方にも興味があります。
ただ今回は自分でも試していたやり方を選びました。



Katuhisa Uramoto

unread,
Feb 1, 2014, 8:08:30 AM2/1/14
to android-g...@googlegroups.com
言語を幅広く修得するのも良いかもしれませんが、目的と手段を混同されないよう、願っています。


2014年2月1日 22:05 Kumamoto Shingo <season....@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、android-group-j...@googlegroups.com にメールを送信します。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
Reply all
Reply to author
Forward
0 new messages