这只是权宜之计,送给需要的小伙伴,因为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());
}
}