WebViewでファイル選択機能を有効にする


WebViewで見ているページで、formのファイル選択ボタンがあったとします。
Android端末の中に保存している画像の選択をするには、ちょっと普段と違った実装をしなくてはなりません。
普通に実装しているだけでformボタンが無効化されてしまいます。

public class WebActivity extends Activity {
	//エコー写真のファイル送信を可能にする
	final private int INTENT_CODE = 101;
	private ValueCallback<Uri> mUploadMessage;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_webview);

		// WebViewインスタンスを取得
		WebView webView = (WebView) findViewById(R.id.webView);

		// WebViewの設定
		webView.getSettings().setUseWideViewPort(true);
		webView.getSettings().setLoadWithOverviewMode(true);
		webView.setVerticalScrollbarOverlay(true);
		webView.getSettings().setBuiltInZoomControls(true);
		webView.getSettings().setDomStorageEnabled(true);
		webView.getSettings().setJavaScriptEnabled(true);
		webView.loadUrl(url);

		// WebViewClientを継承
        webView.setWebChromeClient(new WebChromeClient() {
        	// /Android 4.1以上
        	public void openFileChooser(ValueCallback<Uri> 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, "画像選択"), INTENT_CODE);
			}
			// Android 3.0以上
			public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
				mUploadMessage = uploadMsg;
				Intent i = new Intent(Intent.ACTION_GET_CONTENT);
				i.addCategory(Intent.CATEGORY_OPENABLE);
				i.setType("image/*");
				startActivityForResult(Intent.createChooser(i, "画像選択"), INTENT_CODE);
			}
			// Android 3.0未満
			public void openFileChooser(ValueCallback<Uri> uploadMsg) {
				openFileChooser(uploadMsg, "", "");
			}
        });
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
		if (requestCode == INTENT_CODE) {
			if (null == mUploadMessage) return;

			Uri result = (intent == null || resultCode != RESULT_OK)  ? null : intent.getData();
			mUploadMessage.onReceiveValue(result);
			mUploadMessage = null;
		}
	}

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください