问题:
- webview无法调用拍照问题
- http不显示图片问题
- 与js交互
- 返回上一层界面
Android的原生浏览器并不支持H5调用拍照与相册,所以在web视图使用中,需要使用的Android的代码去调用。
代码如下:
import android.Manifest;
import android.annotation.TargetApi;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Message;
import android.provider.MediaStore;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.Toast;
import com.lebo.sdk.LogTool;
import com.lebo.smarkparking.AppApplication;
import com.lebo.smarkparking.MainActivity;
import com.lebo.smarkparking.R;
import com.lebo.smarkparking.components.LEBOTittleBar;
import java.io.File;
public class IntelligentLifeWebActivity extends BaseActivity {
public ValueCallback<Uri> mUploadMessage;
public ValueCallback<Uri[]> mUploadMessageForAndroid5;
public final static int FILECHOOSER_RESULTCODE = 1;
public final static int FILECHOOSER_RESULTCODE_FOR_ANDROID_5 = 2;
private String mCameraFilePath;
Uri uri;
WebView mywebview;
private String presentUrl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_intelligentlife);
initView();
}
public void initView() {
LEBOTittleBar LEBOTitle = (LEBOTittleBar) findViewById(R.id.LEBOTitle);
LEBOTitle.setTittle(getIntent().getStringExtra("name"));
LEBOTitle.setLeftBtnImgResource(R.mipmap.back);
LEBOTitle.setLeftBtnListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//getIntent().getStringExtra("url") 初始化url 返回处理
if(presentUrl != getIntent().getStringExtra("url")){
mywebview.goBack();// 返回前一个页面
} else {
finish();
}
}
});
mywebview = (WebView) findViewById(R.id.webview);
//与js交互事件设置
mywebview.addJavascriptInterface(new JSClick(), "auth");
WebSettings settings = mywebview.getSettings();
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
settings.setDomStorageEnabled(true);
settings.setDefaultTextEncodingName("UTF-8");
settings.setAllowContentAccess(true); // 是否可访问Content Provider的资源,默认值 true
settings.setAllowFileAccess(true); // 是否可访问本地文件,默认值 true
// 是否允许通过file url加载的Javascript读取本地文件,默认值 false
settings.setAllowFileAccessFromFileURLs(false);
// 是否允许通过file url加载的Javascript读取全部资源(包括文件,http,https),默认值 false
settings.setAllowUniversalAccessFromFileURLs(false);
settings.setJavaScriptCanOpenWindowsAutomatically(true);//允许js弹出窗口
//开启JavaScript支持
settings.setJavaScriptEnabled(true);
// 支持缩放
settings.setSupportZoom(true);
mywebview.setLongClickable(true);
mywebview.setScrollbarFadingEnabled(true);
mywebview.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
mywebview.setDrawingCacheEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
mywebview.loadUrl(getIntent().getStringExtra("url"));
mywebview.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
presentUrl = url;
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
}
});
//图片处理方法
mywebview.setWebChromeClient(
new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {// 载入进度改变而触发
super.onProgressChanged(view, progress);
}
//扩展支持alert事件 webview不会展示Alert 所以需要我们自己展示
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
// AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext());
// builder.setTitle("xxx提示").setMessage(message).setPositiveButton("确定", null);
// builder.setCancelable(false);
// AlertDialog dialog = builder.create();
// dialog.show();
// result.confirm();
return true;
}
//扩展浏览器上传文件
//3.0++版本
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
openFileChooserImpl(uploadMsg);
}
//3.0--版本
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
openFileChooserImpl(uploadMsg);
}
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooserImpl(uploadMsg);
}
// For Android > 5.0
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) {
openFileChooserImplForAndroid5(uploadMsg);
return true;
}
}
);
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001);
}
public class JSClick{
@JavascriptInterface
public void goBack(){
finish();
}
}
/**
* 5.0以上的
*
* @param uploadMsg
*/
private void openFileChooserImplForAndroid5(ValueCallback<Uri[]> uploadMsg) {
mUploadMessageForAndroid5 = uploadMsg;
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType("image/*");
Intent xxx = createChooserIntent(createCameraIntent());
xxx.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
startActivityForResult(xxx, FILECHOOSER_RESULTCODE_FOR_ANDROID_5);
}
/**
* 5.0以下
*
* @param uploadMsg
*/
private void openFileChooserImpl(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
Intent xxx = createChooserIntent(createCameraIntent());
xxx.putExtra(Intent.EXTRA_INTENT, i);
startActivityForResult(xxx, FILECHOOSER_RESULTCODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == FILECHOOSER_RESULTCODE) {
if (null == mUploadMessage)
return;
Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
//5.0以下拍照是不是也要像5.0以上那样处理拍照的事件呢?自己测试
} else if (requestCode == FILECHOOSER_RESULTCODE_FOR_ANDROID_5) {
//针对5.0的
if (null == mUploadMessageForAndroid5)
return;
Uri result = (intent == null || resultCode != RESULT_OK) ? null : intent.getData();
if (result != null) {
//相册或者文件
mUploadMessageForAndroid5.onReceiveValue(new Uri[]{result});
} else {
try {
File file = new File(mCameraFilePath);
//判断此路径是否存在 存在提供给网页
if (file.exists()) {
mUploadMessageForAndroid5.onReceiveValue(new Uri[]{FileProvider.getUriForFile(getApplicationContext(), "com.jph.takephoto.fileprovider", file)});
return;
}
} catch (Exception e) {
e.printStackTrace();
}
//这个必须调用 否则第二次点击 不会再出现弹窗提示
mUploadMessageForAndroid5.onReceiveValue(new Uri[]{});
}
mUploadMessageForAndroid5 = null;
}
}
private Intent createCameraIntent() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// File externalDataDir = Environment.getExternalStorageDirectory();
// File cameraDataDir = new File(externalDataDir.getAbsolutePath() +
// File.separator + "BrowserPhotos");
// cameraDataDir.mkdirs();
mCameraFilePath = getPhotoFilePath(getPhotoFileName());
File file = new File(mCameraFilePath);
uri = FileProvider.getUriForFile(getApplicationContext(), "com.jph.takephoto.fileprovider", file);//通过FileProvider创建一个content类型的Uri
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
return cameraIntent;
}
public static String getPhotoFilePath(String fileName) {
return PICTURE_SAVE_PATH + File.separatorChar + fileName;
}
public static String getPhotoFileName() {
return "head_" + "lebo" + "_" + System.currentTimeMillis() + ".jpg";
}
public static final String ROOT_DES = "/lebo";
public static final String PIC_DES = "/Picture";
public static final String BASE_EXTERNAL_SAVE_PATH = Environment.getExternalStorageDirectory() + ROOT_DES;
public static final String PICTURE_SAVE_PATH = BASE_EXTERNAL_SAVE_PATH + PIC_DES;
private Intent createChooserIntent(Intent... intents) {
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intents);
chooser.putExtra(Intent.EXTRA_TITLE, "选择图片来源");
return chooser;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
if(presentUrl != getIntent().getStringExtra("url")){
mywebview.goBack();// 返回前一个页面
return true;
} else {
finish();
}
}
return super.onKeyDown(keyCode, event);
}
@Override
public EditText[] getHideInputEditTexts() {
return new EditText[0];
}
@Override
public void handleMessege(Message msg) {
}
}