This is an old way to Upload an Image from camera or gallery in WebView. It was made a long time ago and is not maintened anymore. Use it at your own risk.
-
-
Save jhonsore/8a8378c147ec00ac6f3fa53569c82ef8 to your computer and use it in GitHub Desktop.
//Found on: https://stackoverflow.com/questions/15725814/upload-an-image-from-camera-or-gallery-in-webview | |
private ValueCallback<Uri> mUploadMessage; | |
private Uri mCapturedImageURI = null; | |
private ValueCallback<Uri[]> mFilePathCallback; | |
private String mCameraPhotoPath; | |
private static final int INPUT_FILE_REQUEST_CODE = 1; | |
private static final int FILECHOOSER_RESULTCODE = 1; | |
private File createImageFile() throws IOException { | |
// Create an image file name | |
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); | |
String imageFileName = "JPEG_" + timeStamp + "_"; | |
File storageDir = Environment.getExternalStoragePublicDirectory( | |
Environment.DIRECTORY_PICTURES); | |
File imageFile = File.createTempFile( | |
imageFileName, /* prefix */ | |
".jpg", /* suffix */ | |
storageDir /* directory */ | |
); | |
return imageFile; | |
} |
//---------------- this is initialization and setting webview ----------------------// | |
mWebView= (WebView) findViewById(R.id.webview); | |
mWebView.getSettings().setJavaScriptEnabled(true); | |
mWebView.getSettings().setPluginState(WebSettings.PluginState.OFF); | |
mWebView.getSettings().setLoadWithOverviewMode(true); | |
mWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); | |
mWebView.getSettings().setUseWideViewPort(true); | |
mWebView.getSettings().setUserAgentString("Android Mozilla/5.0 AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30"); | |
mWebView.getSettings().setAllowFileAccess(true); | |
mWebView.getSettings().setAllowFileAccess(true); | |
mWebView.getSettings().setAllowContentAccess(true); | |
mWebView.getSettings().supportZoom(); | |
mWebView.loadUrl("https://my-url.com");//put here your website | |
mWebView.setWebViewClient(new WebViewClient() { | |
public boolean shouldOverrideUrlLoading(WebView view, String url) { | |
// do your handling codes here, which url is the requested url | |
// probably you need to open that url rather than redirect: | |
if ( url.contains(".pdf")){ | |
Intent intent = new Intent(Intent.ACTION_VIEW); | |
intent.setDataAndType(Uri.parse(url), "application/pdf"); | |
try{ | |
view.getContext().startActivity(intent); | |
} catch (ActivityNotFoundException e) { | |
//user does not have a pdf viewer installed | |
} | |
} else { | |
mWebView.loadUrl(url); | |
} | |
return false; // then it is not handled by default action | |
} | |
@Override | |
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { | |
Log.e("error",description); | |
} | |
@Override | |
public void onPageStarted(WebView view, String url, Bitmap favicon) { //show progressbar here | |
super.onPageStarted(view, url, favicon); | |
} | |
@Override | |
public void onPageFinished(WebView view, String url) { | |
//hide progressbar here | |
} | |
}); | |
mWebView.setWebChromeClient(new ChromeClient()); |
//------------------- and here is my ChomeClient() method . --------------------------// | |
public class ChromeClient extends WebChromeClient { | |
// For Android 5.0 | |
public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePath, WebChromeClient.FileChooserParams fileChooserParams) { | |
// Double check that we don't have any existing callbacks | |
if (mFilePathCallback != null) { | |
mFilePathCallback.onReceiveValue(null); | |
} | |
mFilePathCallback = filePath; | |
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); | |
if (takePictureIntent.resolveActivity(getPackageManager()) != null) { | |
// Create the File where the photo should go | |
File photoFile = null; | |
try { | |
photoFile = createImageFile(); | |
takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); | |
} catch (IOException ex) { | |
// Error occurred while creating the File | |
Log.e("ErrorCreatingFile", "Unable to create Image File", ex); | |
} | |
// Continue only if the File was successfully created | |
if (photoFile != null) { | |
mCameraPhotoPath = "file:" + photoFile.getAbsolutePath(); | |
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, | |
Uri.fromFile(photoFile)); | |
} else { | |
takePictureIntent = null; | |
} | |
} | |
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT); | |
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE); | |
contentSelectionIntent.setType("image/*"); | |
Intent[] intentArray; | |
if (takePictureIntent != null) { | |
intentArray = new Intent[]{takePictureIntent}; | |
} else { | |
intentArray = new Intent[0]; | |
} | |
Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); | |
chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent); | |
chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser"); | |
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray); | |
startActivityForResult(chooserIntent, INPUT_FILE_REQUEST_CODE); | |
return true; | |
} | |
// openFileChooser for Android 3.0+ | |
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { | |
mUploadMessage = uploadMsg; | |
// Create AndroidExampleFolder at sdcard | |
// Create AndroidExampleFolder at sdcard | |
File imageStorageDir = new File( | |
Environment.getExternalStoragePublicDirectory( | |
Environment.DIRECTORY_PICTURES) | |
, "AndroidExampleFolder"); | |
if (!imageStorageDir.exists()) { | |
// Create AndroidExampleFolder at sdcard | |
imageStorageDir.mkdirs(); | |
} | |
// Create camera captured image file path and name | |
File file = new File( | |
imageStorageDir + File.separator + "IMG_" | |
+ String.valueOf(System.currentTimeMillis()) | |
+ ".jpg"); | |
mCapturedImageURI = Uri.fromFile(file); | |
// Camera capture image intent | |
final Intent captureIntent = new Intent( | |
android.provider.MediaStore.ACTION_IMAGE_CAPTURE); | |
captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); | |
Intent i = new Intent(Intent.ACTION_GET_CONTENT); | |
i.addCategory(Intent.CATEGORY_OPENABLE); | |
i.setType("image/*"); | |
// Create file chooser intent | |
Intent chooserIntent = Intent.createChooser(i, "Image Chooser"); | |
// Set camera intent to file chooser | |
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS | |
, new Parcelable[] { captureIntent }); | |
// On select image call onActivityResult method of activity | |
startActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE); | |
} | |
// openFileChooser for Android < 3.0 | |
public void openFileChooser(ValueCallback<Uri> uploadMsg) { | |
openFileChooser(uploadMsg, ""); | |
} | |
//openFileChooser for other Android versions | |
public void openFileChooser(ValueCallback<Uri> uploadMsg, | |
String acceptType, | |
String capture) { | |
openFileChooser(uploadMsg, acceptType); | |
} | |
} |
//------------- here is my onActivityResult method to handle data from gallery or camera intent ----------------// | |
@Override | |
public void onActivityResult(int requestCode, int resultCode, Intent data) { | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { | |
if (requestCode != INPUT_FILE_REQUEST_CODE || mFilePathCallback == null) { | |
super.onActivityResult(requestCode, resultCode, data); | |
return; | |
} | |
Uri[] results = null; | |
// Check that the response is a good one | |
if (resultCode == Activity.RESULT_OK) { | |
if (data == null) { | |
// If there is not data, then we may have taken a photo | |
if (mCameraPhotoPath != null) { | |
results = new Uri[]{Uri.parse(mCameraPhotoPath)}; | |
} | |
} else { | |
String dataString = data.getDataString(); | |
if (dataString != null) { | |
results = new Uri[]{Uri.parse(dataString)}; | |
} | |
} | |
} | |
mFilePathCallback.onReceiveValue(results); | |
mFilePathCallback = null; | |
} else if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { | |
if (requestCode != FILECHOOSER_RESULTCODE || mUploadMessage == null) { | |
super.onActivityResult(requestCode, resultCode, data); | |
return; | |
} | |
if (requestCode == FILECHOOSER_RESULTCODE) { | |
if (null == this.mUploadMessage) { | |
return; | |
} | |
Uri result = null; | |
try { | |
if (resultCode != RESULT_OK) { | |
result = null; | |
} else { | |
// retrieve from the private variable if the intent is null | |
result = data == null ? mCapturedImageURI : data.getData(); | |
} | |
} catch (Exception e) { | |
Toast.makeText(getApplicationContext(), "activity :" + e, | |
Toast.LENGTH_LONG).show(); | |
} | |
mUploadMessage.onReceiveValue(result); | |
mUploadMessage = null; | |
} | |
} | |
return; | |
} |
//---------- permissions ----------------// | |
<uses-permission android:name="android.permission.CAMERA" /> | |
<uses-permission android:name="android.permission.CAMERA2" /> // for new versions api 21+ | |
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> | |
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | |
<uses-permission android:name="android.permission.RECORD_AUDIO" /> |
Hi Sir add the following code to check permission function
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(homepage.this, new String[]{Manifest.permission.CAMERA}, 123);
}
thank you sir this solve the problem
In Andorid 11, Camera open but not return any image in webview..
It worked. But the image goes back to the main window without loading.
It worked. But the image goes back to the main window without loading.
What can I do about it?
In Andorid 11, Camera open but not return any image in webview..
Has anyone had success in getting the camera image to be used by the webiew on android 11 or higher?
In Andorid 11, Camera open but not return any image in webview..
Has anyone had success in getting the camera image to be used by the webiew on android 11 or higher?
Yes.
@AkbaraliKhasanov could you share how you made it work? please
@yasserlassance @AkbaraliKhasanov my telegram account
@jhonsore Hello, I tried the code:
Android 5: It works fine Android 6: Photo is being taken but input remains blank Android 7: Photo is being taken but input remains blank Android 8: Open gallery directly, camera option not asked Android 9: Opening gallery directly, camera option not asked Android 10: Opening gallery directly, camera option not asked
I'm waiting for your help, thanks.
Same with me..
Hi Sir add the following code to check permission function
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(homepage.this, new String[]{Manifest.permission.CAMERA}, 123);
}