我知道WebChromeClient必须实现OnShowCustomView和OnHideCustomView。我不知道确切。这是mainactivity.java。请注意,有些HTML文件带有指向Webview中正在使用的视频的链接。我在以下内容中排除了常规导入。
我知道WebChromeClient必须实现OnShowCustomView和OnHideCustomView。我无法确切地知道它。这是mainactivity.java。请注意,有些HTML文件带有指向Webview中正在使用的视频的链接。我在以下内容中排除了常规导入。
public class MainActivity extends AppCompatActivity {
private ValueCallback < Uri > mUploadMessage;
private Uri mCapturedImageURI = null;
private ValueCallback < Uri[] > mFilePathCallback;
private String mCameraPhotoPath;
private static final int INPUT_FILE_REQUEST_CODE = 1;
private static final int FILECHOOSER_RESULTCODE = 1;
Toolbar toolbar;
ListView list;
//The main content display
WebView webView;
DrawerLayout drawerLayout;
MenuItem refreshButton;
TabLayout tabs;
ProgressBar progressBar;
//The actual displayed page
static Pages actual = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
list = (ListView) findViewById(R.id.listView);
webView = (WebView) findViewById(R.id.webView);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
progressBar.setMax(100);
progressBar.setProgress(50);
requestAppPermissions();
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
webSettings.setPluginState(PluginState.ON);
webSettings.setAllowFileAccess(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setAppCacheEnabled(true);
webSettings.setDomStorageEnabled(true);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
getWindow().setTitle(title); //Set Activity tile to page title.
}
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
protected void openFileChooser(ValueCallback uploadMsg, String acceptType) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
}
});
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) {
getWindow().setTitle(title); //Set Activity tile to page title.
}
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return false;
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
view.loadData(actual.error, "text/html", actual.localEncoding);
}
});
webView.setDownloadListener(new DownloadListener() {
public boolean haveStoragePermission() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) ==
PackageManager.PERMISSION_GRANTED) {
Log.e("Permission error", "You have permission");
return true;
} else {
Log.e("Permission error", "You have asked for permission");
return false;
}
} else { //you dont need to worry about these stuff below api level 23
Log.e("Permission error", "You already have the permission");
return true;
}
}
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setMimeType(mimeType);
String cookies = CookieManager.getInstance().getCookie(url);
request.addRequestHeader("cookie", cookies); -
request.addRequestHeader("User-Agent", userAgent);
request.setDescription("Downloading file...");
request.setTitle(URLUtil.guessFileName(url, contentDisposition, mimeType));
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(url, contentDisposition, mimeType));
DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
dm.enqueue(request);
Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show();
}
});
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
tabs = (TabLayout) findViewById(R.id.tabs);
hideTabs();
//Listener to receive tab changes
tabs.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
//User selected new tab
@Override
public void onTabSelected(TabLayout.Tab tab) {
//Find page
for (Pages p: Pages.values()) {
if (p.title.equals(actual.title)) {
//Load URL in webview
if (actual.url != null)
actual.actualURL = p.url.split("\\|\\|")[tab.getPosition()];
if (actual.localPage != null)
actual.actualAlternativeURL = actual.localPage.split("\\|\\|")[tab.getPosition()];
}
}
if (actual.url != null) {
webView.loadUrl(actual.actualURL);
} else {
if (actual.localPage != null)
webView.loadUrl("file:///android_asset/" + actual.actualAlternativeURL);
}
}
//We don't need this methods
@Override
public void onTabUnselected(TabLayout.Tab tab) {}
@Override
public void onTabReselected(TabLayout.Tab tab) {}
});
/*
Drawer items
*/
//Create list of all items for the drawer
final ArrayList < Pages > pages = new ArrayList < Pages > ();
for (Pages p: Pages.values()) {
if (p.menu == false)
pages.add(p);
}
//Set actual page to the first item
if (actual == null) {
actual = pages.get(0);
}
/*
White design
*/
if (actual.useWhiteFont) {
toolbar.setTitleTextColor(0xFFFFFFFF);
tabs.setTabTextColors(0xFFFFFFFF, 0xFFFFFFFF);
}
/*
Toolbar
*/
toolbar.setTitle(actual.title);
setSupportActionBar(toolbar);
/*
Admob
*/
AdView mAdView = (AdView) findViewById(R.id.adView);
//Hide AdView when not needed
if (!actual.useAds) {
mAdView.setVisibility(View.INVISIBLE);
} else {
//Init AdView when needed
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
}
/*
Drawer
*/
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
this, drawerLayout, toolbar,
R.string.navigation_drawer_open, R.string.navigation_drawer_close
);
drawerLayout.setDrawerListener(mDrawerToggle);
drawerLayout.setDrawerShadow(R.drawable.shadow, Gravity.LEFT);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mDrawerToggle.syncState();
/*
Pages to drawer
*/
//Add pages to the drawer
ListAdapter adapter = new ListAdapter(this, pages);
list.setAdapter(adapter);
adapter.notifyDataSetChanged();
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int progress) {
progressBar.setProgress(progress);
if (progress == 100) {
progressBar.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.VISIBLE);
}
}
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if ((url.contains("http:") || url.contains("https:")) && actual.homeDomains.contains(URI.create(url).getHost())) {
view.loadUrl(url);
return false;
} else {
Intent intent = new Intent(Intent.ACTION_VIEW,
Uri.parse(url));
PackageManager manager = getPackageManager();
List < ResolveInfo > infos = manager.queryIntentActivities(intent, 0);
if (infos.size() > 0) {
startActivity(intent);
}
return true;
}
}
//Needed for correct back-button functionality
public void onPageFinished(WebView view, String url) {
webView.clearHistory();
}
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 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
;
}
// 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();
}
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);
}
});
/*
Site listener
*/
//Change page via drawer
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView << ? > parent, View view, int position, long id) {
changePage(pages.get(position));
}
});
/*
Update
*/
//Load actual (first) page
changePage(actual);
}
/*
Tabs
*/
//Show the TabView
void showTabs() {
tabs.getLayoutParams().height = TabLayout.LayoutParams.WRAP_CONTENT;
}
//Hide the TabView
void hideTabs() {
tabs.removeAllTabs();
tabs.getLayoutParams().height = 0;
}
//Change the page
//Update Webview, Toolbar, Refresh button...
void changePage(Pages newPage) {
actual = newPage;
//Handle tabs
tabs.removeAllTabs();
if (newPage.tabs != null && newPage.tabs.contains("||")) {
showTabs();
for (String s: newPage.tabs.split("\\|\\|")) {
tabs.addTab(tabs.newTab().setText(s));
}
if (newPage.url != null) {
newPage.actualURL = newPage.url.split("\\|\\|")[0];
}
if (newPage.localPage != null) {
newPage.actualAlternativeURL = newPage.localPage.split("\\|\\|")[0];
}
//There are no tabs...
} else {
hideTabs();
newPage.actualURL = newPage.url;
newPage.actualAlternativeURL = newPage.localPage;
}
//Enable JS for the webview
webView.getSettings().setJavaScriptEnabled(true);
//Load URL to the webview...
if (newPage.url != null) {
webView.loadUrl(newPage.actualURL);
} else {
if (newPage.localPage != null) //...Or use local page
webView.loadUrl("file:///android_asset/" + newPage.actualAlternativeURL);
}
//Update Toolbar and Statusbar
toolbar.setBackgroundColor(newPage.actionBarColor.value);
drawerLayout.setBackgroundColor(newPage.actionBarColor.value);
drawerLayout.closeDrawers();
toolbar.setTitle(newPage.title);
//Show refresh button
if (refreshButton != null) {
if (newPage.refreshButton) {
refreshButton.setVisible(true);
} else {
refreshButton.setVisible(false);
}
}
actual = newPage;
}
//Create OptionsMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Create the menu
getMenuInflater().inflate(R.menu.main, menu);
//Add pages to the menu
for (Pages p: Pages.values()) {
if (p.menu != false)
menu.add(p.title);
}
//Refresh button
refreshButton = menu.add(R.string.refresh);
if (actual.useWhiteFont) {
refreshButton.setIcon(R.drawable.ic_autorenew_white_36dp);
} else {
refreshButton.setIcon(R.drawable.ic_autorenew_black_36dp);
}
refreshButton.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
//Share button
if (Pages.values()[0].share) {
MenuItem shareItem = menu.add(getString(R.string.share));
if (actual.shareAsAction) {
if (actual.useWhiteFont)
shareItem.setIcon(R.drawable.ic_share_white_36dp);
else
shareItem.setIcon(R.drawable.ic_share_black_36dp);
shareItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
}
}
//Show/hide refresh button for the first page
if (actual != null) {
if (actual.refreshButton) {
refreshButton.setVisible(true);
} else {
refreshButton.setVisible(false);
}
}
return true;
}
//Handle back-button
@Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Closing App")
.setMessage("Are you sure you want to exit this application?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finishAndRemoveTask();
}
})
.setNegativeButton("No", null)
.show();
}
}
//Handle menu-clicks
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Share
if (item.getTitle().toString().equals(getString(R.string.share))) {
Intent sharingIntent = new Intent(Intent.ACTION_SEND);
sharingIntent.setType("text/plain");
sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, Pages.values()[0].shareText);
sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
startActivity(Intent.createChooser(sharingIntent, getString(R.string.share_using)));
return super.onOptionsItemSelected(item);
}
//Refresh
if (item.getTitle().toString().equals(getString(R.string.refresh))) {
if (actual.url != null) {
System.out.println(actual.url);
webView.reload();
webView.loadUrl(actual.url);
}
return super.onOptionsItemSelected(item);
}
//Page
for (Pages p: Pages.values()) {
if (p.title.equals(item.getTitle().toString())) {
if (p.url.contains("http:") || p.url.contains("https:")) {
changePage(p);
} else {
//Handle special Intents (e.g. for mailto: in the menu)
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(p.url));
PackageManager manager = getPackageManager();
List < ResolveInfo > infos = manager.queryIntentActivities(intent, 0);
if (infos.size() > 0) {
startActivity(intent);
}
}
}
}
return super.onOptionsItemSelected(item);
/*mycode begins*/
}
/*mycode ends*/
public void rateMe(View view) {
try {
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("market://details?id=" + this.getPackageName())));
} catch (android.content.ActivityNotFoundException e) {
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse("http://play.google.com/store/apps/details?id=" + this.getPackageName())));
}
}
public void exitMe(View view) {
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle("Closing App")
.setMessage("Are you sure you want to exit this application?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finishAndRemoveTask();
System.exit(0);
}
})
.setNegativeButton("No", null)
.show();
}
@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;
}
}