Webview活动

时间:2017-03-08 15:27:10

标签: android webview

我正在建立一个应用程序,即时通讯使用此代码

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中的所有网址而不是外部网址。 感谢

2 个答案:

答案 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());