openFileChooser not called when is clicked on android 4.4 webview
import android.app.Activity; |
import android.app.ProgressDialog; |
import android.content.Intent; |
import android.graphics.Bitmap; |
import android.net.Uri; |
import android.os.Build; |
import android.os.Bundle; |
import android.os.Environment; |
import android.os.Parcelable; |
import android.provider.MediaStore; |
import android.support.v7.app.ActionBarActivity; |
import android.util.Log; |
import android.view.KeyEvent; |
import android.view.View; |
import android.webkit.ValueCallback; |
import android.webkit.WebChromeClient; |
import android.webkit.WebSettings; |
import android.webkit.WebView; |
import android.webkit.WebViewClient; |
import android.widget.Toast; |
import java.io.File; |
import java.io.IOException; |
import java.text.SimpleDateFormat; |
import java.util.Date; |
public class MainActivity extends ActionBarActivity { |
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; |
} |
@Override |
protected void onCreate(Bundle savedInstanceState) { |
super.onCreate(savedInstanceState); |
setContentView(R.layout.activity_main); |
webView = (WebView) findViewById(R.id.webview); |
webSettings = webView.getSettings(); |
webSettings.setJavaScriptEnabled(true); |
webSettings.setLoadWithOverviewMode(true); |
webSettings.setAllowFileAccess(true); |
webView.setWebViewClient(new Client()); |
webView.setWebChromeClient(new ChromeClient()); |
if (Build.VERSION.SDK_INT >= 19) { |
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); |
} |
else if(Build.VERSION.SDK_INT >=11 && Build.VERSION.SDK_INT < 19) { |
webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); |
} |
webView.loadUrl("http://example.com"); //change with your website |
} |
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; |
} |
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); |
} |
} |
public boolean onKeyDown(int keyCode, KeyEvent event) { |
// Check if the key event was the Back button and if there's history |
if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { |
webView.goBack(); |
return true; |
} |
// If it wasn't the Back key or there's no web page history, bubble up to the default |
// system behavior (probably exit the activity) |
return super.onKeyDown(keyCode, event); |
} |
public class Client 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(MainActivity.this); |
progressDialog.setMessage("Loading..."); |
progressDialog.show(); |
} |
} |
// Called when all page resources loaded |
public void onPageFinished(WebView view, String url) { |
try { |
// Close progressDialog |
if (progressDialog.isShowing()) { |
progressDialog.dismiss(); |
progressDialog = null; |
} |
} catch (Exception exception) { |
exception.printStackTrace(); |
} |
} |
} |
Comments
Post a Comment