1. 程式人生 > >H5頁面呼叫android上傳,支援input-file

H5頁面呼叫android上傳,支援input-file

這只是權宜之計,送給需要的小夥伴,因為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());
	}
}