Created
November 1, 2016 15:28
-
-
Save pamobo0609/1650a73d0478f5aeabc95f67f1457ba5 to your computer and use it in GitHub Desktop.
Code capable of opening a file chooser from a Webview in Android
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class AgregarItemActivity extends AppCompatActivity { | |
Usuario user; | |
boolean listenerStatus; | |
String sessionID; | |
String eventoID; | |
String agregarItemURL; | |
String agregarImagenesURL; | |
String item; | |
String itemDetalle; | |
ProgressDialog pd; | |
int fotoTomada; | |
boolean vistaImagenesCargada; | |
ItemMercaderia nuevoItem; | |
LinkedList<InfoItemMercaderia>infoItem; | |
ValueCallback<Uri[]> recentUploadMessage; | |
SharedPreferences preferencias; | |
/** File chooser attributes */ | |
private static final int INPUT_FILE_REQUEST_CODE = 1; | |
private static final int FILECHOOSER_RESULTCODE = 1; | |
private static final String TAG = AgregarItemActivity.class.getSimpleName(); | |
private WebView myWebView; | |
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; | |
} | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
/***/ | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_agregar_item); | |
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); | |
setSupportActionBar(toolbar); | |
getSupportActionBar().setDisplayHomeAsUpEnabled(true); | |
myWebView = (WebView) this.findViewById(R.id.agregar_item_webview); | |
webSettings = myWebView.getSettings(); | |
webSettings.setJavaScriptEnabled(true); | |
webSettings.setAllowContentAccess(true); | |
webSettings.setLoadWithOverviewMode(true); | |
webSettings.setAllowFileAccess(true); | |
webSettings.setAllowUniversalAccessFromFileURLs(true); | |
webSettings.setAllowContentAccess(true); | |
webSettings.setAllowFileAccessFromFileURLs(true); | |
webSettings.setDomStorageEnabled(true); | |
myWebView.addJavascriptInterface(new WebAppInterface(this), "Android"); | |
if (Build.VERSION.SDK_INT >= 19) { | |
myWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null); | |
} | |
else if(Build.VERSION.SDK_INT >=11 && Build.VERSION.SDK_INT < 19) { | |
myWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); | |
} | |
/***/ | |
myWebView.setWebViewClient(new WebViewClient() { | |
@Override | |
public void onPageStarted(WebView view, String url, Bitmap favicon) { | |
pd.show(); | |
super.onPageStarted(view, url, favicon); | |
} | |
@Override | |
public void onPageFinished(WebView view, String url) { | |
super.onPageFinished(view, url); | |
pd.dismiss(); | |
if(vistaImagenesCargada) { | |
Permisos.verifyStoragePermissions(AgregarItemActivity.this); | |
} | |
} | |
@SuppressWarnings("deprecation") | |
@Override | |
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { | |
super.onReceivedError(view, errorCode, description, failingUrl); | |
view.loadUrl("about:blank"); | |
AlertDialog.Builder builder = new AlertDialog.Builder(AgregarItemActivity.this); | |
builder.setMessage("Hubo un problema la cargar el formulario") | |
//builder.setMessage(description) | |
.setTitle("Error") | |
.setPositiveButton("aceptar", new DialogInterface.OnClickListener() { | |
@Override | |
public void onClick(DialogInterface dialog, int which) { | |
finish(); | |
} | |
}).show(); | |
} | |
@Override | |
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { | |
view.loadUrl("about:blank"); | |
AlertDialog.Builder builder = new AlertDialog.Builder(AgregarItemActivity.this); | |
builder.setMessage("Hubo un problema la cargar el formulario") | |
//builder.setMessage(error.toString()) | |
.setTitle("Error") | |
.setPositiveButton("aceptar", new DialogInterface.OnClickListener() { | |
@Override | |
public void onClick(DialogInterface dialog, int which) { | |
finish(); | |
} | |
}).show(); | |
} | |
}); | |
myWebView.setWebChromeClient(new ChromeClient()); | |
user = UtilsViews.usuarioSession(this); | |
eventoID = UtilsViews.crearEventoID(user.getIdUsuario(), this); | |
pd = UtilsViews.cargaPB("Obteniendo Formulario", AgregarItemActivity.this); | |
agregarItemURL = "YOUR_URL"; | |
agregarImagenesURL = "ANOTHER_URL"; | |
cargarWebSeleccionada(agregarItemURL); | |
} | |
public void cargarWebSeleccionada(String url){ | |
Log.i("URL", url); | |
myWebView.loadUrl(url); | |
} | |
/** Method in charge of creating the captured image */ | |
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; | |
} | |
/** Custom WebChromeClient for our WebView */ | |
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(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); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment