WebViewでのinput type fileの取り扱い

kishidaです。タイトルの通りのことでハマったので書きます。
原因は簡単にいえばandroid側のデフォルトではでinput type file に対応していないので対応させてやる必要があるみたいです。

private final static int FILECHOOSER_RESULTCODE = 1;
private ValueCallback mUploadMessage;
private WebView webView = new WebView(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
  mWebView = new WebView(this);
  mWebView.setWebChromeClient(new WebChromeClient() {
    //androidOS 4.1
    public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
      mUploadMessage = uploadMsg;
      Intent i = new Intent(Intent.ACTION_GET_CONTENT);
      i.addCategory(Intent.CATEGORY_OPENABLE);
      i.setType("image/*");
      startActivityForResult( Intent.createChooser(i, "title"), FILECHOOSER_RESULTCODE);
    }
    //androidOS 3.0 以上
    public void openFileChooser( ValueCallback uploadMsg, String acceptType){
      openFileChooser( uploadMsg, acceptType , "");
    }
    //androidOS 3.0未満
    public void openFileChooser(ValueCallback uploadMsg) {
      openFileChooser(uploadMsg, "", "");
    }
  });
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
  if (requestCode == FILECHOOSER_RESULTCODE) {
    if (null == mUploadMessage) return;
      Uri result = (intent == null || resultCode != RESULT_OK)  ? null : intent.getData();
      mUploadMessage.onReceiveValue(result);
      mUploadMessage = null;
  }
}

以上を加えてやればOK。
aleatなども処理を書いてやらないといけないみたいなのでなかなか大変です。

カテゴリー: Android

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*