精华内容
下载资源
问答
  • 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);
        }
    }
    
    展开全文
  • 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);

     

    结束。

     

    展开全文
  • Android开发WebView配置,,兼容H5调用Android手机相册和拍照。并显示。 博客地址:https://blog.csdn.net/To_be_Designer/article/details/79914043
  • Android中使用WebView调用系统相机和相册,但是4.4的手机不能使用
  • 长话短说,我们Android手机通过WebView打开H5页面。如果网页需要打开手机相册选取图片,不做任何处理的话是不可以选取的。我们需要重写WebChromeClient类的部分方法 第一步,重写方法(WebChromeClient类中的) 几个...

    长话短说,我们Android手机通过WebView打开H5页面。如果网页需要打开手机相册选取图片,不做任何处理的话是不可以选取的。我们需要重写WebChromeClient类的部分方法

    第一步,重写方法(WebChromeClient类中的)

    几个变量:

    private ValueCallback<Uri>  mUploadMessage;
    private ValueCallback<Uri[]>  mUploadCallbackAboveL;
    private final static int FILECHOOSER_RESULTCODE = 123456;
    
    1、Android5.0之前
    
    public void openFileChooser(ValueCallback<Uri  uploadMsg) {
      mUploadMessage = uploadMsg;
      Intent i = new Intent(Intent.ACTION_GET_CONTENT);
      i.addCategory(Intent.CATEGORY_OPENABLE);
      i.setType("image/*");
      Html5Activity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"),
          FILECHOOSER_RESULTCODE);
    }
    
    public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
      mUploadMessage = uploadMsg;
      Intent i = new Intent(Intent.ACTION_GET_CONTENT);
      i.addCategory(Intent.CATEGORY_OPENABLE);
      i.setType("image/*");
      Html5Activity.this.startActivityForResult(
          Intent.createChooser(i, "File Browser"),
          FILECHOOSER_RESULTCODE);
    }
    
    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.setType("image/*");
      Html5Activity.this.startActivityForResult(Intent.createChooser(i, "File Browser"),
          FILECHOOSER_RESULTCODE);
    }
    

    注意:这三种方法名是一样的,只是在不同版本下会分别调用
    还有就是这个方法是重写这个WebChromeClient类里面的

    2、Android5.0之后
    @Override
    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]  filePathCallback, FileChooserParams fileChooserParams) {
      mUploadCallbackAboveL = filePathCallback;
      Intent i = new Intent(Intent.ACTION_GET_CONTENT);
      i.addCategory(Intent.CATEGORY_OPENABLE);
      i.setType("image/*");
      Html5Activity.this.startActivityForResult(
          Intent.createChooser(i, "File Browser"),
          FILECHOOSER_RESULTCODE);
      return true;
    }
    

    第二步

    onActivityResult 中处理

    @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;
    }
    

    第三步

    将上述代码直接复制到你自己封装的WebView中,大功告成~

    展开全文
  • 本人之前有类似功能的资源,但是系统定的下载积分太高,导致很多的Android开发者都在说我骗积分,我已将之前的资源给隐藏了,重新上传一份更加优质的资源,功能更加强大,如果觉得还OK的话,记得给个好评哦。
  • 一般在项目中与js交互,可能会遇到上传文件图片等操作,避免不了一些坑,下面简单说一下,Android 在不同版本中webView调用相机,选择相册的方法是不一样的,3.0以下的调用 public void openFileChooser...

    一般在项目中与js交互,可能会遇到上传文件图片等操作,避免不了一些坑,下面简单说一下,Android 在不同版本中webView调用相机,选择相册的方法是不一样的,3.0以下的调用

     public void openFileChooser(ValueCallback<Uri> uploadMsg)
    3.0以上:

      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType)

    4.4以下:

      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)

    5.0以上:

      public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams)


    这里有个漏洞,4.4.x的由于系统内核发生了改变,没法调用以上方法,现在仍然找不到解决办法,唯一的方法就是4.4直接使用手机浏览器打开,这个是可以的。

    那下面具体的贴下代码:

    继承自WebChromeClient,重写

    //3.0++
    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
        openFileChooserImpl(uploadMsg);
    }
    
    //3.0--
    public void openFileChooser(ValueCallback<Uri> uploadMsg) {
        openFileChooserImpl(uploadMsg);
    }
    
    //4.1
    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
    
        openFileChooserImpl(uploadMsg);
    }
    
    
    @Override
    public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
        openFileChooserImplForAndroid5(filePathCallback);
    
        return true;
    }
    


    外层定义接收返回值:

    private ValueCallback<Uri> mUploadMessage;
    private ValueCallback<Uri[]> mUploadCallbackAboveL;


    不同的版本调不同的方法:
    private void openFileChooserImplForAndroid5(ValueCallback<Uri[]> uploadMsg) {
        mUploadCallbackAboveL = uploadMsg;
        dispatchTakePictureIntent();
    }
    
    //5.0以下的掉用
    private void openFileChooserImpl(ValueCallback<Uri> uploadMsg) {
        mUploadMessage = uploadMsg;
        dispatchTakePictureIntent();
    }
    
    //拍照
    private void dispatchTakePictureIntent() {
        selectImgDialog();
    
    }

    我下面就把代码全部贴出来吧:

       private void takePhoto() {
            Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) {
                Uri imageUri = null;
                try {
                    imageUri = Uri.fromFile(createImageFile());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                startActivityForResult(takePictureIntent, FILECHOOSER_RESULTCODE);
            }
        }
    
        /**
         * 209.
         * 本地相册选择图片
         * 210.
         */
        private void chosePic() {
            Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);
            String IMAGE_UNSPECIFIED = "image/*";
            innerIntent.setType(IMAGE_UNSPECIFIED); // 查看类型
            Intent wrapperIntent = Intent.createChooser(innerIntent, null);
            startActivityForResult(wrapperIntent, REQ_CHOOSE);
        }
    
    
        String mCurrentPhotoPath = null;
        String FileName = "forum";
    
        //创建文件夹包装图片
        private File createImageFile() throws IOException {
            File storageDir = new File(Util.getAppPath(getActivity()) + FileName);
    
            if (!storageDir.exists()) {
                storageDir.mkdirs();
            }
            storageDir = new File(Util.getAppPath(getActivity()) + FileName + "/", System.currentTimeMillis() + ".jpg");
            //保存当前图片路径
            mCurrentPhotoPath = storageDir.getAbsolutePath();
            return storageDir;
        }
    
        //onActivityResult回调
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            if (requestCode == FILECHOOSER_RESULTCODE || requestCode == REQ_CHOOSE) {
                if (null == mUploadMessage && null == mUploadCallbackAboveL) return;
                Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
                if (mUploadCallbackAboveL != null) {
                    onActivityResultAboveL(requestCode, data);
                } else if (mUploadMessage != null) {
                    mUploadMessage.onReceiveValue(result);
                    mUploadMessage = null;
                }
            }
    
        }
    
        //5.0以上版本,由于api不一样,要单独处理
    //    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        private void onActivityResultAboveL(int requestCode, Intent data) {
    
            if (mUploadCallbackAboveL == null) {
                return;
            }
            Uri result = null;
            if (requestCode == FILECHOOSER_RESULTCODE) {
                File file = new File(mCurrentPhotoPath);
                Uri localUri = Uri.fromFile(file);
                Intent localIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, localUri);
                getActivity().sendBroadcast(localIntent);
                result = Uri.fromFile(file);
    
            } else if (requestCode == REQ_CHOOSE) {
                result = data.getData();
            }
            mUploadCallbackAboveL.onReceiveValue(new Uri[]{result});
            mUploadCallbackAboveL = null;
            return;
        }

    后补的代码:

    private void openFileChooserImplForAndroid5(ValueCallback<Uri[]> uploadMsg) {
        mUploadCallbackAboveL = uploadMsg;
        dispatchTakePictureIntent();
    }
    
    //5.0以下的掉用
    private void openFileChooserImpl(ValueCallback<Uri> uploadMsg) {
        mUploadMessage = uploadMsg;
        dispatchTakePictureIntent();
    }


    基本代码就是以上这些,selectImgDialog()方法是弹窗提示选择,关于这个弹窗布局的用法,之前写的一篇文章说的很清楚了(BottomSheet 的详解及注意事项),有疑问的欢迎提问。


    展开全文
  • AndroidWebView调用本地相册

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

    千次阅读 2015-12-10 13:54:45
    android webView 调用系统相册和相机 这里我只展示选择图库的代码,调用相册和相机的完整代码到这里下载点击打开链接 private ValueCallback mFilePathCallback; private ValueCallback mUploadCallbackAboveL; @...
  • 这是一个大神的东西,我拿过来修改了一下,对android不同的版本进行了适配。如果那位大神看到了,觉得我侵权了,请联系我。
  • Android WebView调用系统相册和相机,注入以及与H5的交互 推荐: 如何设计一个优雅健壮的Android WebView?(上) 如何设计一个优雅健壮的Android WebView?(下) Android Webview在使用的过程中,其实也是挺简单的...
  • 效果图: 搞了很久才压缩到2M以内了 测试环境的接口有问题上传失败了才 资源地址:http://download.csdn.net/detail/pkandroid/9674175另外此解决方案有个bug...—————————2016年11月5日18:33:47————
  • Android webview 不能调用相机相册

    千次阅读 2018-02-10 11:49:18
    一次开发中用webview加载连接,连接里有上传图片的功能,发现点击上传图片的按钮没有反应,这才知道Android 原生的webview是不能调用相机相册的,需要手动检查是否要求开启相机相册,...
  • android webview 选择文件(拍照,本地相册) 百度定位自适应屏幕
  • android webview调用系统相机和图库

    热门讨论 2015-12-10 15:04:34
    android webview调用系统相机和图库支持5.0通过了小米2s(android5.0.2)小米4(android 4.4.4)还有LG的nexus(android 5.0)的测试,在三星GT-I9300I(android 4.3 在这款手机上测试的时候,拍照后有的时候在...
  • 也是相当无奈,目前发现了好多android端与ios端webView的异同。 android端与ios确的不同大致包括: 1:android不能直接打开html的下载文件,需要先下载保存本地在打开本地文件 2:android不能直接打开pdf文件,同样...
  • Webview打开本地文件、图片选择的解决方案。版本兼容问题
  • 开发工具是 android studio SDK版本是 4.3 实现过程基本是这样 h5中调用手机选择文件图片的代码是: *" capture="camera" id="imgFile" name="imgFile" type="file"> 用安卓的 webView 控件来显示h5网页 然后给...
  • Webview打开本地图片选择器十分之麻烦,其在安卓系统3x 4x 5x上的行为都不同,处理也不同,所以之前差点崩溃。经过测试和完善,最终其在各个版本上都能完美工作。 直接上代码 package com.testandroid.webview; ...
  • Android Webview 调起系统相机、相册

    千次阅读 2020-01-13 14:34:47
    拿到该H5页看了一下,H5中调起相机和打开相册的源码分别是: #调起相机 <input type="file" accept="image/*" capture="camera"/> #打开相册 <input type="file" accept="image/*" multiple="multiple"/&...
  • 最近项目嵌入混合开发,都是使用WebView来跳转,页面展示。有用到这个图片上传的功能。 原本是一脸懵的,查了很多资料看一些大神都写的很多代码很复杂(原谅我是小白)   正文: 先看一下效果先:     ...
  • 实现在WebView点击打开手机相册功能

    千次阅读 2018-03-26 15:22:06
    那在WebView打开相册的功能是要怎样实现呢? 答案就是在webview.setWebChromeClient()中实现openFileChooser()方法,具体代码如下: webView.setWebChromeClient(new WebChromeClient() { @Override ...
  • 下载源码github地址: github项目地址 图例:
  • 今天拿到一个h5页面,发现需要调用到Android系统相册,录像,相机的时候,任你怎么点击上传图片,死活没有反应,奇怪的是,使用浏览器和微信直接加载哪个h5页面就没有问题,只要自己使用webview加载就是不行,平时...
  • 本文示例代码可在微信公众号「01二进制」后台回复「WebView」查看下载前言我们知道在开发 Native App 时经常会有打开网页的需求,可供的选择通常只有两种:在 App 内部打开网页通过调用系统自带浏览器打开网页以「...
  • PS:ValueCallbacks是WebView组件通过openFileChooser()或者onShowFileChooser()提供给我们的,它里面包含了一个或者一组Uri,然后我们在onActivityResult()里将Uri传给ValueCallbacks的onReceiveValue()方法,这样...
  • webview 调用相册权限和js地图权限

    千次阅读 2017-01-02 03:02:05
     //下面是web调用相册的部分。然后有2个setWebChromeClient冲突。单独放2个功能是可以实现的,但一起的话,就只能实现一个。  mWebView.setWebChromeClient(new ReWebChomeClient(this)); // mWebView....
  • 本篇文章介绍了常用的WebView使用,和处理了回收问题,如有问题,请留言斧正。...WebViewandroid开发中必不可少的组件,目前环境下混合开发日新月异,相对我们开发者来说,必须要掌握相关的WebView使用技巧和...
  • 最近一个Android的项目,使用webview+H5的混合开发模式。这样的模式主要是开发周期端,而且避免了机型兼容的问题。在实际使用中却发现了另外一些问题。 问题一:在某些机型中拍照闪退主要是Android10.0以上的系统。 ...

空空如也

空空如也

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

androidwebview打开相册