Android webview调用本地文件选择失败解决

在Android移动应用中,我们不止会使用本地原生的界面显示,嵌套网页显示也是一个基本需求。

在被调用的网页中,也许会用到本地相册选取的功能,但我们会发现这并不是一个可以直接使用的功能,需要我们添加一些方法。

不多说直接上代码:

在webview中,我们需要自定义一个ArcWebChromeClient继承WebChromeClient,并添加相应方法,然后在webview所在的activity中进行onActivityResult方法的重写。

private class ArcWebChromeClient extends WebChromeClient{

	public void openFileChooser(ValueCallback
   
   
    
     uploadMsg) {
		((WebActivity) mContext).openFileChooserImpl(uploadMsg);
	}
	public void openFileChooser(ValueCallback uploadMsg, String acceptType ) {
		((WebActivity) mContext).openFileChooserImpl(uploadMsg);
	}
	public void openFileChooser(ValueCallback
    
    
     
      uploadMsg, String acceptType, String capture){
		((WebActivity) mContext).openFileChooserImpl(uploadMsg);
	}
	// For Android 5.0+
	public boolean onShowFileChooser (WebView webView, ValueCallback
     
     
      
       uploadMsg, WebChromeClient.FileChooserParams fileChooserParams) {
//               mUploadCallbackAboveL = uploadMsg;
//               Intent i = newframe Intent(Intent.ACTION_GET_CONTENT);
//               i.addCategory(Intent.CATEGORY_OPENABLE);
//               i.setType("image/*");
//               startActivityForResult(
//                          Intent.createChooser(i, "File Browser"), 0);
//               return true;
//			mUploadCallbackAboveL = uploadMsg;
		((WebActivity) mContext).setUploadMsg(uploadMsg);
		Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
		contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
		contentSelectionIntent.setType("image/*");

		Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
		chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
		chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");

		((WebActivity) mContext).startActivityForResult(chooserIntent, 1);
		return true;
	}
}/**-------------------------------处理webview调用本地文件浏览-------------------------------------*/
	private ValueCallback
      
      
       
        mUploadMessage;

	public void openFileChooserImpl(ValueCallback
       
       
         uploadMsg) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult(Intent.createChooser(i, "File Chooser"), 0); } //onActivityResult回调 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 0) { if (null == mUploadMessage) return; Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); if (mUploadMessage != null) { mUploadMessage.onReceiveValue(result); mUploadMessage = null; } } if (requestCode == 1) { if (mUploadCallbackAboveL == null) { return; } Uri result = (data == null || resultCode != RESULT_OK) ? null: data.getData(); if (result != null) { mUploadCallbackAboveL.onReceiveValue(new Uri[]{result}); } else { mUploadCallbackAboveL.onReceiveValue(new Uri[]{}); } mUploadCallbackAboveL = null; } } private ValueCallback 
        
          mUploadCallbackAboveL; public void setUploadMsg(ValueCallback 
         
           uploadMsg){ mUploadCallbackAboveL = uploadMsg; } @SuppressLint("NewApi") private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) { if (requestCode != 0 || 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; } /**-------------------------------处理webview调用本地文件浏览-------------------------------------*/ 
          
         
       
      
      
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值