[英]Can't implement javascript in android webview
I have an android webapp and its using a different format from the other webview clients I've been using. 我有一个android webapp,它使用的格式与我一直在使用的其他webview客户端格式不同。 However, it doesn't execute javascript which is needed for the file upload button.
但是,它不执行文件上传按钮所需的javascript。 The default chrome browser can handle the uploads but the previous webview clients cannot, Thats why I chose to use this project.
默认的chrome浏览器可以处理上传,但以前的webview客户端不能处理,这就是为什么我选择使用此项目。
I will give you the whole MainAvivity.java file. 我将给您整个MainAvivity.java文件。
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.webkit.CookieManager;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
//Permission variables
static boolean ASWP_JSCRIPT = true; //enable JavaScript for webview
static boolean ASWP_FUPLOAD = true; //upload file from webview
static boolean ASWP_CAMUPLOAD = true; //enable upload from camera for photos
static boolean ASWP_MULFILE = false; //upload multiple files in webview
static boolean ASWP_LOCATION = true; //track GPS locations
static boolean ASWP_RATINGS = true; //show ratings dialog; auto configured, edit method get_rating() for customizations
static boolean ASWP_PBAR = true; //show progress bar in app
static boolean ASWP_ZOOM = false; //zoom in webview
static boolean ASWP_SFORM = false; //save form cache and auto-fill information
static boolean ASWP_OFFLINE = true; //whether the loading webpages are offline or online
static boolean ASWP_EXTURL = true; //open external url with default browser instead of app webview
//Configuration variables
private static String ASWV_URL = "http://example.com"; //complete URL of your website or webpage
private static String ASWV_F_TYPE = "*/*"; //to upload any file type using "*/*"; check file type references for more
public static String ASWV_HOST = aswm_host(ASWV_URL);
//Careful with these variable names if altering
WebView asw_view;
ProgressBar asw_progress;
TextView asw_loading_text;
NotificationManager asw_notification;
Notification asw_notification_new;
private String asw_cam_message;
private ValueCallback<Uri> asw_file_message;
private ValueCallback<Uri[]> asw_file_path;
private final static int asw_file_req = 1;
private final static int loc_perm = 1;
private final static int file_perm = 2;
private SecureRandom random = new SecureRandom();
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (Build.VERSION.SDK_INT >= 21) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimary));
Uri[] results = null;
if (resultCode == Activity.RESULT_OK) {
if (requestCode == asw_file_req) {
if (null == asw_file_path) {
return;
}
if (intent == null) {
if (asw_cam_message != null) {
results = new Uri[]{Uri.parse(asw_cam_message)};
}
} else {
String dataString = intent.getDataString();
if (dataString != null) {
results = new Uri[]{ Uri.parse(dataString) };
}
}
}
}
asw_file_path.onReceiveValue(results);
asw_file_path = null;
} else {
if (requestCode == asw_file_req) {
if (null == asw_file_message) return;
Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
asw_file_message.onReceiveValue(result);
asw_file_message = null;
}
}
}
@SuppressLint({"SetJavaScriptEnabled", "WrongViewCast"})
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (ASWP_PBAR) {
asw_progress = (ProgressBar) findViewById(R.id.msw_progress);
} else {
findViewById(R.id.msw_progress).setVisibility(View.GONE);
}
asw_loading_text = (TextView) findViewById(R.id.msw_loading_text);
Handler handler = new Handler();
//Launching app rating request
if (ASWP_RATINGS) {
handler.postDelayed(new Runnable() { public void run() { get_rating(); }}, 1000 * 60); //running request after few moments
}
//Getting basic device information
get_info();
//Getting GPS location of device if given permission
get_location();
asw_view = (WebView) findViewById(R.id.msw_view);
//Webview settings; defaults are customized for best performance
WebSettings webSettings = asw_view.getSettings();
if(!ASWP_OFFLINE){
webSettings.setJavaScriptEnabled(ASWP_JSCRIPT);
}
webSettings.setSaveFormData(ASWP_SFORM);
webSettings.setSupportZoom(ASWP_ZOOM);
webSettings.setGeolocationEnabled(ASWP_LOCATION);
webSettings.setAllowFileAccess(true);
webSettings.setAllowFileAccessFromFileURLs(true);
webSettings.setAllowUniversalAccessFromFileURLs(true);
webSettings.setUseWideViewPort(true);
webSettings.setDomStorageEnabled(true);
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
if (Build.VERSION.SDK_INT >= 21) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
asw_view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
} else if (Build.VERSION.SDK_INT >= 19) {
asw_view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
} else if (Build.VERSION.SDK_INT >= 16 && Build.VERSION.SDK_INT < 19) {
asw_view.requestFocus();
asw_view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
asw_view.setVerticalScrollBarEnabled(false);
asw_view.setWebViewClient(new Callback());
//Rendering the default URL
aswm_view(ASWV_URL, false);
asw_view.setWebChromeClient(new WebChromeClient() {
//Handling input[type="file"] requests for android API 16+
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
if(ASWP_FUPLOAD) {
asw_file_message = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType(ASWV_F_TYPE);
startActivityForResult(Intent.createChooser(i, "File Chooser"), asw_file_req);
}
}
//Handling input[type="file"] requests for android API 21+
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,WebChromeClient.FileChooserParams fileChooserParams){
get_file();
if(ASWP_FUPLOAD) {
if (asw_file_path != null) {
asw_file_path.onReceiveValue(null);
}
asw_file_path = filePathCallback;
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType(ASWV_F_TYPE);
Intent[] intentArray;
if (ASWP_CAMUPLOAD) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(MainActivity.this.getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = create_image();
takePictureIntent.putExtra("PhotoPath", asw_cam_message);
} catch (IOException ex) {
Log.e(TAG, "Image file creation failed", ex);
}
if (photoFile != null) {
asw_cam_message = "file:" + photoFile.getAbsolutePath();
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
} else {
takePictureIntent = null;
}
}
if (takePictureIntent != null) {
intentArray = new Intent[]{takePictureIntent};
} else {
intentArray = new Intent[0];
}
} else {
intentArray = new Intent[0];
}
Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
chooserIntent.putExtra(Intent.EXTRA_TITLE, "File Chooser");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
startActivityForResult(chooserIntent, asw_file_req);
}
return true;
}
//Getting webview rendering progress
@Override
public void onProgressChanged(WebView view, int p) {
if (ASWP_PBAR) {
asw_progress.setProgress(p);
if (p == 100) {
asw_progress.setProgress(0);
}
}
}
});
if (getIntent().getData() != null) {
String path = getIntent().getDataString();
/*
If you want to check or use specific directories or schemes or hosts
Uri data = getIntent().getData();
String scheme = data.getScheme();
String host = data.getHost();
List<String> pr = data.getPathSegments();
String param1 = pr.get(0);
*/
aswm_view(path, false);
}
}
@Override
public void onResume() {
super.onResume();
//Coloring the "recent apps" tab header; doing it onResume, as an insurance
if (Build.VERSION.SDK_INT >= 23) {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
ActivityManager.TaskDescription taskDesc = null;
taskDesc = new ActivityManager.TaskDescription(getString(R.string.app_name), bm, getColor(R.color.colorPrimary));
MainActivity.this.setTaskDescription(taskDesc);
}
get_location();
}
//Setting activity layout visibility
private class Callback extends WebViewClient {
public void onPageStarted(WebView view, String url, Bitmap favicon) {
get_location();
}
public void onPageFinished(WebView view, String url) {
findViewById(R.id.msw_welcome).setVisibility(View.GONE);
findViewById(R.id.msw_view).setVisibility(View.VISIBLE);
}
//For android below API 23
@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Toast.makeText(getApplicationContext(), "Something Went Wrong!", Toast.LENGTH_SHORT).show();
aswm_view("file:///android_res/raw/error.html", false);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
Toast.makeText(getApplicationContext(), "Something Went Wrong!", Toast.LENGTH_SHORT).show();
aswm_view("file:///android_res/raw/error.html", false);
}
//Overriding webview URLs
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return url_actions(view, url);
}
//Overriding webview URLs for API 23+ [suggested by github.com/JakePou]
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return url_actions(view, request.getUrl().toString());
}
}
//Random ID creation function to help get fresh cache every-time webview reloaded
public String random_id() {
return new BigInteger(130, random).toString(32);
}
//Opening URLs inside webview with request
void aswm_view(String url, Boolean tab) {
if (tab) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
} else {
asw_view.loadUrl(url+"?rid="+random_id());
}
}
//Actions based on shouldOverrideUrlLoading
public boolean url_actions(WebView view, String url){
boolean a = true;
//Show toast error if not connected to the network
if (!ASWP_OFFLINE && !DetectConnection.isInternetAvailable(MainActivity.this)) {
Toast.makeText(getApplicationContext(), "Please check your Network Connection!", Toast.LENGTH_SHORT).show();
//Use this in a hyperlink to redirect back to default URL :: href="refresh:android"
} else if (url.startsWith("refresh:")) {
aswm_view(ASWV_URL, false);
//Use this in a hyperlink to launch default phone dialer for specific number :: href="tel:+919876543210"
} else if (url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
startActivity(intent);
//Use this to open your apps page on google play store app :: href="rate:android"
} else if (url.startsWith("rate:")) {
final String app_package = getPackageName(); //requesting app package name from Context or Activity object
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + app_package)));
} catch (ActivityNotFoundException anfe) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=" + app_package)));
}
//Sharing content from your webview to external apps :: href="share:URL" and remember to place the URL you want to share after share:___
} else if (url.startsWith("share:")) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, view.getTitle());
intent.putExtra(Intent.EXTRA_TEXT, view.getTitle()+"\nVisit: "+(Uri.parse(url).toString()).replace("share:",""));
startActivity(Intent.createChooser(intent, "Share with your Friends"));
//Use this in a hyperlink to exit your app :: href="exit:android"
} else if (url.startsWith("exit:")) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
//Opening external URLs in android default web browser
} else if (ASWP_EXTURL && aswm_host(ASWV_URL)!=ASWV_HOST) {
aswm_view(url,true);
} else {
a = false;
}
return a;
}
//Getting host name
public static String aswm_host(String url){
if (url == null || url.length() == 0) {
return "";
}
int dslash = url.indexOf("//");
if (dslash == -1) {
dslash = 0;
} else {
dslash += 2;
}
int end = url.indexOf('/', dslash);
end = end >= 0 ? end : url.length();
int port = url.indexOf(':', dslash);
end = (port > 0 && port < end) ? port : end;
Log.w("URL Host: ",url.substring(dslash, end));
return url.substring(dslash, end);
}
//Getting device basic information
public void get_info(){
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(ASWV_URL, "DEVICE=android");
cookieManager.setCookie(ASWV_URL, "DEV_API=" + Build.VERSION.SDK_INT);
}
//Checking permission for storage and camera for writing and uploading images
public void get_file(){
String[] perms = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA};
//Checking for storage permission to write images for upload
if (ASWP_FUPLOAD && ASWP_CAMUPLOAD && !check_permission(2) && !check_permission(3)) {
ActivityCompat.requestPermissions(MainActivity.this, perms, file_perm);
//Checking for WRITE_EXTERNAL_STORAGE permission
} else if (ASWP_FUPLOAD && !check_permission(2)) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, file_perm);
//Checking for CAMERA permissions
} else if (ASWP_CAMUPLOAD && !check_permission(3)) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, file_perm);
}
}
//Using cookies to update user locations
public void get_location(){
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
if(ASWP_LOCATION) {
//Checking for location permissions
if (Build.VERSION.SDK_INT >= 23 && !check_permission(1)) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, loc_perm);
show_notification(2, 2);
} else {
GPSTrack gps;
gps = new GPSTrack(MainActivity.this);
double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
if (gps.canGetLocation()) {
if (latitude != 0 || longitude != 0) {
cookieManager.setCookie(ASWV_URL, "lat=" + latitude);
cookieManager.setCookie(ASWV_URL, "long=" + longitude);
//Log.w("New Updated Location:", latitude + "," + longitude); //enable to test dummy latitude and longitude
} else {
Log.w("New Updated Location:", "NULL");
}
} else {
show_notification(1, 1);
Log.w("New Updated Location:", "FAIL");
}
}
}
}
//Checking if particular permission is given or not
public boolean check_permission(int permission){
switch(permission){
case 1:
return ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED;
case 2:
return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
case 3:
return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
}
return false;
}
//Creating image file for upload
private File create_image() throws IOException {
@SuppressLint("SimpleDateFormat")
String file_name = new SimpleDateFormat("yyyy_mm_ss").format(new Date());
String new_name = "file_"+file_name+"_";
File sd_directory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
return File.createTempFile(new_name, ".jpg", sd_directory);
}
//Launching app rating dialoge [developed by github.com/hotchemi]
public void get_rating() {
if (DetectConnection.isInternetAvailable(MainActivity.this)) {
AppRate.with(this)
.setStoreType(StoreType.GOOGLEPLAY) //default is Google Play, other option is Amazon App Store
.setInstallDays(3) //after how many days would you like to show the dialoge
.setLaunchTimes(10) //overall request launch times being ignored
.setRemindInterval(2) //reminding users to rate after days interval
.setTitle(R.string.rate_dialog_title)
.setMessage(R.string.rate_dialog_message)
.setTextLater(R.string.rate_dialog_cancel)
.setTextNever(R.string.rate_dialog_no)
.setTextRateNow(R.string.rate_dialog_ok)
.monitor();
AppRate.showRateDialogIfMeetsConditions(this);
}
//for more customizations, edit AppRate and DialogOptions
}
//Creating custom notifications with IDs
public void show_notification(int type, int id) {
long when = System.currentTimeMillis();
asw_notification = (NotificationManager) MainActivity.this.getSystemService(Context.NOTIFICATION_SERVICE);
Intent i = new Intent();
if (type == 1) {
i.setClass(MainActivity.this, MainActivity.class);
} else if (type == 2) {
i.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
} else {
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + MainActivity.this.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
}
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(MainActivity.this);
switch(type){
case 1:
builder.setTicker(getString(R.string.app_name));
builder.setContentTitle(getString(R.string.loc_fail));
builder.setContentText(getString(R.string.loc_fail_text));
builder.setStyle(new NotificationCompat.BigTextStyle().bigText(getString(R.string.loc_fail_more)));
builder.setVibrate(new long[]{350,350,350,350,350});
builder.setSmallIcon(R.mipmap.ic_launcher);
break;
case 2:
builder.setTicker(getString(R.string.app_name));
builder.setContentTitle(getString(R.string.app_name));
builder.setContentText(getString(R.string.loc_perm_text));
builder.setStyle(new NotificationCompat.BigTextStyle().bigText(getString(R.string.loc_perm_more)));
builder.setVibrate(new long[]{350, 700, 350, 700, 350});
builder.setSound(alarmSound);
builder.setSmallIcon(R.mipmap.ic_launcher);
break;
}
builder.setOngoing(false);
builder.setAutoCancel(true);
builder.setContentIntent(pendingIntent);
builder.setWhen(when);
builder.setContentIntent(pendingIntent);
asw_notification_new = builder.getNotification();
asw_notification.notify(id, asw_notification_new);
}
//Checking if users allowed the requested permissions or not
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults){
switch (requestCode){
case 1: {
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
get_location();
}else{
show_notification(2, 2);
Toast.makeText(MainActivity.this, R.string.loc_req, Toast.LENGTH_LONG).show();
}
}
}
}
//Action on back key tap/click
@Override
public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
if (asw_view.canGoBack()) {
asw_view.goBack();
} else {
finish();
}
return true;
}
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onStart() {
super.onStart();
}
@Override
protected void onStop() {
super.onStop();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
@Override
protected void onSaveInstanceState(Bundle outState ){
super.onSaveInstanceState(outState);
asw_view.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
asw_view.restoreState(savedInstanceState);
}
}
This is a full solution for all android versions, I had a hard time with this too. 这是所有android版本的完整解决方案,对此我也很难过。
public class MyWb extends Activity {
/** Called when the activity is first created. */
WebView web;
ProgressBar progressBar;
private ValueCallback<Uri> mUploadMessage;
private final static int FILECHOOSER_RESULTCODE=1;
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent intent) {
if(requestCode==FILECHOOSER_RESULTCODE)
{
if (null == mUploadMessage) return;
Uri result = intent == null || resultCode != RESULT_OK ? null
: intent.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
web = (WebView) findViewById(R.id.webview01);
progressBar = (ProgressBar) findViewById(R.id.progressBar1);
web = new WebView(this);
web.getSettings().setJavaScriptEnabled(true);
web.loadUrl("http://www.script-tutorials.com/demos/199/index.html");
web.setWebViewClient(new myWebClient());
web.setWebChromeClient(new WebChromeClient()
{
//The undocumented magic method override
//Eclipse will swear at you if you try to put @Override here
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
MyWb.this.startActivityForResult(Intent.createChooser(i,"File Chooser"), FILECHOOSER_RESULTCODE);
}
// For Android 3.0+
public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
MyWb.this.startActivityForResult(
Intent.createChooser(i, "File Browser"),
FILECHOOSER_RESULTCODE);
}
//For Android 4.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture){
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
MyWb.this.startActivityForResult( Intent.createChooser( i, "File Chooser" ), MyWb.FILECHOOSER_RESULTCODE );
}
});
setContentView(web);
}
public class myWebClient extends WebViewClient
{
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO Auto-generated method stub
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
view.loadUrl(url);
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
// TODO Auto-generated method stub
super.onPageFinished(view, url);
progressBar.setVisibility(View.GONE);
}
}
//flipscreen not loading again
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
// To handle "Back" key press event for WebView to go back to previous screen.
/*@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
web.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}*/
}
Also I want to add that the "upload page" like the one in this example, wont work on < 4 versions, since it has an image preview feature, if you want to make it work use a simple php upload without preview. 另外,我想补充一点,“上载页面”与本示例中的页面一样,不适用于<4个版本,因为它具有图像预览功能,如果要使其工作,请使用简单的PHP上载而无需预览。
Update: 更新:
Please find the solution for lollipop devices here and thanks for gauntface 请在此处找到棒棒糖设备的解决方案,感谢您的配合。
Update 2: 更新2:
Found complete solution for all android devices including marshmallow here see its github project for more. 找到了适用于所有Android设备(包括棉花糖)的完整解决方案,请参见github项目以获取更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.