Android Webview

4e5ung·2022년 1월 6일
0

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]);
          });
        };

0개의 댓글