Webview - 在外部应用程序和浏览器中打开链接 / 安卓

3
我是一个Android应用程序制作的初学者。我已经用HTML制作了一个Web应用程序,希望能够在我正在使用Android Studio制作的应用程序中使用它。我成功地在Android Studio中创建了一个简单的Web视图,在我的设备上测试时,我的Web应用程序可以正常工作。唯一的问题是Web视图处理了所有我的Web应用程序内部的URL。Web应用程序由选项卡组成,当我点击它们时,会将我引导到不同的页面,这正是我想要的。但是,我有联系按钮和不同的链接,我希望能够从Web视图中“释放”它们。以联系按钮为例,我有一个Galaxy Note手机用来测试我的应用程序。当我打开我的应用程序时,我可以看到我的Web应用程序并且可以浏览。当我点击联系按钮时,Web视图处理链接并给我一个“无法加载页面”的错误信息,而不是打开我的手机上的邮件应用程序。我还有带有链接的按钮,我希望能够在我的手机上打开外部浏览器。我希望你理解我的问题,对我的糟糕英语表示抱歉。
这是我的Web视图代码的一部分。
Mainactivity.java
public class MainActivity extends ActionBarActivity {

WebView browser;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    browser = (WebView) findViewById(R.id.wvwMain);

    browser.getSettings().setJavaScriptEnabled(true);
    browser.getSettings().setLoadWithOverviewMode(true);
    browser.getSettings().setUseWideViewPort(true);

    browser.setWebViewClient(new ourViewClient());
    try {
        browser.loadUrl("http://WebAppURL");
    } catch (Exception e) {
        e.printStackTrace();
    }

}

OurViewClient.java

public class ourViewClient extends WebViewClient {

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);

    return true; 
 }    
}
2个回答

6
尝试按照以下方式实现您的WebViewClient

像这样

 private class VideoWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            try{
                System.out.println("url called:::" + url);
                if (url.startsWith("tel:")) {
                    Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
                    startActivity(intent);
                }  else if (url.startsWith("http:")
                        || url.startsWith("https:")) {

                     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
                     startActivity(intent);

                }  else if (url.startsWith("mailto:")) {

                    MailTo mt=MailTo.parse(url);

                    send_email(mt.getTo());

                }
                else {
                    return false;
                }
            }catch(Exception e){
                e.printStackTrace();
            }

            return true;
        }

    }

并创建类似以下的发送邮件函数:
   public void send_email(String email_add) {
    System.out.println("Email address::::" + email_add);

    final Intent emailIntent = new Intent(
            android.content.Intent.ACTION_SEND);
    emailIntent.setType("plain/text");
    emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL,
            new String[] { email_add });
    emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "");
    yourActivity.this.startActivity(
            Intent.createChooser(emailIntent, "Send mail..."));

}

我收到了 Error:(24, 17) cannot find symbol method startActivity(android.content.Intent)Error:(58, 9) cannot find symbol method getActivity() 的错误信息。 - Stumpp
错误已经消失了,但是Error:(24, 17) cannot find symbol method startActivity(android.content.Intent)怎么办? - Stumpp
@Stumpp 我告诉过你要尝试这种方式:MainActivity.this.startActivity(Intent.createChooser(emailIntent, "Send mail...")); - M D
@Stumpp 最好是把你的代码发布出来,我想看看你是如何集成的? - M D
1
我已经让它工作了,但似乎每个链接都会在外部浏览器中打开,无论它是否包含http。我有这些选项卡在我的Web应用程序中,我想在Web视图中打开它们,但现在它们在外部打开。我该如何解决这个问题? - Stumpp

1
我的代码运行良好,只需记住代码行的顺序和位置..将代码复制并粘贴到您的mainactivity.java文件中。
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mywebView = findViewById(R.id.myview);
    WebSettings webSettings = mywebView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    mywebView.loadUrl("http://yourwebsitename.com");
    mywebView.setWebViewClient(new MyCustomWebViewClient());

}

class MyCustomWebViewClient extends WebViewClient {

    @Override
    public  boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("yourwebsitename.com")) {
            //open url contents in webview
            return false;
        } else {
            //here open external links in external browser or app
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }

    }
}
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接