700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > android h5 input file 的适配和小米手机调起系统相册无效的Bug

android h5 input file 的适配和小米手机调起系统相册无效的Bug

时间:2020-05-03 17:04:05

相关推荐

android h5  input file 的适配和小米手机调起系统相册无效的Bug

适配h5中 < input file>调起相机和相册的功能代码:

private ValueCallback<Uri> uploadMessage;private ValueCallback<Uri[]> uploadMessageAboveL;private String mCurrentPhotoPath;private String mLastPhothPath;private Thread mThread;.......public class MyWebChromeClient extends WebChromeClient{@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result){Log.i(TAG, "onJsAlert: " + message);return super.onJsAlert(view, url, message, result);}@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result){Log.i(TAG, "onJsConfirm: " + message);return super.onJsConfirm(view, url, message, result);}@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result){Log.i(TAG, "onJsPrompt: " + message);return super.onJsPrompt(view, url, message, defaultValue, result);}@Overridepublic void onReceivedTitle(WebView view, String title){super.onReceivedTitle(view, title);}@Overridepublic void onProgressChanged(WebView view, int newProgress){if (newProgress == 100){progressBar.setVisibility(View.GONE);}else{if (progressBar.getVisibility() == View.GONE)progressBar.setVisibility(View.VISIBLE);progressBar.setProgress(newProgress);}super.onProgressChanged(view, newProgress);}//For Android >= 5.0@Overridepublic boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams){uploadMessageAboveL = filePathCallback;uploadPicture();return true;}//For Android >= 4.1public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture){uploadMessage = valueCallback;uploadPicture();}}Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);takePhoto();}};@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){if (requestCode == REQUEST_CODE_ALBUM || requestCode == REQUEST_CODE_CAMERA){if (uploadMessage == null && uploadMessageAboveL == null){return;}//取消拍照或者图片选择时,返回null,否则<input file> 就是没有反应if (resultCode != RESULT_OK){if (uploadMessage != null){uploadMessage.onReceiveValue(null);uploadMessage = null;}if (uploadMessageAboveL != null){uploadMessageAboveL.onReceiveValue(null);uploadMessageAboveL = null;}}//拍照成功和选取照片时if (resultCode == RESULT_OK){Uri imageUri = null;switch (requestCode){case REQUEST_CODE_ALBUM:if (data != null){imageUri = data.getData();}break;case REQUEST_CODE_CAMERA:if (!TextUtils.isEmpty(mCurrentPhotoPath)){File file = new File(mCurrentPhotoPath);Uri localUri = Uri.fromFile(file);Intent localIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, localUri);sendBroadcast(localIntent);imageUri = Uri.fromFile(file);mLastPhothPath = mCurrentPhotoPath;}break;}//上传文件if (uploadMessage != null){uploadMessage.onReceiveValue(imageUri);uploadMessage = null;}if (uploadMessageAboveL != null){uploadMessageAboveL.onReceiveValue(new Uri[]{imageUri});uploadMessageAboveL = null;}}}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (grantResults == null && grantResults.length == 0){return;}if (requestCode == REQUEST_CODE_PERMISSION_CAMERA){if (grantResults[0] == PackageManager.PERMISSION_GRANTED){takePhoto();}else{// Permission Deniednew AlertDialog.Builder(mContext).setTitle("无法拍照").setMessage("您未授予拍照权限").setNegativeButton("取消", null).setPositiveButton("去设置", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){Intent localIntent = new Intent();localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);localIntent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");localIntent.setData(Uri.fromParts("package", getPackageName(), null));startActivity(localIntent);}}).create().show();}}}/*** 选择相机或者相册*/public void uploadPicture(){AlertDialog.Builder builder = new AlertDialog.Builder(WebviewForNursingActivity.this);builder.setTitle("请选择图片上传方式");//取消对话框builder.setOnCancelListener(new DialogInterface.OnCancelListener(){@Overridepublic void onCancel(DialogInterface dialog){//一定要返回null,否则<input type='file'>if (uploadMessage != null){uploadMessage.onReceiveValue(null);uploadMessage = null;}if (uploadMessageAboveL != null){uploadMessageAboveL.onReceiveValue(null);uploadMessageAboveL = null;}}});builder.setPositiveButton("相机", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){if (!TextUtils.isEmpty(mLastPhothPath)){//上一张拍照的图片删除mThread = new Thread(new Runnable(){@Overridepublic void run(){File file = new File(mLastPhothPath);if (file != null){file.delete();}mHandler.sendEmptyMessage(1);}});mThread.start();}else{//请求拍照权限if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED){takePhoto();}else{ActivityCompat.requestPermissions(WebviewForNursingActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_PERMISSION_CAMERA);}}}});builder.setNegativeButton("相册", new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface dialog, int which){chooseAlbumPic();}});builder.create().show();}/*** 拍照*/private void takePhoto(){StringBuilder fileName = new StringBuilder();Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);fileName.append(UUID.randomUUID()).append("_upload.jpg");File tempFile = new File(mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES), fileName.toString());if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);Uri uri = FileProvider.getUriForFile(mContext, BuildConfig.APPLICATION_ID + ".fileprovider", tempFile);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);}else{Uri uri = Uri.fromFile(tempFile);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);}mCurrentPhotoPath = tempFile.getAbsolutePath();startActivityForResult(intent, REQUEST_CODE_CAMERA);}/*** 选择相册照片*/private void chooseAlbumPic(){Intent i = new Intent(Intent.ACTION_GET_CONTENT);i.addCategory(Intent.CATEGORY_OPENABLE);i.setType("image/*");startActivityForResult(Intent.createChooser(i, "Image Chooser"), REQUEST_CODE_ALBUM);}

