H5頁面呼叫android上傳,支援input-file
阿新 • • 發佈:2019-02-11
這只是權宜之計,送給需要的小夥伴,因為google在4.2上把一部分介面給去掉了,所以可能在4.2的裝置上上傳可能會有問題,三星的一部分手機把H5直接上傳遮蔽了,所以在三星的一部分裝置可能也會有問題。要想適配所有裝置,最好是H5調原生的JS上傳後,原生的JS在回撥H5的方法,告訴H5完成上傳,並把連結給進去。
import android.annotation.SuppressLint; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebSettings.PluginState; import android.webkit.WebView; import android.webkit.WebViewClient; import com.duobao.R; import com.duobao.duobaoproject.DoingDetailActivity; import com.duobao.duobaoproject.common.DialogTool; import com.duobao.duobaoproject.common.FileUtilTool; import com.duobao.duobaoproject.common.JsObject; import com.umeng.analytics.MobclickAgent; import net.tsz.afinal.FinalActivity; import net.tsz.afinal.annotation.view.ViewInject; import java.io.File; import java.lang.reflect.Method; /** * 待檔案上傳H5 * * */ @SuppressLint("SetJavaScriptEnabled") public class WebViewFileContentFragment extends Fragment { @ViewInject(id = R.id.wv) private WebView wv; private ValueCallback<Uri> mUploadMessage; private final static int FILECHOOSER_RESULTCODE = 1; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_darenapply_content, container, false); // 初始化註解 FinalActivity.initInjectedView(this, view); init(); return view; } private void init() { String uri = getActivity().getIntent().getStringExtra("uri"); initWebView(wv); wv.loadUrl(uri); } private final static Object methodInvoke(Object obj, String method, Class<?>[] parameterTypes, Object[] args) { try { Method m = obj.getClass().getMethod(method, new Class[] { boolean.class }); m.invoke(obj, args); } catch (Exception e) { e.printStackTrace(); } return null; } @SuppressLint({ "SetJavaScriptEnabled", "JavascriptInterface" }) private void initWebView(WebView webView) { WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setAllowFileAccess(true); settings.setDomStorageEnabled(true); settings.setCacheMode(WebSettings.LOAD_NO_CACHE); settings.setLoadWithOverviewMode(true); settings.setUseWideViewPort(true); settings.setSupportZoom(true); // settings.setPluginsEnabled(true); methodInvoke(settings, "setPluginsEnabled", new Class[] { boolean.class }, new Object[] { true }); // settings.setPluginState(PluginState.ON); methodInvoke(settings, "setPluginState", new Class[] { PluginState.class }, new Object[] { PluginState.ON }); // settings.setPluginsEnabled(true); methodInvoke(settings, "setPluginsEnabled", new Class[] { boolean.class }, new Object[] { true }); // settings.setAllowUniversalAccessFromFileURLs(true); methodInvoke(settings, "setAllowUniversalAccessFromFileURLs", new Class[] { boolean.class }, new Object[] { true }); // settings.setAllowFileAccessFromFileURLs(true); methodInvoke(settings, "setAllowFileAccessFromFileURLs", new Class[] { boolean.class }, new Object[] { true }); webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); webView.clearHistory(); webView.clearFormData(); webView.clearCache(true); webView.getSettings().setDefaultTextEncodingName("utf-8"); webView.setWebViewClient(new WebViewClient()); webView.setWebChromeClient(new MyWebChromeClient()); // webView.setDownloadListener(downloadListener); } @SuppressWarnings("static-access") @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { Uri result = null; if (resultCode == getActivity().RESULT_CANCELED) { } else { if (requestCode == FILECHOOSER_RESULTCODE) { if (null == mUploadMessage) { return; } result = intent.getData(); // ------------開始取得檔案真實路徑 String img_path = FileUtilTool.getRealFilePath(getActivity(), result); File file = new File(img_path); if (FileUtilTool.isChineseChar(img_path))// 中文處理 { Bitmap bitmap; String status = Environment.getExternalStorageState(); if (status.equalsIgnoreCase(Environment.MEDIA_MOUNTED)) { try { bitmap = MediaStore.Images.Media.getBitmap( getActivity().getContentResolver(), result); String tempFile = FileUtilTool.saveRomFile( getActivity(), System.currentTimeMillis() + ".jpg", bitmap); file = new File(tempFile); } catch (Exception e) { e.printStackTrace(); System.out.println("轉換異常"); } } else { DialogTool.toastShow(getActivity(), "沒有sd卡就不允許選擇路徑有中文的圖片"); } } result = Uri.fromFile(file); } } // ------------結束取得檔案真實路徑 mUploadMessage.onReceiveValue(result); mUploadMessage = null; } class MyWebChromeClient extends WebChromeClient { public void openFileChooser(ValueCallback<Uri> uploadMsg) { mUploadMessage = uploadMsg; Intent pickIntent = new Intent(Intent.ACTION_PICK, null); // 如果朋友們要限制上傳到伺服器的圖片型別時可以直接寫如:"image/jpeg 、 image/png等的型別" pickIntent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(pickIntent, FILECHOOSER_RESULTCODE); } @SuppressWarnings({ "rawtypes", "unchecked" }) public void openFileChooser(ValueCallback uploadMsg, String acceptType) { mUploadMessage = uploadMsg; Intent pickIntent = new Intent(Intent.ACTION_PICK, null); pickIntent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(pickIntent, FILECHOOSER_RESULTCODE); } public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) { mUploadMessage = uploadMsg; Intent pickIntent = new Intent(Intent.ACTION_PICK, null); // 如果朋友們要限制上傳到伺服器的圖片型別時可以直接寫如:"image/jpeg 、 image/png等的型別" pickIntent.setDataAndType( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(pickIntent, FILECHOOSER_RESULTCODE); } } public void onResume() { super.onResume(); MobclickAgent.onPageStart(WebViewFileContentFragment.class.getName()); // 統計頁面 } public void onPause() { super.onPause(); MobclickAgent.onPageEnd(WebViewFileContentFragment.class.getName()); } }