在android开发中,用webview嵌套页面遇到的问题
- 在用android开发应用中,遇到一个场景,是需要用webview嵌套一个上传文件的页面,当时遇到两个问题:
- 针对第一个问题,最开始我是只调用了webView.setWebViewClient(new WebViewClient());,此时页面能正常打开,但是点击选择文件的时候,没有反应,处理的方式是,需要设置webView.setWebChromeClient(new WebChromeClient() ),且需要重写WebChromeClient方法,不然,还是没有办法弹窗选择文件的窗口,下面是重写的方式,至此,第一个问题就可以解决了
webView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {GameSDKActivity.mFilePathCallback = filePathCallback;Intent intent = fileChooserParams.createIntent();try {mActivity.startActivityForResult(intent, GameSDKActivity.FILE_CHOOSER_REQUEST_CODE);} catch (ActivityNotFoundException e) {GameSDKActivity.mFilePathCallback = null;Toast.makeText(mActivity, "无法打开文件选择器", Toast.LENGTH_SHORT).show();return false;}return true;}});
- 针对第二个问题,是因为Activity的回调函数onActivityResult 没有针对的功能实现,因为在View中调用mActivity.startActivityForResult的时候,传入FILE_CHOOSER_REQUEST_CODE,所有在Activity中需要对requestCode为FILE_CHOOSER_REQUEST_CODE的结果进行处理,简单说明如下:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == FILE_CHOOSER_REQUEST_CODE) {}
}
详细代码如下
页面布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><WebViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="visible" /></LinearLayout>
View代码
private void showFileTrans() {Dialog dialog = new Dialog(mActivity);dialog.setContentView(R.layout.dialog_webview);dialog.setCancelable(true);dialog.setCanceledOnTouchOutside(true);Window window = dialog.getWindow();if (window != null) {WindowManager.LayoutParams params = window.getAttributes();DisplayMetrics displayMetrics = new DisplayMetrics();window.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);int screenWidth = displayMetrics.widthPixels;int screenHeight = displayMetrics.heightPixels;int minWidth = (int) (280 * mActivity.getResources().getDisplayMetrics().density);int maxWidth = (int) (screenWidth * 0.8);int dialogWidth = Math.min(maxWidth, Math.max(minWidth, (int) (320 * mActivity.getResources().getDisplayMetrics().density)));params.width = dialogWidth;params.height = (int) (screenHeight * 0.8); params.gravity = Gravity.CENTER;window.setAttributes(params);}WebView webView = dialog.findViewById(R.id.webview);WebSettings settings = webView.getSettings();settings.setJavaScriptEnabled(true);settings.setDomStorageEnabled(true);settings.setAllowFileAccess(true); settings.setAllowContentAccess(true); settings.setLoadWithOverviewMode(true);settings.setUseWideViewPort(true);settings.setBuiltInZoomControls(true);settings.setDisplayZoomControls(false);settings.setSupportZoom(true);settings.setDefaultTextEncodingName("utf-8");settings.setCacheMode(WebSettings.LOAD_DEFAULT);settings.setMediaPlaybackRequiresUserGesture(false);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);}webView.setWebViewClient(new WebViewClient());webView.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {GameSDKActivity.mFilePathCallback = filePathCallback;Intent intent = fileChooserParams.createIntent();try {mActivity.startActivityForResult(intent, GameSDKActivity.FILE_CHOOSER_REQUEST_CODE);} catch (ActivityNotFoundException e) {GameSDKActivity.mFilePathCallback = null;Toast.makeText(mActivity, "无法打开文件选择器", Toast.LENGTH_SHORT).show();return false;}return true;}});webView.loadUrl("http://xxxxxxx");dialog.show();
}
Activity代码
public static ValueCallback<Uri[]> mFilePathCallback;
public static final int FILE_CHOOSER_REQUEST_CODE = 10001;@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == FILE_CHOOSER_REQUEST_CODE) {if (mFilePathCallback != null) {Uri[] results = null;if (resultCode == Activity.RESULT_OK) {if (data == null) {Log.d("FileChooser", "data is null");} else {ClipData clipData = data.getClipData();if (clipData != null) {int count = clipData.getItemCount();results = new Uri[count];for (int i = 0; i < count; i++) {results[i] = clipData.getItemAt(i).getUri();Log.d("FileChooser", "Selected file: " + results[i]);}} else if (data.getData() != null) {results = new Uri[]{data.getData()};Log.d("FileChooser", "Selected file: " + results[0]);}}} else {Log.d("FileChooser", "User cancelled file selection");}mFilePathCallback.onReceiveValue(results);mFilePathCallback = null;}}}