zoukankan      html  css  js  c++  java
  • WebView使用input file控件打开相册上传图片

    使用 WebView 直接用 控件选择相册图片

    package com.moguzhuan.android.zhuan;
    
    import android.annotation.TargetApi;
    import android.app.Activity;
    import android.content.ClipData;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.webkit.ValueCallback;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    
    
    public class MainActivity extends AppCompatActivity {
    
        private final static String TAG = "MainActivity";
    
        private String TMP_URL = "http://m.zhuan.com";
        private WebView webview;
        private String MIME = "image/*";
    
        private ValueCallback<Uri> mUploadMessage;
        private ValueCallback<Uri[]> mUploadCallbackAboveL;
    
        private final static int FILECHOOSER_RESULTCODE = 1;
    
    
        private void assignViews() {
            webview = (WebView) findViewById(R.id.webview);
            WebSettings settings = webview.getSettings();
            settings.setUseWideViewPort(true);
            settings.setLoadWithOverviewMode(true);
            settings.setJavaScriptEnabled(true);
            settings.setSupportZoom(true);
            webview.setVerticalScrollBarEnabled(true);
            webview.setHorizontalScrollBarEnabled(true);
            webview.setWebViewClient(new WebViewClient(){
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    // TODO Auto-generated method stub
                    //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
                    view.loadUrl(url);
                    return true;
                }
            });
            webview.setWebChromeClient(new WebChromeClient(){
                // For Android 3.0+
                public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                    Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg)");
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType(MIME);
                    MainActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
                }
    
                // For Android 3.0+
                public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {
                    Log.d(TAG, "openFileChoose( ValueCallback uploadMsg, String acceptType )");
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType(MIME);
                    MainActivity.this.startActivityForResult(
                            Intent.createChooser(i, "File Browser"),
                            FILECHOOSER_RESULTCODE);
                }
                //For Android 4.1
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
                    Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg, String acceptType, String capture)");
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType(MIME);
                    MainActivity.this.startActivityForResult( Intent.createChooser( i, "File Browser" ), MainActivity.FILECHOOSER_RESULTCODE );
                }
                // For Android 5.0+
                public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
                    Log.d(TAG, "onShowFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)");
                    mUploadCallbackAboveL = filePathCallback;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType(MIME);
                    MainActivity.this.startActivityForResult(
                            Intent.createChooser(i, "File Browser"),
                            FILECHOOSER_RESULTCODE);
                    return true;
                }
            });
            webview.loadUrl(TMP_URL);
    
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            assignViews();
        }
    
        @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;
                }
            }
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        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();
                        }
                    }
    
                    if (dataString != null)
                        results = new Uri[]{Uri.parse(dataString)};
                }
            }
            mUploadCallbackAboveL.onReceiveValue(results);
            mUploadCallbackAboveL = null;
            return;
        }
    }

    assignViews 方法中需增加一段代码,让app使用默认的浏览器直接打开链接,否则会弹出选择第三方浏览器的窗口:

    webview.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            // TODO Auto-generated method stub
            //返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
            view.loadUrl(url);
            return true;
        }
    });

    参考:
    https://gitcafe.com/saymagic/Webviewdemo/blob/master/app/src/main/java/cn/saymagic/webviewdemo/MainActivity.java

    在 AndroidManifest.xml 中添加网络访问权限:

    <uses-permission android:name="android.permission.INTERNET" />

    另外,需要注意一点就是通过这种方式上传的图片,在服务端接收到的 MIME 类型为

    application/octet-stream

    而不是一般的 image/jpeg 这种哦

  • 相关阅读:
    数据库表关联分析
    java异常信息分析
    版本问题
    项目
    EXCEL工具
    项目安全
    服务器环境
    vue公共
    Linux 文件权限
    nginx
  • 原文地址:https://www.cnblogs.com/zhouzme/p/5758392.html
Copyright © 2011-2022 走看看