Aller au contenu

OpenFile chooser WebView / Android 4.4


DomTkt

Recommended Posts

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;

 

@@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;
}


public class PQClient extends WebViewClient {
ProgressDialog progressDialog;

public boolean shouldOverrideUrlLoading(WebView view, String url) {

// If url contains mailto link then open Mail Intent
if (url.contains("mailto:")) {

// Could be cleverer and use a regex
//Open links in new browser
view.getContext().startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));

// Here we can open new activity

return true;

}else {

// Stay within this webview and load url
view.loadUrl(url);
return true;
}
}

//Show loader on url load
public void onPageStarted(WebView view, String url, Bitmap favicon) {

// Then show progress Dialog
// in standard case YourActivity.this
if (progressDialog == null) {
progressDialog = new ProgressDialog(WebFavoris.this);
progressDialog.setMessage("Loading...");
progressDialog.show();
}
}

// Called when all page resources loaded
public void onPageFinished(WebView view, String url) {
webview.loadUrl("javascript:(function(){ "+
"document.getElementById('android-app').style.display='none';})()");

try {
// Close progressDialog
if (progressDialog.isShowing()) {
progressDialog.dismiss();
progressDialog = null;
}
} catch (Exception exception) {
exception.printStackTrace();
}
}
}


public class PQChromeClient 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(TAG, "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);
}

}

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;
}

 

 

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);

Lien vers le commentaire
Partager sur d’autres sites

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 : 

 

@@override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
xWalkWebView.onActivityResult(requestCode, resultCode, data);
}

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

  • 3 months later...

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...