精华内容
下载资源
问答
  • Android webview打开相册选择图片并上传到服务器,(亲测可用)
  • Android WebView 打开相册

    2021-05-14 15:07:02
    之前我记得ios是可以直接打开的 但是Android不行 也是找了很多资料 经过不懈的努力 终于终于终于。。。嗯 呦西 1.了解类型 image 图片类型 video 视频类型 */* 包含以上俩种 2.上代码 private ...

    前言

    之前有过这个需求,但是好久没写了 忘了 这次算是一个记录吧 也写给迷茫中的你

    之前我记得ios是可以直接打开的 但是Android不行 也是找了很多资料 经过不懈的努力 终于终于终于。。。嗯 呦西

     

    1.了解类型

    image 图片类型

    video 视频类型

    */* 包含以上俩种

     

    2.上代码

    private ValueCallback<Uri> mUploadMessage;
    private ValueCallback<Uri[]> mUploadCallbackAboveL;
    private final static int FILECHOOSER_RESULTCODE = 101;

    在WebView展示页面 创建 

    WebChromeClient 对象
    private final WebChromeClient mWebViewClient = new WebChromeClient() {
    
        @Override
        public void openFileChooser(ValueCallback<Uri> valueCallback, String s, String s1) {
            //Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg, String acceptType, String capture)");
            mUploadMessage = valueCallback;
            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            //如果选择图片就image 视频就video
            i.setType("*/*");
            CustomerServiceWebViewActivity.this.startActivityForResult(Intent.createChooser(i, "File Browser"),
                    FILECHOOSER_RESULTCODE);
    
        }
    };

    重写 openFileChooser方法 

    接收结果

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage && null == mUploadCallbackAboveL) return;
            Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
            if (mUploadCallbackAboveL != null) {
                onActivityResultAboveL(requestCode, resultCode, data);
            } else if (mUploadMessage != null) {
                mUploadMessage.onReceiveValue(result);
                mUploadMessage = null;
            }
        }
    }

    选择多张图片

    private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {
        if (requestCode != FILECHOOSER_RESULTCODE
                || mUploadCallbackAboveL == null) {
            return;
        }
        Uri[] results = null;
        if (resultCode == Activity.RESULT_OK) {
            if (data == null) {
            } else {
                String dataString = data.getDataString();
                ClipData clipData = data.getClipData();
                if (clipData != null) {
                    results = new Uri[clipData.getItemCount()];
                    for (int i = 0; i < clipData.getItemCount(); i++) {
                        ClipData.Item item = clipData.getItemAt(i);
                        results[i] = item.getUri();
                        //Log.e(TAG, "onActivityResultAboveL: " + results[i].getPath());
                    }
                }
                if (dataString != null)
                    results = new Uri[]{Uri.parse(dataString)};
                //Log.e(TAG, "onActivityResultAboveL: " + results.length);
            }
        }
        mUploadCallbackAboveL.onReceiveValue(results);
        mUploadCallbackAboveL = null;
        return;
    }

    最后把WebChromeClient设置给WebView

    mWebView.setWebChromeClient(mWebViewClient);

     

    结束。

     

    展开全文
  • 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;
                }
            });
     
    
    展开全文
  • 但是打开相册后看不清取消按钮,因为白底和白字。 尝试了几次,还是把相册的导航栏设置成和本app一样的样色就好了;在web嵌入的VC里面加入这段代码:   UINavigationBar.appearance().barTintColor = ...
  • 本文示例代码可在微信公众号「01二进制」后台回复「WebView」查看下载前言我们知道在开发 Native App 时经常会有打开网页的需求,可供的选择通常只有两种:在 App 内部打开网页通过调用系统自带浏览器打开网页以「...
  • 一般在项目中与js交互,可能会遇到上传文件图片等操作,避免不了一些坑,下面简单说一下,Android 在不同版本中webView调用相机,选择相册的方法是不一样的,3.0以下的调用 public void openFileChooser...
  • Android webView 调用相册

    2019-03-12 11:33:20
    public boolean onShowFileChooser(WebView webView, ValueCallback[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) { // uploadMessageAboveL = filePathCallback; ...
  • 关于android webview调用相册和相机

    千次阅读 2015-12-10 13:54:45
    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...
  • 秦子帅明确目标,每天进步一点点.....作者| 星星y地址|https://www.jianshu.com/p/dae373ca9f0f前言哎,Flutter真香啊在用移动设备加载H5页面时...在Android原生WebView中,我们可以在WebViewClient中的shouldInterc...
  • 项目中使用了打开相册选择照片上传功能,遇到了个坑,开发测试时(未混淆),能正常打相册,当混淆打包提交测试时,发现点击html中的按钮没反应。初步推测是混淆问题了,首先排除java跟js通信时的混淆,因为这个问题...
  • 相信大家在网上肯定有很多文章关于webview 调用相册相机失败问题 也有很多坑 所以我就不一一类举了,小楼也是踩了很多坑 ,总结了很多才告知给各位,希望大家少踩坑,这里包括对android 7.0 的适配 关于Android6.0...
  • Webview打开本地图片文件选择解决方案

    万次阅读 多人点赞 2015-10-15 16:20:33
    Webview打开本地图片选择器解决方案Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃。经过测试和完善,最终其在各个版本上都能完美工作,特此开源出来,...
  • 也是相当无奈,目前发现了好多android端与ios端webView的异同。 android端与ios确的不同大致包括: 1:android不能直接打开html的下载文件,需要先下载保存本地在打开本地文件 2:android不能直接打开pdf文件,同样...
  • Webview打开本地文件、图片选择的解决方案。版本兼容问题
  • 长话短说,我们Android手机通过WebView打开H5页面。如果网页需要打开手机相册选取图片,不做任何处理的话是不可以选取的。我们需要重写WebChromeClient类的部分方法 第一步,重写方法(WebChromeClient类中的) 几个...
  • 如果我正确理解你的问题你想点击网页上的按钮(html)打开Android设备相机?在此假设的基础上,您需要执行以下操作使用JavascriptInterfacepublic class WebVCamBridgeInterface {/*** Javacript function to start ...
  • webview 调用相册权限和js地图权限

    千次阅读 2017-01-02 03:02:05
     //下面是web调用相册的部分。然后有2个setWebChromeClient冲突。单独放2个功能是可以实现的,但一起的话,就只能实现一个。  mWebView.setWebChromeClient(new ReWebChomeClient(this)); // mWebView....
  • 1.Fileprovider用于解决高版本的android系统出现的调用相机和相册不成功的问题 ①. 权限申请 建议在你的BaseActivity中去增加两个方法。 public void onPermissionRequests(String permission, ...
  • Android中使用WebView调用系统相机和相册,但是4.4的手机不能使用
  • Android webview支持type="file" 打开相机和相册webview调起上传文件的
  • Android的WebView调用本地相册

    千次阅读 2018-05-05 16:51:29
    首先要知道android本身的WebView是并不支持调用手机文件并上传的,其次WebView的内核在android每次更新的时候都是不太一样的,也是够坑爹的;不过需求又不能改,H5需要调用系统相册,还好最后还是找到方法解决了,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,449
精华内容 979
关键字:

webview打开相册