精华内容
下载资源
问答
  • Android webview打开相册选择图片并上传到服务器,(亲测可用)
  • package cn.hellomrhuang.webapp.webview;import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content....
    package cn.hellomrhuang.webapp.webview;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Build;
    import android.provider.MediaStore;
    import android.support.annotation.RequiresApi;
    import android.util.Log;
    import android.webkit.GeolocationPermissions;
    import android.webkit.JsResult;
    import android.webkit.ValueCallback;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebStorage;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    
    import cn.hellomrhuang.webapp.R;
    
    
    /**
     * Created by bao on 2017/3/3.
     */
    
    public class WebViewHelper {
    
        private static final int FILECHOOSER_RESULTCODE_5 = 12;
        private static final int FILECHOOSER_RESULTCODE = 13;
        private WebChromeClient.FileChooserParams  mfileChooserParams;
        ValueCallback<Uri[]> umUploadMessages;
        ValueCallback<Uri> mUploadMessage;
        private Activity mact;
    
        private WebView mWebView;
        private HelperWebViewClient listener;
    
        public WebViewHelper(Activity activity) {
            mact = activity;
        }
    
        public WebViewHelper(Activity activity, WebView webView) {
            mact = activity;
            mWebView = webView;
        }
    
    
        public void setWebViewClient(HelperWebViewClient listener) {
            this.listener = listener;
        }
    
        @SuppressLint("SetJavaScriptEnabled")
        public void init(String url) {
            if(mWebView== null){
                mWebView = (WebView) mact.findViewById(R.id.webView);
            }
    
    
            mWebView.loadUrl(url);
    
            WebSettings webSettings = mWebView.getSettings();
    
    
    
            webSettings.setJavaScriptEnabled(true);
            webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
            // 启用数据库
            webSettings.setDatabaseEnabled(true);
            String dir = mact.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
            // 使用localStorage则必须打开
            webSettings.setDomStorageEnabled(true);
            // 启用地理定位
            webSettings.setGeolocationEnabled(true);
            // 设置定位的数据库路径
            webSettings.setGeolocationDatabasePath(dir);
            // 开启应用程序缓存
            webSettings.setAppCacheEnabled(true);
            String diri = mact.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath();
            // 设置应用缓存的路径
            webSettings.setAppCachePath(diri);
            // 设置缓存的模式
            webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
            webSettings.setAllowFileAccess(true);
            webSettings.setAllowContentAccess(true);
            webSettings.setLoadsImagesAutomatically(true);
            //用WebView显示图片,可使用这个参数 设置网页布局类型
            webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
            webSettings.setSupportZoom(false);// 支持缩放
            webSettings.setBuiltInZoomControls(false);// 缩放控件
    
            // 设置WebViewClient
            mWebView.setWebViewClient(new WebViewClient() {
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
    
                    if (listener != null) {
                        listener.onReceivedTitle(view, url);
                    }
                    view.loadUrl(url);
                    return true;
                }
    
                public void onPageFinished(WebView view, String url) {
                    super.onPageFinished(view, url);
    
    
                }
    
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    super.onPageStarted(view, url, favicon);
    
    
                    //dialog.show();
                }
    
                @Override
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                    // TODO Auto-generated method stub
                    super.onReceivedError(view, errorCode, description, failingUrl);
    
    
                }
    
                public void onConsoleMessage(String message, int lineNumber, String sourceID) {
                    Log.d("MyApplication", message + " -- From line " + lineNumber + " of " + sourceID);
    
                }
            });
    
            // 设置WebChromeClient
            mWebView.setWebChromeClient(new WebChromeClient() {
    
    
                // 扩充缓存的容量
                public void onReachedMaxAppCacheSize(long spaceNeeded, long totalUsedQuota,
                                                     WebStorage.QuotaUpdater quotaUpdater) {
                    quotaUpdater.updateQuota(spaceNeeded * 2);
                }
    
                // 配置权限(同样在WebChromeClient中实现)
                public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
                    callback.invoke(origin, true, false);
                    super.onGeolocationPermissionsShowPrompt(origin, callback);
                }
    
                // 扩充数据库的容量(在WebChromeClinet中实现)
                public void onExceededDatabaseQuota(String url, String databaseIdentifier, long currentQuota,
                                                    long estimatedSize, long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater) {
                    quotaUpdater.updateQuota(estimatedSize * 2);
                }
    
                // 处理javascript中的alert
                public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
                    // 构建一个Builder来显示网页中的对话框
                    AlertDialog.Builder builder = new AlertDialog.Builder(mact);
                    builder.setTitle("Alert");
                    builder.setMessage(message);
                    builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            result.confirm();
                        }
                    });
                    builder.setCancelable(false);
                    builder.create();
                    builder.show();
                    return true;
                }
    
    
    
                // 处理javascript中的confirm
                public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(mact);
                    builder.setTitle("confirm");
                    builder.setMessage(message);
                    builder.setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            result.confirm();
                        }
                    });
                    builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            result.cancel();
                        }
                    });
                    builder.setCancelable(false);
                    builder.create();
                    builder.show();
                    return true;
                }
                @Override
                public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
    
                    umUploadMessages = filePathCallback;
                    mfileChooserParams = fileChooserParams;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.putExtra("return-data", true);
                    i.setType("image/*");
                    i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            "image/*");
                    mact.startActivityForResult(Intent.createChooser(i, "选择相册"),
                            FILECHOOSER_RESULTCODE_5);
                    return true;
                }
    
                // For Android 3.0
                public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.putExtra("return-data", true);
                    i.setType("image/*");
                    i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            "image/*");
    
                    mact.startActivityForResult(Intent.createChooser(i, "选择相册"),
                            FILECHOOSER_RESULTCODE);
                }
    
                // For Android > 4.1
                public void openFileChooser(ValueCallback<Uri> uploadMsg,
                                            String acceptType, String capture) {
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.putExtra("return-data", true);
                    i.setType("image/*");
                    i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            "image/*");
                    mact.startActivityForResult(Intent.createChooser(i, "选择相册"),
                            FILECHOOSER_RESULTCODE);
                }
    
                // Andorid 3.0 +
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.putExtra("return-data", true);
                    i.setType("image/*");
                    i.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            "image/*");
                    mact.startActivityForResult(Intent.createChooser(i, "选择相册"),
                            FILECHOOSER_RESULTCODE);
                }
    
    
    
                @Override
                // 设置网页加载的进度条
                public void onProgressChanged(WebView view, int newProgress) {
                    super.onProgressChanged(view, newProgress);
                    Log.i("aaa", newProgress + "");
                    if (listener != null) {
                        listener.onProgressChanged(view, newProgress);
                    }
    
    
                }
    
                // 设置应用程序的标题title
                public void onReceivedTitle(WebView view, String title) {
                    super.onReceivedTitle(view, title);
    
                    if (listener != null) {
                        listener.onReceivedTitle(view, title);
                    }
                }
            });
    
        }
    
    
        public void goBack() {
          if (mWebView.canGoBack()) {
                mWebView.goBack();
    
            } else {
                mact.finish();
            }
        }
    
        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == FILECHOOSER_RESULTCODE) {
                if (null == mUploadMessage) return;
                if (null == data){
                    mUploadMessage.onReceiveValue(null);
                    mUploadMessage = null;
                }else{
                    Uri result = data == null || resultCode != Activity.RESULT_OK ? null
                            : data.getData();
                    mUploadMessage.onReceiveValue(result);
                    mUploadMessage = null;
                }
            }else  if (requestCode == FILECHOOSER_RESULTCODE_5){// 5.0适配,主要是因为5.0的返回参数不同。
                // 处理5.0的callback
                if (umUploadMessages != null) {
                    if (null != data) {
    // 5.0的处理方式不同,要注意。
                        ArrayList<String> resultList = data
                                .getStringArrayListExtra("data");
    
                        umUploadMessages.onReceiveValue(
                                mfileChooserParams.parseResult(resultCode, data));
                        umUploadMessages = null;
                    } else {
                        umUploadMessages.onReceiveValue(null);
                    }
                }
            }
        }
    
        public interface HelperWebViewClient {
            void onReceivedTitle(WebView view, String title);
    
            void onProgressChanged(WebView view, int newProgress);
    
            void shouldOverrideUrlLoading(WebView view, String url);
        }
    }
    
    展开全文
  • WebView 打开本地相册

    2016-09-01 15:37:30
    由于是在web view里打开本地相册进行上传 ,之前没有作过, 经过一番研究 终于搞定。 正文 查看官方文档 发现有这样一个api  public boolean onShowFileChooser(WebView webView, ValueCallback ...

    前言

    最近在开发web app 要实现一个功能 就是在上传图片(上传图片很简单)。

    由于是在web view里打开本地相册进行上传 ,之前没有作过,

    经过一番研究 终于搞定。

    正文

    查看官方文档 发现有这样一个api 
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) 

    详情请查询官网文档

    重写该方法即可。

    不想写了 直接贴代码


    public class HWebChromeClient extends WebChromeClient {
    
        public static ValueCallback<Uri[]> filePathCallbackT;
        private Activity context;
    
        public HWebChromeClient(Activity context) {
            this.context = context;
        }
    
        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
            filePathCallbackT = filePathCallback;
            //打开相册
            IntentUtils.openImage(context);
            return true;
        }
    }
    



    展开全文
  • 实现在WebView点击打开手机相册功能

    千次阅读 2018-03-26 15:22:06
    那在WebView打开相册的功能是要怎样实现呢? 答案就是在webview.setWebChromeClient()中实现openFileChooser()方法,具体代码如下: webView.setWebChromeClient(new WebChromeClient() { @Override ...

    在日常开发中,WebView可能需要点击上传一些图片。

    那在WebView打开相册的功能是要怎样实现呢?

    答案就是在webview.setWebChromeClient()中实现openFileChooser()方法,具体代码如下:

    webView.setWebChromeClient(new WebChromeClient() {
                @Override
                public void onProgressChanged(WebView view, int newProgress) {
                    super.onProgressChanged(view, newProgress);
                }
    
                @Override
                public boolean onJsBeforeUnload(WebView view, String url, String message, final JsResult result) {
                    return super.onJsBeforeUnload(view, url, message, result);               
                }
    
    	    openFileChooser(vc, acceptType, "filesystem");
    			
                // For Android  > 4.1.1
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                    final String mediaSourceValueFileSystem = "filesystem";
                    final String mediaSourceKey = "capture";
                    final String imageMimeType = "image/*";
    
                    if (_uploadMessage != null) {
                        return;
                    }
                    _uploadMessage = uploadMsg;
                    if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)
                            && _activity.getExternalCacheDir() != null) {
                        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
                        intent.addCategory(Intent.CATEGORY_OPENABLE);
                        intent.putExtra(DOCUMETS_UI_POLICY, DOCUMENTS_UI_POLICY_SEC);
                        intent.setType(imageMimeType);
                        startActivityForResult(intent, REQUEST_WEBVIEW_GET_PHOTO);
                    }              
                }
    
                // Android > 5.0.1
                public boolean onShowFileChooser(
                        WebView webView, ValueCallback<Uri[]> filePathCallback,
                        FileChooserParams fileChooserParams) {
                    String acceptTypes[] = fileChooserParams.getAcceptTypes();
    
                    String acceptType = "";
                    for (String acceptType1 : acceptTypes) {
                        if (acceptType1 != null && acceptType1.length() != 0)
                            acceptType += acceptType1 + ";";
                    }
                    if (acceptType.length() == 0)
                        acceptType = "*/*";
    
                    final ValueCallback<Uri[]> finalFilePathCallback = filePathCallback;
    
                    ValueCallback<Uri> vc = new ValueCallback<Uri>() {
    
                        @Override
                        public void onReceiveValue(Uri value) {
                            Uri[] result;
                            if (value != null)
                                result = new Uri[]{value};
                            else
                                result = null;
    
                            finalFilePathCallback.onReceiveValue(result);
                        }
                    };
    
                    return true;
                }
            });
     
    
    展开全文
  • Android 开发过程中 WebView 的使用比较广泛,常用来加载网页,比如使用 WebView 加载新闻页面、使用 WebView 打开本应用的链接以及用 WebView 显示支付信息页面等,那么如何 Android 开发中如何与 WebView 中的内容...

    v2-d29643962553159353fcd2c051ff3907_1440w.jpg?source=172ae18b
    原文首发于微信公众号:jzman-blog,欢迎关注交流!

    Android 开发过程中 WebView 的使用比较广泛,常用来加载网页,比如使用 WebView 加载新闻页面、使用 WebView 打开本应用的链接以及用 WebView 显示支付信息页面等,那么如何 Android 开发中如何与 WebView 中的内容进行交互呢,这种交互主要就是 Java 与 JavaScript 之间的互相调用。下面实现一下如何响应 WebView 中图片的点击事件:

    1. 关键方法
    2. 具体实现
    3. 显示效果

    关键方法

    1. setJavaScriptEnabled()

    设置 WebView 是否支持 JavaScript 脚本,默认不支持。

    public 

    2. addJavascriptInterface()

    注入 Java 对象到 WebView 中,该对象将会被注入到 JavaScript 主框架的上下文中,允许使用映射的 Java 对象的名称从 JavaScript 访问该对象的方法,且只可以访问添加 @JavascriptInterface 注解的公共方法才可以从 JavaScript 中访问,可在 API level 17 以上使用这样使用。

    如果 API level 16 以及更早的 API, 所有的公共方法(包括继承的)都可以从 JavaScript 访问,可能会出现页面重新加载前,Java 对象还未注入到 JavaScript 中的情况,导致调用 Java 方法无效果。

    重要声明:该方法允许 JavaScript 控制应用程序,功能非常强大,但是如果 API level 16及更早的 API 版本将会存在一定的风险,比较安全的做法是该方法尽量在 Android 4.2 及以上版本使用该方法,如果是更低的版本 JavaScript 可以使用反射来访问所注入对象的公共字段,在 WebView 中使用该方法可能会有不受信任的内容被攻击者利用,让应用程序去执行 Java 代码,要注意线程安全,Java 对象的字段不可访问,Android 5.0 以上,所注入的 Java 对象的方法是有一定数量限制的。

    public 

    具体实现

    大致思路就是让 WebView 中的图片响应点击事件,然后调用 Android 界面来显示被点击的图片,实现步骤如下: 1. WebView 设置支持 JavaScript 脚本; 2. 创建与 JavaScrpt 通信的类及供 JavaScript 调用的方法; 3. 加载 WebView 中要显示的内容; 4. 使用 addJavascriptInterface 方法将 Java 对象映射到 JavaScript 中; 5. 在 JavaScript 中调用映射对象的方法,打开显示图片的 Activity; 6. 调用 javaScript 中的方法。

    第一步:

    WebView 设置支持 JavaScript 脚本,如下:

    //设置支持JavaScript
    

    第二步:

    创建与 JavaScrpt 通信的类及供 JavaScript 调用的方法,如下:

    /**
    

    第三步:

    加载 WebView 要显示的内容,这里加载 aasets 目录下的 HTML 文件,如下:

    //加载 assets 目录下的 HTML 文件
    webView.loadUrl("file:///android_asset/index.html");

    第四步:

    使用 addJavascriptInterface 方法将 Java 对象映射到 JavaScript 中,如下:

    //注入Java对象并映射到JavaScript中
    

    第五步:

    在 JavaScript 中查找

    v2-3c40829a650f96ab57be6975d78f8601_b.jpg

    标签并在其点击事件里面调用其映射对象的方法打开显示图片的 Activity,如下:

    <

    第六步:

    调用 JavaScript 里面的方法,为保证调用时 Java 对象还未注入到 JavaScript 中,应该页面加载完成时调用 javaScript 的方法,如下:

    //设置 WebViewClient 监听相关事件
    

    显示效果

    v2-bad3045c48a2dd14f7a21aea6b13e284_b.jpg

    源码请参考:github,可以关注公众号:jzman-blog,一起交流学习。

    展开全文
  • 但是打开相册后看不清取消按钮,因为白底和白字。 尝试了几次,还是把相册的导航栏设置成和本app一样的样色就好了;在web嵌入的VC里面加入这段代码:   UINavigationBar.appearance().barTintColor = ...
  • android webView 调用系统相册和相机 这里我只展示选择图库的代码,调用相册和相机的完整代码到这里下载点击打开链接 private ValueCallback mFilePathCallback; private ValueCallback mUploadCallbackAboveL; @...
  • 使用 WebView 直接用 控件选择相册图片package com.moguzhuan.android.zhuan;import android.annotation.TargetApi; import android.app.Activity; import android.content.ClipData; import android.content.Intent...
  • 一般在项目中与js交互,可能会遇到上传文件图片等操作,避免不了一些坑,下面简单说一下,Android 在不同版本中webView调用相机,选择相册的方法是不一样的,3.0以下的调用 public void openFileChooser...
  • 也是相当无奈,目前发现了好多android端与ios端webView的异同。 android端与ios确的不同大致包括: 1:android不能直接打开html的下载文件,需要先下载保存本地在打开本地文件 2:android不能直接打开pdf文件,同样...
  • 项目中使用了打开相册选择照片上传功能,遇到了个坑,开发测试时(未混淆),能正常打相册,当混淆打包提交测试时,发现点击html中的按钮没反应。初步推测是混淆问题了,首先排除java跟js通信时的混淆,因为这个问题...
  • Android webview支持type="file" 打开相机和相册webview调起上传文件的
  • readme有说明...
  • 网页上的button定义 ...参考网址:http://stackoverflow.com/questions/4944102/android-webview-file-input-field-filechooser-doesnt-show-up  http://m0s-programming.blogspot.tw/2011/02/fil
  • 封装webview的常用配置和选择文件、打开相机、录音、打开本地相册的用法。【如果想要使用简单的预览功能,可以参考《MyBridgeWebViewDemo【集成JsBridge开源库的的封装的webview】》】 注意:如果使用选择文件、...
  • var list = new Array(); $(document).ready(function() { $("img").each(function(index,element){ list[index]=$(this).attr('src'); }); }); $("img").live("click", function(event) { ...
  • 1.app在Windows.rootViewController 下(rootViewController是一个NavigationController)push一个带WebView的Controller,WebView打开网页有一个调用系统相册的页面,这个时候可以正常调用。 2.app在Windows....
  • 既上一篇文章转载了知乎上一位作者的Android webview支持type=”file” 打开相机和相册,发现原来webview上传文件要这么处理,依葫芦画瓢,在测试机上(版本全是4.4的)都没问题,内心很是高兴,但是刚好测试人员有...
  • webview加载商城连接地址,系统webview的加载...速度快:相比系统webview的网页打开速度有30+%的提升; 省流量:使用云端优化技术使流量节省20+%; 更安全:安全问题可以在24小时内修复; 更稳定:...
  • 效果图: 搞了很久才压缩到2M以内了 测试环境的接口有问题上传失败了才 资源地址:http://download.csdn.net/detail/pkandroid/9674175另外此解决方案有个bug...—————————2016年11月5日18:33:47————

空空如也

空空如也

1 2 3 4
收藏数 70
精华内容 28
关键字:

webview打开相册