Help us understand the problem. What is going on with this article?

LollipopのWebViewでinput type fileで画像アップロード

More than 5 years have passed since last update.

Android5.0 から WebView で画像アップのやり方が変わっていた。

stackoverflowにあるように実装してみた。

WebChromeClient に Lollipop 用の画像のアルバム選択メソッドを追加する。
新しいAPIを使うので build.gradle の compileSdkVersion を 21 以上に上げる。

private final static int FILECHOOSER_RESULTCODE = 1;
private ValueCallback<Uri[]> uploadMessage;

@Override
protected void onCreate(Bundle savedInstanceState) {
....
   webView.setWebChromeClient(new WebChromeClient() {

        public boolean onShowFileChooser(WebView webView,
                                         ValueCallback<Uri[]> filePathCallback,
                          WebChromeClient.FileChooserParams fileChooserParams)
        {

            if( uploadMessage != null) {
                uploadMessage.onReceiveValue(null);
                uploadMessage = null;
            }
            uploadMessage = filePathCallback;
            Intent intent = fileChooserParams.createIntent();
            try {
                WebActivity.this.startActivityForResult(intent,
                                                        FILECHOOSER_RESULTCODE);
            } catch (ActivityNotFoundException e) {
                uploadMessage = null;
                return false;
            }
            return true;
        }
   });

...

これでHTMLの input type file タグを突くとフォトアルバムが開いてくれる。
後は画像をチョイスした後タグのinputに入るように処理を書く。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if( requestCode == FILECHOOSER_RESULTCODE ) {
            if( uploadMessage == null) {
                return; 
            }
            uploadMessage.onReceiveValue(
                WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
            uploadMessage = null;
        }
   }

これで Lollipop でもアルバムから画像アップロードが出来るようになった。
なんかわからんが、うまく出来てるな〜。

Android 4 の処理も onActivityResult に置く時は、このコードを
Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP とかで切り替わるようにする。

== じゃないのは、使っている SDK が 22 なのに、Build.VERSION_CODES.LOLLIPOP が 21 だから。
う〜ん、将来に禍を残さないためにはどーしたもんだろか?

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away