androidh5页⾯打开doc,androidwebview处理h5打开本地⽂件
浏览器的功能
这周遇到⼀个⽐较棘⼿的问题,需要在android上边集成h5页⾯,并且在h5页⾯上,需要⽤户能够上传android本地的照⽚,⼀开始我以为webview会⾃动处理掉的,因此没太留意,当真正集成时,才发现,h5界⾯上传图⽚⽆法打开本地android的图库,h5调⽤的⽅式是:
通过最为简单的input菜单来选择,于是我就百度了⼀波,到了两种⽐较好的解决⽅法,⼀种是h5编写js代码,调⽤android app实现的函数,来实现打开图库进⾏图⽚选择的功能,还有⼀种⽅法是,通过重写webview中WebChromeClient类,然后来进⾏实现打开本地图库的功能。
在这主要讲述第⼆种⽅法的实现。
我这先放上重写的代码:
public class OpenFileWebChromeClient extends WebChromeClient {
public String TAG = "OpenFileWebChromeClient";
public static final int REQUEST_FILE_PICKER = 1;
public ValueCallback mFilePathCallback;
public ValueCallback mFilePathCallbacks;
private Activity mContext;
private TextView textView;
public OpenFileWebChromeClient(Activity mContext) {
super();
this.mContext = mContext;
}
/**
* Android < 3.0 调⽤这个⽅法
*/
public void openFileChooser(ValueCallback filePathCallback) {
mFilePathCallback = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
mContext.ateChooser(intent, "File Chooser"),
REQUEST_FILE_PICKER);
}
/**
* 3.0 + 调⽤这个⽅法
*/
public void openFileChooser(ValueCallback filePathCallback,
String acceptType) {
mFilePathCallback = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
mContext.ateChooser(intent, "File Chooser"), REQUEST_FILE_PICKER);
}
/**
* js上传⽂件的事件捕获
*/
/**
* Android > 4.1.1 调⽤这个⽅法
*/
@Deprecated
public void openFileChooser(ValueCallback filePathCallback,
String acceptType, String capture) {
mFilePathCallback = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
mContext.ateChooser(intent, "File Chooser"), REQUEST_FILE_PICKER);
}
@Override
public boolean onShowFileChooser(WebView webView,
ValueCallback filePathCallback,
WebChromeClient.FileChooserParams fileChooserParams) { mFilePathCallbacks = filePathCallback;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("image/*");
mContext.ateChooser(intent, "File Chooser"),
REQUEST_FILE_PICKER);
return true;
}
}
这样既可打开本地的图库,当然,这只是能够打开了,选择后的图⽚⼜怎样返回给h5页⾯呢?需要在activity中实现如下的代码:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == OpenFileWebChromeClient.REQUEST_FILE_PICKER) {
if (mOpenFileWebChromeClient.mFilePathCallback != null) {
Uri result = intent == null || resultCode != Activity.RESULT_OK ? null
: Data();
if (result != null) {
String path = Path(getApplicationContext(),
result);
Uri uri = Uri.fromFile(new File(path));
mOpenFileWebChromeClient.mFilePathCallback
.onReceiveValue(uri);
} else {
mOpenFileWebChromeClient.mFilePathCallback
.onReceiveValue(null);
}
}
if (mOpenFileWebChromeClient.mFilePathCallbacks != null) {
Uri result = intent == null || resultCode != Activity.RESULT_OK ? null
:
Data();
if (result != null) {
String path = Path(getApplicationContext(),
result);
Uri uri = Uri.fromFile(new File(path));
mOpenFileWebChromeClient.mFilePathCallbacks
web浏览器在哪里打开.onReceiveValue(new Uri[] { uri });
} else {
mOpenFileWebChromeClient.mFilePathCallbacks
.onReceiveValue(null);
}
}
mOpenFileWebChromeClient.mFilePathCallback = null;
mOpenFileWebChromeClient.mFilePathCallbacks = null;
}
}
这样,返回的数据则是h5页⾯需要的数据,这样⼀来,h5就可以像在电脑上⼀样的,对返回的数据进⾏操作,可以进⾏实时的预览,上传等功能。
但是对于以上的⽅法,我们在测试的时候发现,在android4.4上是不⽀持的,原因则是android4.4的webview没有对onShowFileChooser和openFileChooser做任何的处理,因此不⽀持,这算是android上的⼀个坑吧。
最后,记得添加权限,因为要读取本地的图⽚,所以要获取读本地sdcard的权限!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论