webView文件上傳取消彈窗后再次點(diǎn)擊不響應(yīng)點(diǎn)擊事件問題
這是別人寫的一篇文章,我是轉(zhuǎn)載來的。
移動端H5頁面調(diào)用手機(jī)相冊或者照相機(jī)后,再次點(diǎn)擊沒反應(yīng)問題,這是需要安卓方面修改的,前端不需要修改。
實(shí)現(xiàn)方法是
webView_customer.setWebChromeClient(new?WebChromeClient()?{
//?For?Android?3.0+
public?void?openFileChooser(ValueCallback?uploadMsg,?String?acceptType)?{
mUploadMessage?=?uploadMsg;
ArrayList?list?=?new?ArrayList();
list.add("拍照");
list.add("從相冊選擇");
showTakePicOrPhotoesDialog(Activity_Customer_Edu.this,?"選擇",?list,?new?DialogUtils.OnClickPicDialogItemListener()?{
@Override
public?void?onClickItem(int?which)?{
if(0==which){
Intent?takeIntent?=?new?Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//下面這句指定調(diào)用相機(jī)拍照后的照片存儲的路徑
try?{
File?file?=?createImageFile();
takePicUri?=?Uri.fromFile(file);
takeIntent.putExtra(MediaStore.EXTRA_OUTPUT,?takePicUri);
startActivityForResult(takeIntent,?FILECHOOSER_RESULTCODE);
}?catch?(IOException?e)?{
e.printStackTrace();
}
}else?if(1==which){
Intent?pickIntent?=?new?Intent(Intent.ACTION_PICK,?null);????????????????????????????pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,?"image/*");
startActivityForResult(pickIntent,?FILECHOOSER_RESULTCODE);
}
}
});
}
//?For?Android?<?3.0
public?void?openFileChooser(ValueCallback?uploadMsg)?{
openFileChooser(uploadMsg,?"");
}
//?For?Android??>?4.1.1
public?void?openFileChooser(ValueCallback?uploadMsg,?String?acceptType,?String?capture)?{
openFileChooser(uploadMsg,?acceptType);
}
//?For?Android?5.0+
public?boolean?onShowFileChooser?(WebView?webView,?ValueCallback?filePathCallback,?WebChromeClient.FileChooserParams?fileChooserParams)?{
mUploadCallbackAboveL?=?filePathCallback;
ArrayList?list?=?new?ArrayList();
list.add("拍照");
list.add("從相冊選擇");
showTakePicOrPhotoesDialog(Activity_Customer_Edu.this,?"選擇",?list,?new?DialogUtils.OnClickPicDialogItemListener()?{
@Override
public?void?onClickItem(int?which)?{
if(0==which){
Intent?takeIntent?=?new?Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//下面這句指定調(diào)用相機(jī)拍照后的照片存儲的路徑
try?{
File?file?=?createImageFile();
takePicUri?=?Uri.fromFile(file);
takeIntent.putExtra(MediaStore.EXTRA_OUTPUT,?takePicUri);
startActivityForResult(takeIntent,?FILECHOOSER_RESULTCODE);
}?catch?(IOException?e)?{
e.printStackTrace();
}
}else?if(1==which){
Intent?pickIntent?=?new?Intent(Intent.ACTION_PICK,?null);
pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,?"image/*");
startActivityForResult(pickIntent,?FILECHOOSER_RESULTCODE);
}
}
});
return?true;
}
});
OnActivityResult回調(diào)方法:這里有個特別注意的地方,當(dāng)打開拍照按鈕時,Intent?data這個數(shù)據(jù)是空,所以不能正常上傳,打開拍照的Intent當(dāng)時傳了一個Uri,在OnActivityResult需要判斷data是不是空,是空的話,就把傳的那個Uri賦值給mUploadMessage.onReceiveValue,如果不為空就傳data.getData();具體如下:
@Override
protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{
if(requestCode==FILECHOOSER_RESULTCODE){
Uri?result;
if?(null?==?mUploadMessage?&&?null?==?mUploadCallbackAboveL){
return;
}
//如果拍完照點(diǎn)擊取消按鈕就:if(resultCode ==RESULT_CANCELED){? ? result = Uri.EMPTY;}else{if(data ==null&& resultCode !=RESULT_OK){? ? ? ? result = Uri.EMPTY;? ? }else if(data ==null){? ? ? ? result =takePicUri;? ? }else{? ? ? ? result = data.getData();? ? }}
if?(mUploadMessage?!=?null)?{
mUploadMessage.onReceiveValue(result);
mUploadMessage?=?null;
}
if(mUploadCallbackAboveL!=null) {mUploadCallbackAboveL.onReceiveValue(newUri[]{result});mUploadCallbackAboveL=null;}
}
}
這里有一個問題,點(diǎn)擊“取消”或返回按鈕,無法重復(fù)回調(diào)onShowFileChooser或openFileChooser方法。解決辦法:
定義一個方法:
/**
*防止點(diǎn)擊dialog的取消按鈕之后,就不再次響應(yīng)點(diǎn)擊事件了
*/
public?static?void?cancelCallback(){
if(mUploadCallbackAboveL!=null){
mUploadCallbackAboveL.onReceiveValue(null);
}
if(mUploadMessage!=null){
mUploadMessage.onReceiveValue(null);
}
}
在彈窗(dialog)的取消按鈕監(jiān)聽的方法中調(diào)用上面的cancellCallBack方法。比如我的:
/**
*展示拍照或者從相冊選擇的Dialog
*?@param?context
*?@param?title
*?@param?names
*?@param?onClickPicDialogItemListener
*/
public?static?void?showTakePicOrPhotoesDialog(Context?context,?String?title,?final?ArrayList?names,?final?DialogUtils.OnClickPicDialogItemListener?onClickPicDialogItemListener){
AlertDialog.Builder?builder=new?AlertDialog.Builder(context);
builder.setTitle(title);//設(shè)置標(biāo)題
String[]?itemList=(String[])?names.toArray(new?String[names.size()]);
builder.setItems(itemList,?new?DialogInterface.OnClickListener()?{
@Override
public?void?onClick(DialogInterface?dialog,?int?which)?{
onClickPicDialogItemListener.onClickItem(which);
}
});
AlertDialog?dialog=builder.create();//獲取dialog
dialog.setOnCancelListener(new?DialogInterface.OnCancelListener()?{
@Override
public?void?onCancel(DialogInterface?dialog)?{
cancelCallback();
}
});
dialog.show();//顯示對話框
}