Android-解决Webview对选择文件 点击无响应

但是这种方法,用相机拍照,传递两张照片,有时候会有异常,可以使用下边的代码

private ValueCallback<Uri[]> mUploadCallback;private Uri imageUri;private int PHOTO_REQUEST_CODE = 1111;...public class MyWebChromeClient extends WebChromeClient{@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result){Log.i(TAG, "onJsAlert: " + message);return super.onJsAlert(view, url, message, result);}@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result){Log.i(TAG, "onJsConfirm: " + message);return super.onJsConfirm(view, url, message, result);}@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result){Log.i(TAG, "onJsPrompt: " + message);return super.onJsPrompt(view, url, message, defaultValue, result);}@Overridepublic void onReceivedTitle(WebView view, String title){super.onReceivedTitle(view, title);}@Overridepublic void onProgressChanged(WebView view, int newProgress){if (newProgress == 100){progressBar.setVisibility(View.GONE);}else{if (progressBar.getVisibility() == View.GONE)progressBar.setVisibility(View.VISIBLE);progressBar.setProgress(newProgress);}super.onProgressChanged(view, newProgress);}//For Android >= 5.0@Overridepublic boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams){mUploadCallback = filePathCallback;takePhoto();return true;}}Handler mHandler = new Handler(){@Overridepublic void handleMessage(Message msg){super.handleMessage(msg);takePhoto();}};@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){if (requestCode == PHOTO_REQUEST_CODE){if (mUploadCallback != null){choosePic(resultCode, data);}else{Toast.makeText(this, "发生错误", Toast.LENGTH_SHORT).show();}}}/*** 拍照或相册*/private void takePhoto(){String filePath = Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_PICTURES + File.separator;String fileName = "IMG_" + DateFormat.format("yyyyMMdd_hhmmss", Calendar.getInstance(Locale.CHINA)) + ".jpg";imageUri = Uri.fromFile(new File(filePath + fileName));Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);Intent Photo = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);Intent chooserIntent = Intent.createChooser(Photo, "Image Chooser");chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[]{captureIntent});startActivityForResult(chooserIntent, PHOTO_REQUEST_CODE);}private void choosePic(int resultCode, Intent data){if (RESULT_OK == resultCode){updatePhotos();if (data != null){Uri[] results;Uri uriData = data.getData();if (uriData != null){results = new Uri[]{uriData};mUploadCallback.onReceiveValue(results);}else if (imageUri != null){mUploadCallback.onReceiveValue(new Uri[]{imageUri});}else{mUploadCallback.onReceiveValue(null);}}else{mUploadCallback.onReceiveValue(new Uri[]{imageUri});}}else{mUploadCallback.onReceiveValue(null);}mUploadCallback = null;}//更新照片private void updatePhotos(){Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);intent.setData(imageUri);sendBroadcast(intent);}

小米部分机型,调起系统相册没反应的解决办法

小米的部分机型,点击相册,没反应,直接resultCode 0,解决办法:

将MIUI优化关闭,重启手机后,打开APP

app开发中无法调起MIUI系统相册拾取图片

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。