DomTkt Posté(e) 1 juin 2016 Share Posté(e) 1 juin 2016 Bonjour, j'ai un problème concernant mon application, je m'explique sur navigateur externe je peux ouvrir le FileChooser ainsi que la caméra afin de prendre des photos ou de selectionner une image pour l'upload grâce à un bouton. Néanmoins, lorsque j'accède au site via une WebView depuis mon application, dès lors que je clique sur le bouton rien ne se passe, par contre pour les versions autres que Android 4.4 tout se passe bien grâce à un peu de code implémenter. J'ai lu sur un autre forum que pour les versions 4.4 il n'y avait pas les méthodes openFileChooser pour la classe WebChromeClient. Je bloque sur ce problème depuis plusieurs jours j'espère que vous pourriez m'aider, une personne a déjà réussit à faire marcher cette fonction sur les versions 4.4 ? Merci. Voilà le code correspondant pour les autres versions autre que la version 4.4 : private static final int INPUT_FILE_REQUEST_CODE = 1;private static final int FILECHOOSER_RESULTCODE = 1;private static final String TAG = MainActivity.class.getSimpleName();private WebView webView;private WebSettings webSettings;private ValueCallback<Uri> mUploadMessage;private Uri mCapturedImageURI = null;private ValueCallback<Uri[]> mFilePathCallback;private String mCameraPhotoPath; @@overridepublic 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 oneif (resultCode == Activity.RESULT_OK) {if (data == null) {// If there is not data, then we may have taken a photoif (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 nullresult = data == null ? mCapturedImageURI : data.getData();}} catch (Exception e) {Toast.makeText(getApplicationContext(), "activity :" + e,Toast.LENGTH_LONG).show();}mUploadMessage.onReceiveValue(result);mUploadMessage = null;}}return;}public class PQClient extends WebViewClient {ProgressDialog progressDialog;public boolean shouldOverrideUrlLoading(WebView view, String url) {// If url contains mailto link then open Mail Intentif (url.contains("mailto:")) {// Could be cleverer and use a regex//Open links in new browserview.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));// Here we can open new activityreturn true;}else {// Stay within this webview and load urlview.loadUrl(url);return true;}}//Show loader on url loadpublic void onPageStarted(WebView view, String url, Bitmap favicon) {// Then show progress Dialog// in standard case YourActivity.thisif (progressDialog == null) {progressDialog = new ProgressDialog(WebFavoris.this);progressDialog.setMessage("Loading...");progressDialog.show();}}// Called when all page resources loadedpublic void onPageFinished(WebView view, String url) {webview.loadUrl("javascript:(function(){ "+"document.getElementById('android-app').style.display='none';})()");try {// Close progressDialogif (progressDialog.isShowing()) {progressDialog.dismiss();progressDialog = null;}} catch (Exception exception) {exception.printStackTrace();}}}public class PQChromeClient extends WebChromeClient {// For Android 5.0public boolean onShowFileChooser(WebView view, ValueCallback<Uri[]> filePath, WebChromeClient.FileChooserParams fileChooserParams) {// Double check that we don't have any existing callbacksif (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 goFile photoFile = null;try {photoFile = createImageFile();takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath);} catch (IOException ex) {// Error occurred while creating the FileLog.e(TAG, "Unable to create Image File", ex);}// Continue only if the File was successfully createdif (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 sdcardFile imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "AndroidExampleFolder");if (!imageStorageDir.exists()) {// Create AndroidExampleFolder at sdcardimageStorageDir.mkdirs();}// Create camera captured image file path and nameFile file = new File(imageStorageDir + File.separator + "IMG_"+ String.valueOf(System.currentTimeMillis())+ ".jpg");mCapturedImageURI = Uri.fromFile(file);// Camera capture image intentfinal 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 intentIntent chooserIntent = Intent.createChooser(i, "Image Chooser");// Set camera intent to file chooserchooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Parcelable[] { captureIntent });// On select image call onActivityResult method of activitystartActivityForResult(chooserIntent, FILECHOOSER_RESULTCODE);}// openFileChooser for Android < 3.0public void openFileChooser(ValueCallback<Uri> uploadMsg) {openFileChooser(uploadMsg, "");}//openFileChooser for other Android versionspublic void openFileChooser(ValueCallback<Uri> uploadMsg,String acceptType,String capture) {openFileChooser(uploadMsg, acceptType);}}private File createImageFile() throws IOException {// Create an image file nameString 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;} Ensuite : webview = (WebView) findViewById(R.id.webView);webview.setWebViewClient(new PQClient());webview.getSettings().setJavaScriptEnabled(true);webview.getSettings().setBuiltInZoomControls(true);webview.getSettings().supportZoom();webview.setWebChromeClient(new PQChromeClient());webview.loadUrl(url); Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
DomTkt Posté(e) 6 juin 2016 Auteur Share Posté(e) 6 juin 2016 Pour certains qui aurait le même problème que moi, j'ai une bonne solution : En utilisant une WebView différentes, avec la librairies CrossWalk. Ajoutez ceci au graddle : repositories {maven {url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'}} ainsi que : compile 'org.xwalk:xwalk_core_library_beta:15.44.384.7' Vous pourrez ensuite utilisée : " XWalkView xWalkWebView" comme une WebView intégrant l'openfile chooser ainsi que la caméra et vidéo. N'oubliez pas d'ajouter ceci à votre classe : @@overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {xWalkWebView.onActivityResult(requestCode, resultCode, data);} Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
androidexample Posté(e) 22 septembre 2016 Share Posté(e) 22 septembre 2016 Hi dude, i have also find out one good example <a href="http://androidexample.com/Open_File_Chooser_With_Camera_Option_In_Webview_File_Option/index.php?view=article_discription&aid=128&aaid=148">Open File Chooser With Camera Option In Webview File Option</a> Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.