Android Webview
web-android 갤러리 연동
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
public static final int REQUEST_CODE = 100;
private class AndroidBridge {
@JavascriptInterface
public void setCamera() {
openGallery();
}
}
public ValueCallback<Uri[]> filePathCallbackLollipop;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 웹뷰 셋팅
mWebView = (WebView) findViewById(webView);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setDomStorageEnabled(true);
mWebView.addJavascriptInterface(new AndroidBridge(), "TestAndroidApp");
mWebView.loadUrl("file:///android_asset/index.html");
// mWebView.setWebChromeClient(new WebChromeClient());
mWebView.setWebViewClient(new WebViewClientClass());
mWebView.setWebChromeClient(new WebChromeClient() {
// For Android 5.0+
public boolean onShowFileChooser(
WebView webView, ValueCallback<Uri[]> filePathCallback,
WebChromeClient.FileChooserParams fileChooserParams) {
Log.d("MainActivity", "5.0+");
filePathCallbackLollipop = filePathCallback;
openGallery();
return true;
}
});
}
private void openGallery() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && data != null && data.getData() != null) {
switch( requestCode ){
case REQUEST_CODE: {
if (filePathCallbackLollipop == null) return;
if( data != null ) {
filePathCallbackLollipop.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
}else{
filePathCallbackLollipop.onReceiveValue(null);
}
filePathCallbackLollipop = null;
}
break;
}
}else{
switch( requestCode ){
case REQUEST_CODE:{
if (filePathCallbackLollipop != null) {
filePathCallbackLollipop.onReceiveValue(null);
filePathCallbackLollipop = null;
}
}
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
private class WebViewClientClass extends WebViewClient {//페이지 이동
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("check URL",url);
view.loadUrl(url);
return true;
}
}
}
- @JavascriptInterface 형태로 web 과 연동
<input type="file" id="upload" onclick="doAndriodCamera()">
function doAndriodCamera(){
TestAndroidApp.setCamera();
}
- 직접 web에서 직접 onShowFileChooser 호출
<input type="file" class="hiddenFileInput" style="visibility: hidden;">
<button class="loadFileBtn">Load File</button>
window.onload = function() {
var loadFileBtn = document.querySelector('.loadFileBtn');
var fileInputField = document.querySelector('.hiddenFileInput');
var img = document.querySelector('img');
loadFileBtn.addEventListener('click', function() {
fileInputField.click();
}.bind(this));
fileInputField.addEventListener('change', function(evt) {
console.log('Change', evt);
var reader = new FileReader();
reader.onload = function (evt) {
img.src = evt.target.result;
};
reader.readAsDataURL(evt.target.files[0]);
});
};