android webview拍照,在android 2.2/2.3中使用webview从camera中照相并且上传的实现
最近做了需要實現一個小功能,在安卓的離線數據錄入程序中,要支持文件的的上傳。簡單而言,就是在一個webview包裝起來的離線的Web
App中,通過input[type=file]的指定需要上傳的文件,然后點擊保存按鈕的時候將數據先保存到本地(因為是離線狀態),然后當網絡連通的時候再將數據和文件一起上傳到服務器。由于程序主要操作界面是一個類似于phonegap封裝的純JS的Web
APP,所以基本上限定了文件的選擇獲取只能通過input[type=file]來。并且由于一般安卓的手機或者平臺都是支持相機的,所以我手欠的加了一個便捷的功能:點擊input[type=file]時直接從相機照相然后保存數據的功能。這就是這一趟受罪的開始。
一般來說,實現這種功能,都是在webview的WebChromeClient中覆蓋掉openFileChooser方法,打開文件選擇,網上一般流傳的都市從安卓系統的瀏覽器源代碼里抄出來的這一套:
public void
openFileChooser(ValueCallback uploadMsg) {
openFileChooser(uploadMsg,
"**");
Intent chooser =
createChooserIntent(createCameraIntent());
chooser.putExtra(Intent.EXTRA_INTENT,
i);
((Activity)
ctx).startActivityForResult(chooser, 5173);
}
public ValueCallback
getValueCallback() {
return
this.mUploadMessage;
}
private Intent
createChooserIntent(Intent... intents) {
Intent chooser = new
Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS,
intents);
chooser.putExtra(Intent.EXTRA_TITLE,
ctx.getString(R.string.FileBrowser));
return chooser;
}
private Intent
createCameraIntent() {
Intent cameraIntent = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(new File(imageFilePath)));
return cameraIntent;
}
除此之外就是在Activity的onActivityResult的方法中判斷如果是從相機來就直接從圖像路徑取圖而不是從Intent里取數據。
但是很不幸的是,這套代碼在安卓2.2/2.3上是不能實現從相機照相然后傳到input[type=file]上的,file控件總是顯示空白。各種奇異的情況總是讓人莫名的很抓狂。
由于功能要的緊,我頭一個晚上弄的晚上4點都沒找到解決的辦法。這個似乎就是webview的限制。于是第二天一早起來接著看,就連stackoverflow上都一幫人說沒辦法解決,我差點就直接放棄了。靜下心來一想,為什么直接從圖片庫中選擇的圖片能夠在file控件中正確的顯示而就只文件的不行呢?難道就是因為WebView不支持file://格式的Uri而僅僅只支持content格式的Uri?
于是我傻乎的又去把android的java部分的源代碼弄下來,可問題是居然部分的實現都是native的代碼,在系統自帶的瀏覽器里是把uri和文件路徑的映射存在了BrowserFrame的一個hashmap里,似乎在Java這一層和Webview的file控件的聯系就這么直接的斷了。
于是又換一個方向,既然webView不支持file://格式的Uri,那我為何不將file://格式的Uri轉換成content://格式的Uri呢?于是又是一番搜索,兩行代碼就搞定了這個事情:
String media
=MediaStore.Images.Media.insertImage(getContentResolver(),filepath,"","");
result = Uri.parse(media);
mUploadMessage.onReceiveValue(result);
總之,在人類這個世界上寫程序,面對很多莫名其妙的問題時,如果變通一下一小部分的問題還是能解決的。希望下次我碰到的還是這種能解決的小疑難。呵呵呵。
總結
以上是生活随笔為你收集整理的android webview拍照,在android 2.2/2.3中使用webview从camera中照相并且上传的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言简单计算器考虑优先级,利用你现有的
- 下一篇: android 弹窗时间,Android