webView文件上传取消弹窗后再次点击不响应点击事件问题
2017-04-07 15:12
525 查看
webView文件上传取消弹窗后再次点击不响应点击事件问题
在android加载h5界面时,如果该h5界面有调用android的手机相册或者相机功能,那么我们的activity里面应该怎么写呢?我的写法适配了android3.0到android7.0,如果安卓5.0以上的手机出现崩溃的问题,可以参考我下面For Android 5.0+的写法
实现方法是
webView_customer.setWebChromeClient(new WebChromeClient() {
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
mUploadMessage = uploadMsg;
ArrayList<String> list = new ArrayList<String>();
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);
// 下面这句指定调用相机拍照后的照片存储的路径
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<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}
// For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg, acceptType);
}
// For Android 5.0+
public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
mUploadCallbackAboveL = filePathCallback;
ArrayList<String> list = new ArrayList<String>();
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);
// 下面这句指定调用相机拍照后的照片存储的路径
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回调方法:这里有个特别注意的地方,当打开拍照按钮时,Intent data这个数据是空,所以不能正常上传,打开拍照的Intent当时传了一个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;
}
if (mUploadMessage != null) {
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
}
这里有一个问题,点击“取消”或返回按钮,无法重复回调 onShowFileChooser 或openFileChooser方法。解决办法:
定义一个方法:
/**
* 防止点击dialog的取消按钮之后,就不再次响应点击事件了
*/
public static void cancelCallback(){
if(mUploadCallbackAboveL!=null){
mUploadCallbackAboveL.onReceiveValue(null);
}
if(mUploadMessage!=null){
mUploadMessage.onReceiveValue(null);
}
}
在弹窗(dialog)的取消按钮监听的方法中调用上面的cancellCallBack方法。比如我的:
/**
* 展示拍照或者从相册选择的Dialog
* @param context
* @param title
* @param names
* @param onClickPicDialogItemListener
*/
public static void showTakePicOrPhotoesDialog(Context context, String title, final ArrayList<String> names, final DialogUtils.OnClickPicDialogItemListener onClickPicDialogItemListener){
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle(title);//设置标题
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();//显示对话框
}
在android加载h5界面时,如果该h5界面有调用android的手机相册或者相机功能,那么我们的activity里面应该怎么写呢?我的写法适配了android3.0到android7.0,如果安卓5.0以上的手机出现崩溃的问题,可以参考我下面For Android 5.0+的写法
实现方法是
webView_customer.setWebChromeClient(new WebChromeClient() {
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
mUploadMessage = uploadMsg;
ArrayList<String> list = new ArrayList<String>();
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);
// 下面这句指定调用相机拍照后的照片存储的路径
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<Uri> uploadMsg) {
openFileChooser(uploadMsg, "");
}
// For Android > 4.1.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
openFileChooser(uploadMsg, acceptType);
}
// For Android 5.0+
public boolean onShowFileChooser (WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
mUploadCallbackAboveL = filePathCallback;
ArrayList<String> list = new ArrayList<String>();
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);
// 下面这句指定调用相机拍照后的照片存储的路径
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回调方法:这里有个特别注意的地方,当打开拍照按钮时,Intent data这个数据是空,所以不能正常上传,打开拍照的Intent当时传了一个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;
}
//如果拍完照点击取消按钮就: 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(new Uri[]{result}); mUploadCallbackAboveL = null; }
}
}
这里有一个问题,点击“取消”或返回按钮,无法重复回调 onShowFileChooser 或openFileChooser方法。解决办法:
定义一个方法:
/**
* 防止点击dialog的取消按钮之后,就不再次响应点击事件了
*/
public static void cancelCallback(){
if(mUploadCallbackAboveL!=null){
mUploadCallbackAboveL.onReceiveValue(null);
}
if(mUploadMessage!=null){
mUploadMessage.onReceiveValue(null);
}
}
在弹窗(dialog)的取消按钮监听的方法中调用上面的cancellCallBack方法。比如我的:
/**
* 展示拍照或者从相册选择的Dialog
* @param context
* @param title
* @param names
* @param onClickPicDialogItemListener
*/
public static void showTakePicOrPhotoesDialog(Context context, String title, final ArrayList<String> names, final DialogUtils.OnClickPicDialogItemListener onClickPicDialogItemListener){
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle(title);//设置标题
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();//显示对话框
}
相关文章推荐
- WebView调H5上传文件点击取消时无法再次响应H5上的选择文件事件
- Android WebView上传文件的问题 AlertDialog取消选择
- android webview图片文件上传兼容性问题——上传控件点击无效的解决办法
- 关于webview的各种问题,webview中的点击事件,上传图片问题
- Android中的WebView禁止响应点击事件的方法
- 响应webview中的图片点击事件 (android webview js交互)
- 解决ViewPager嵌套Fragment内部点击事件无响应问题
- android webview js交互, 响应webview中的图片点击事件
- android webview js交互, 响应webview中的图片点击事件
- 关于webview上传文件(图片)遇到的问题
- android webview js交互, 响应webview中的图片点击事件
- android webview js交互, 响应webview中的图片点击事件
- android webview js交互, 响应webview中的图片点击事件
- android studio 打包webview 5.0文件上传问题
- 解决CCScrollView中菜单条目在不可见时仍响应点击事件的问题
- 解决小米系统下ViewPager、ScrollView内嵌套WebView时,Touch事件不响应的问题
- android webview js交互, 响应webview中的图片点击事件 .
- android webview js交互, 响应webview中的图片点击事件
- android webview js交互, 响应webview中的图片点击事件
- android webview js交互, 响应webview中的图片点击事件