webView文件上傳取消彈窗后再次點(diǎn)擊不響應(yīng)點(diǎn)擊事件問題

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();//顯示對話框

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容