我正在建立一个应用程序,即时通讯使用此代码
WebviewActivity.java
公共类WebviewActivity扩展了AppCompatActivity {
private Toolbar mToolbar;
//Options to load a webpage
public static String URL = "webview_url";
public static String OPEN_EXTERNAL = "open_external";
public static String LOAD_DATA = WebviewFragment.LOAD_DATA;
public static String HIDE_NAVIGATION = WebviewFragment.HIDE_NAVIGATION;
String mWebUrl = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_holder);
mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//Determine if we want to open this as intent or in the webview
boolean openInWebView = true;
if (getIntent().hasExtra(OPEN_EXTERNAL) && getIntent().getExtras().getBoolean(OPEN_EXTERNAL)){
//If we have to load data directly, we can only do this locally
}
//Determine if we would like to fragment to display navigation, based on the passed bundle arguments
boolean hideNavigation = false;
if (getIntent().hasExtra(HIDE_NAVIGATION) && getIntent().getExtras().getBoolean(HIDE_NAVIGATION)){
hideNavigation = true;
}
String data = null;
if (getIntent().hasExtra(LOAD_DATA)){
data = getIntent().getExtras().getString(LOAD_DATA);
}
//opening the webview fragment with passed url
if (getIntent().hasExtra(URL)){
mWebUrl = getIntent().getExtras().getString(URL);
if (openInWebView) {
openWebFragmentForUrl(mWebUrl, hideNavigation, data);
} else {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(mWebUrl));
startActivity(browserIntent);
//Shutdown this activity
finish();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void openWebFragmentForUrl(String url, boolean hideNavigation, String data){
Fragment fragment;
fragment = new WebviewFragment();
// adding the data
Bundle bundle = new Bundle();
bundle.putStringArray(MainActivity.FRAGMENT_DATA, new String[]{url});
bundle.putBoolean(WebviewFragment.HIDE_NAVIGATION, hideNavigation);
if (data != null)
bundle.putString(WebviewFragment.LOAD_DATA, data);
fragment.setArguments(bundle);
//Changing the fragment
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.container, fragment)
.commit();
//Setting the title
if (data == null)
setTitle(getResources().getString(R.string.webview_title));
else
setTitle("");
}
@Override
public void onBackPressed() {
Fragment webview = getSupportFragmentManager().findFragmentById(R.id.container);
if (webview instanceof BackPressFragment) {
boolean handled = ((WebviewFragment)webview).handleBackPress();
if (!handled)
super.onBackPressed();
} else {
super.onBackPressed();
}
}
@Override
public void onResume(){
super.onResume();
if (getSupportActionBar() == null) return;
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
和 WebviewFragment
public class WebviewFragment extends Fragment implements BackPressFragment, CollapseControllingFragment {
//Static
public static final String HIDE_NAVIGATION = "hide_navigation";
public static final String LOAD_DATA = "loadwithdata";
//File upload
public static final int INPUT_FILE_REQUEST_CODE = 1;
public static final String EXTRA_FROM_NOTIFICATION = "EXTRA_FROM_NOTIFICATION";
private ValueCallback<Uri[]> mFilePathCallback;
private String mCameraPhotoPath;
//References
private Activity mAct;
private FavDbAdapter mDbHelper;
//Layout with interaction
private WebView browser;
private SwipeRefreshLayout mSwipeRefreshLayout;
//Layouts
private ImageButton webBackButton;
private ImageButton webForwButton;
private LinearLayout ll;
//HTML5 video
private View mCustomView;
private int mOriginalSystemUiVisibility;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
@SuppressLint("InflateParams")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Return the existing layout if there is a savedInstance of this fragment
if (savedInstanceState != null) { return ll; }
ll = (LinearLayout) inflater.inflate(R.layout.fragment_webview,
container, false);
setHasOptionsMenu(true);
browser = (WebView) ll.findViewById(R.id.webView);
mSwipeRefreshLayout = (SwipeRefreshLayout) ll.findViewById(R.id.refreshlayout);
// settings some settings like zooming etc in seperate method for
// suppresslint
browserSettings();
browser.setWebViewClient(new WebViewClient() {
@SuppressWarnings("deprecation")
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return handleUri(url);
}
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
return handleUri(request.getUrl().toString());
}
// Make sure any url clicked is opened in webview
boolean handleUri(String url) {
if (url.contains("market://") || url.contains("mailto:")
|| url.contains("play.google") || url.contains("tel:") || url
.contains("vid:") || url.contains("youtube.com")) {
// Load new URL Don't override URL Link
startActivity(
new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
return true;
}
// Return true to override url loading (In this case do
// nothing).
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(browser, url);
adjustControls();
}
});
// has all to do with progress bar
browser.setWebChromeClient(new WebChromeClient() {
public boolean onShowFileChooser(
WebView webView, ValueCallback<Uri[]> filePathCallback,
WebChromeClient.FileChooserParams fileChooserParams) {
if(mFilePathCallback != null) {
mFilePathCallback.onReceiveValue(null);
}
mFilePathCallback = filePathCallback;
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getActivity().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;
}
@Override
public void onProgressChanged(WebView view, int progress) {
if (mSwipeRefreshLayout.isRefreshing()) {
if (progress == 100) {
mSwipeRefreshLayout.setRefreshing(false);
}
} else if (progress < 100){
//If we do not hide the navigation, show refreshing
if (!WebviewFragment.this.getArguments().containsKey(HIDE_NAVIGATION) ||
WebviewFragment.this.getArguments().getBoolean(HIDE_NAVIGATION) == false)
mSwipeRefreshLayout.setRefreshing(true);
}
}
@SuppressLint("InlinedApi")
@Override
public void onShowCustomView(View view,
WebChromeClient.CustomViewCallback callback) {
// if a view already exists then immediately terminate the new one
if (mCustomView != null) {
onHideCustomView();
return;
}
// 1. Stash the current state
mCustomView = view;
mCustomView.setBackgroundColor(Color.BLACK);
mOriginalSystemUiVisibility = getActivity().getWindow().getDecorView().getSystemUiVisibility();
// 2. Stash the custom view callback
mCustomViewCallback = callback;
// 3. Add the custom view to the view hierarchy
FrameLayout decor = (FrameLayout) getActivity().getWindow().getDecorView();
decor.addView(mCustomView, new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
// 4. Change the state of the window
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE);
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public void onHideCustomView() {
// 1. Remove the custom view
FrameLayout decor = (FrameLayout) getActivity().getWindow().getDecorView();
decor.removeView(mCustomView);
mCustomView = null;
// 2. Restore the state to it's original form
getActivity().getWindow().getDecorView()
.setSystemUiVisibility(mOriginalSystemUiVisibility);
//TODO Find a better solution to the keyboard not showing after custom view is hidden
//The user will come from landscape, so we'll first 'rotate' to portrait (rotation fixes a bug of the keybaord not showing)
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//The we'll restore to the detected orientation (by immediately rotating back, the user should not notice any difference and/or flickering).
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
// 3. Call the custom view callback
mCustomViewCallback.onCustomViewHidden();
mCustomViewCallback = null;
}
@Override
public Bitmap getDefaultVideoPoster() {
return BitmapFactory.decodeResource(getResources(),
R.drawable.placeholder);
//return super.getDefaultVideoPoster();
}
});
browser.setDownloadListener(new DownloadListener() {
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
}
});
// setting an on touch listener
browser.setOnTouchListener(new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP:
if (!v.hasFocus()) {
v.requestFocus();
}
break;
}
return false;
}
});
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
browser.reload();
}
});
return ll;
}// of oncreateview
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAct = getActivity();
setRetainInstance(true);
String weburl = getArguments().getStringArray(MainActivity.FRAGMENT_DATA)[0];
String data = getArguments().containsKey(LOAD_DATA) ? getArguments().getString(LOAD_DATA) : null;
if (checkConnectivity() || weburl.startsWith("file:///android_asset/")) {
//If this is the first time, load the initial url, otherwise restore the view if necessairy
if (savedInstanceState == null) {
//If we have HTML data to load, do so, else load the url.
if (data != null) {
browser.loadDataWithBaseURL(weburl, data, "text/html", "UTF-8", "");
} else {
browser.loadUrl(weburl);
}
} else if (mCustomView != null){
FrameLayout decor = (FrameLayout) getActivity().getWindow().getDecorView();
((ViewGroup) mCustomView.getParent()).removeView(mCustomView);
decor.addView(mCustomView, new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
}
}
}
@Override
public void onPause() {
super.onPause();
if (browser != null)
browser.onPause();
else
Log.e("INFO", "Browser is null");
setMenuVisibility(false);
}
@Override
public void setMenuVisibility(final boolean visible) {
super.setMenuVisibility(visible);
if (mAct == null) return;
if (visible) {
if (!this.getArguments().containsKey(HIDE_NAVIGATION) ||
!this.getArguments().getBoolean(HIDE_NAVIGATION)){
ActionBar actionBar = ((AppCompatActivity) mAct)
.getSupportActionBar();
if (mAct instanceof WebviewActivity | mAct instanceof HolderActivity) {
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE | ActionBar.DISPLAY_HOME_AS_UP);
} else {
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);
}
View view = mAct.getLayoutInflater().inflate(R.layout.fragment_webview_actionbar, null);
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.END | Gravity.CENTER_VERTICAL);
actionBar.setCustomView(view, lp);
webBackButton = (ImageButton) mAct.findViewById(R.id.goBack);
webForwButton = (ImageButton) mAct.findViewById(R.id.goForward);
webBackButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (browser.canGoBack())
browser.goBack();
}
});
webForwButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (browser.canGoForward())
browser.goForward();
}
});
}
} else {
if ((!this.getArguments().containsKey(HIDE_NAVIGATION) ||
!this.getArguments().getBoolean(HIDE_NAVIGATION))
&& getActivity() != null) {
ActionBar actionBar = ((AppCompatActivity) getActivity())
.getSupportActionBar();
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);
}
}
}
@Override
public void onResume() {
super.onResume();
if (browser != null) {
browser.onResume();
} else {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.detach(this).attach(this).commit();
}
if (this.getArguments().containsKey(HIDE_NAVIGATION) &&
this.getArguments().getBoolean(HIDE_NAVIGATION)){
mSwipeRefreshLayout.setEnabled(false);
}
adjustControls();
if (WebviewFragment.this.isMenuVisible())
setMenuVisibility(true);
}
/**
* More info this method can be found at
* http://developer.android.com/training/camera/photobasics.html
*
* @return
* @throws IOException
*/
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;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.share:
shareURL();
return true;
case R.id.favorite:
mDbHelper = new FavDbAdapter(mAct);
mDbHelper.open();
String title = browser.getTitle();
String url = browser.getUrl();
if (mDbHelper.checkEvent(title, url, FavDbAdapter.KEY_WEB)) {
// This item is new
mDbHelper.addFavorite(title, url, FavDbAdapter.KEY_WEB);
Toast toast = Toast.makeText(mAct,
getResources().getString(R.string.favorite_success),
Toast.LENGTH_LONG);
toast.show();
} else {
Toast toast = Toast.makeText(mAct,
getResources().getString(R.string.favorite_duplicate),
Toast.LENGTH_LONG);
toast.show();
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (!this.getArguments().containsKey(HIDE_NAVIGATION) ||
!this.getArguments().getBoolean(HIDE_NAVIGATION))
inflater.inflate(R.menu.webview_menu, menu);
}
// Checking for an internet connection
private boolean checkConnectivity() {
boolean enabled = true;
ConnectivityManager connectivityManager = (ConnectivityManager) mAct
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
if ((info == null || !info.isConnected() || !info.isAvailable())) {
enabled = false;
Helper.noConnection(mAct);
}
return enabled;
}
public void adjustControls() {
webBackButton = (ImageButton) mAct.findViewById(R.id.goBack);
webForwButton = (ImageButton) mAct.findViewById(R.id.goForward);
if (webBackButton == null || webForwButton == null) return;
if (browser.canGoBack()) {
webBackButton.setColorFilter(Color.argb(255, 255, 255, 255));
} else {
webBackButton.setColorFilter(Color.argb(255, 0, 0, 0));
}
if (browser.canGoForward()) {
webForwButton.setColorFilter(Color.argb(255, 255, 255, 255));
} else {
webForwButton.setColorFilter(Color.argb(255, 0, 0, 0));
}
}
// sharing
private void shareURL() {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
String appname = getString(R.string.app_name);
shareIntent.putExtra(Intent.EXTRA_TEXT,
(getResources().getString(R.string.web_share_begin)) + appname
+ getResources().getString(R.string.web_share_end)
+ browser.getUrl());
startActivity(Intent.createChooser(shareIntent, getResources()
.getString(R.string.share)));
}
@SuppressLint("SetJavaScriptEnabled")
@SuppressWarnings("deprecation")
private void browserSettings() {
// set javascript and zoom and some other settings
browser.getSettings().setJavaScriptEnabled(true);
browser.getSettings().setBuiltInZoomControls(true);
browser.getSettings().setDisplayZoomControls(false);
browser.getSettings().setAppCacheEnabled(true);
browser.getSettings().setDatabaseEnabled(true);
browser.getSettings().setDomStorageEnabled(true);
browser.getSettings().setUseWideViewPort(true);
browser.getSettings().setLoadWithOverviewMode(true);
// enable all plugins (flash)
browser.getSettings().setPluginState(PluginState.ON);
}
@Override
public boolean handleBackPress() {
if (browser.canGoBack()){
browser.goBack();
return true;
}
return false;
}
@Override
public void onActivityResult (int requestCode, int resultCode, Intent data) {
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;
return;
}
@Override
public boolean supportsCollapse() {
return false;
}
}
我唯一想要的是打开webviewe中的所有网址而不是外部网址。 感谢
答案 0 :(得分:0)
而不是
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return handleUri(url);
}
这样做:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (!handleUri(url)) {
view.loadUrl(url);
}
return false;
}
并且对于Android N版本也这样做:
@TargetApi(Build.VERSION_CODES.N)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
if (!handleUri(request.getUrl().toString())) {
view.loadUrl(request.getUrl().toString());
}
return false;
}
所以基本上要么处理你的&#34; handleUri(String url)&#34;在哪里开始一个活动,或者在同一个webview中加载uri。
答案 1 :(得分:0)
在致电loadUrl之前添加此行
YourWebView.setWebViewClient(new WebViewClient());