Android studio 3 webView邮件收件人:链接

Android studio 3 webView邮件收件人:链接,android,webview,mailto,Android,Webview,Mailto,我正试图将一个简单的应用程序与一个片段中的网络视图组合在一起 我正在加载的html有一个mailto:链接,单击该链接会使应用程序崩溃。我在这里浏览了一些答案,他们都说你必须使用WebViewClient,这很好,有各种各样的例子,但我无法让它们中的任何一个起作用。有人能解释我是怎么做的吗 这是我当前的tab.java import android.support.v4.app.Fragment; import android.os.Bundle; import android.view.Lay

我正试图将一个简单的应用程序与一个片段中的网络视图组合在一起

我正在加载的html有一个
mailto:
链接,单击该链接会使应用程序崩溃。我在这里浏览了一些答案,他们都说你必须使用WebViewClient,这很好,有各种各样的例子,但我无法让它们中的任何一个起作用。有人能解释我是怎么做的吗

这是我当前的tab.java

import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebSettings;
import android.webkit.WebView;

public class Tab1Home extends Fragment {
    WebView webView;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.tab1home, container, false);
        WebView webView = (WebView) rootView.findViewById(R.id.webviewTab1);
        WebSettings settings = webView.getSettings();
        settings.setDefaultTextEncodingName("utf-8");
        settings.setJavaScriptEnabled(true);
        webView.loadUrl("file:///android_asset/tab1/tab1.html");
        return rootView;
    }

}

提前谢谢。

正如我在评论中所说,如果我理解正确,使用
WebViewClient
正是您解决这个问题的方法

你的问题:

// add a WebViewClient to handle url requests
webView.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url){

    //You can also use 'url.startsWith()'
    if (url.contains("mailto:")){
        MailTo mailTo = MailTo.parse(url);

        // make sure you have a context set somewhere in your activity, other wise use YOUR_ACTIVITY_NAME.this. 
        // For this example I am using mContext because that is my context variable
        Intent mailIntent = sendEmail(mContext, mailTo.getTo(), mailTo.getSubject(), mailTo.getBody()); // I added these extra parameters just incase you need to send those
        mContext.startActivity(mailIntent);
        view.reload(); // reload your webview using view.reload()

        return true;
    }else{
        // Handle what t do if the link doesn't contain or start with mailto:
        view.loadURL(url); // you want to use this otherwise the links in the webview won't work
    }
    return true;
   }
});
问题是,当您单击
mailto:
链接时,WebView试图打开默认邮件客户端,但HTML不发送意图,解决方案是您需要创建此意图

解决方案:

// add a WebViewClient to handle url requests
webView.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url){

    //You can also use 'url.startsWith()'
    if (url.contains("mailto:")){
        MailTo mailTo = MailTo.parse(url);

        // make sure you have a context set somewhere in your activity, other wise use YOUR_ACTIVITY_NAME.this. 
        // For this example I am using mContext because that is my context variable
        Intent mailIntent = sendEmail(mContext, mailTo.getTo(), mailTo.getSubject(), mailTo.getBody()); // I added these extra parameters just incase you need to send those
        mContext.startActivity(mailIntent);
        view.reload(); // reload your webview using view.reload()

        return true;
    }else{
        // Handle what t do if the link doesn't contain or start with mailto:
        view.loadURL(url); // you want to use this otherwise the links in the webview won't work
    }
    return true;
   }
});
然后方法
sendmail()

结束点:

// add a WebViewClient to handle url requests
webView.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url){

    //You can also use 'url.startsWith()'
    if (url.contains("mailto:")){
        MailTo mailTo = MailTo.parse(url);

        // make sure you have a context set somewhere in your activity, other wise use YOUR_ACTIVITY_NAME.this. 
        // For this example I am using mContext because that is my context variable
        Intent mailIntent = sendEmail(mContext, mailTo.getTo(), mailTo.getSubject(), mailTo.getBody()); // I added these extra parameters just incase you need to send those
        mContext.startActivity(mailIntent);
        view.reload(); // reload your webview using view.reload()

        return true;
    }else{
        // Handle what t do if the link doesn't contain or start with mailto:
        view.loadURL(url); // you want to use this otherwise the links in the webview won't work
    }
    return true;
   }
});

我只想说,如果您使用的是WebView,那么您应该附加一个WebViewClient,以便使用最佳实践。它允许您处理有关该webview的所有内容,而不仅仅是一个静态元素。在应用程序中使用webview时,应该至少使用
shouldOverrideUrlLoading()
onErrorReceived()
方法。

能否请您将崩溃的堆栈跟踪添加到您的问题中?我看不到任何错误,该应用程序只是在模拟器中关闭,再次运行并单击它时,我会得到“持续停止”消息。他们是对的。你需要使用
WebViewClient
,然后你可以实现方法
shouldOverrideUrlLoading()
这将允许你管理特定的URL,如果你需要感谢你的信息,结果证明我的错误是第8层的问题:(但上面已经帮助我实现了我所需要的。