Androidのwebviewでファイルが選択出来ない
いつもお世話になっております。
Androidアプリの開発を行っており、webviewでloadしたページでファイルのアップロードを行いたいと思っております。
下記サイト
などを参考に写真選択のダイアログが開くところまでは実装出来ているのですが、画像を選択してもinput
にそのファイルの情報がわたっていないようなのです。
上記の参考サイト1のonActivityResult
で、mFilePathCallback.onReceiveValue(results);
している箇所のresultsでは選択したファイルのURIが表示されている事は確認出来ております。
もちろん、PHPだけでファイルが送信されている事は確認済みです。
原因がわからず、どなたか解決策をご存知でしたら、ご教授頂けますと幸いでございます。
何卒、よろしくお願いいたします。
検証端末
- Android 6
- Android 8
検証ソース(抜粋)
upload.php
<form action="/upload.php" method="post">
<input type="file" name="image">
<input type="submit">
</form>
<hr>
<?php
print_r($_FILES);
?>
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
MainActivity.java
final private int INPUT_FILE_REQUEST_CODE = 101;
private ValueCallback<Uri[]> mFilePathCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
WebView mWebView = (WebView) findViewById(R.id.main_webview);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setAppCacheEnabled(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setLoadWithOverviewMode(false);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient() {
// For Android 5.0+
@Override
public boolean onShowFileChooser(WebView webView,
ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
if (mFilePathCallback != null) {
mFilePathCallback.onReceiveValue(null);
}
mFilePathCallback = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
startActivityForResult(intent, INPUT_FILE_REQUEST_CODE);
return true;
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == INPUT_FILE_REQUEST_CODE) {
if (mFilePathCallback == null) {
super.onActivityResult(requestCode, resultCode, data);
return;
}
Uri[] results = null;
// Check that the response is a good one
if (resultCode == RESULT_OK) {
String dataString = data.getDataString();
if (dataString != null) {
results = new Uri[]{Uri.parse(dataString)};
}
}
Andrid.util.Log.d("tag", results[0]); // ← URIは取得出来ている
mFilePathCallback.onReceiveValue(results);
mFilePathCallback = null;
}
}