Android studio 3 webView mailto: ссылки - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь собрать воедино простое приложение с webView.

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;
    }

}

Заранее спасибо.

1 Ответ

0 голосов
/ 17 мая 2018

Как я уже сказал в своем комментарии, использование WebViewClient - это именно то, как вы бы это исправили, если я правильно понимаю.

Ваша проблема:

Проблемав том, что когда вы нажимаете эту ссылку mailto:, WebView пытается открыть почтовый клиент по умолчанию, но HTML не отправляет Intent, и решение заключается в том, что вам нужно создать это Intent.

Решение:

// 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;
   }
});

Затем метод sendEmail():

// Now you need the sendEmail method to open the devices mail client and set the relevant fields

private Intent sendEmail(Context context, String email, String subject, String body){

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.putExtra(Intent.EXTRA_EMAIL, email); // if you wanted to send multiple emails then you would use intent.putExtra(Intent.EXTRA_EMAIL, new String[] { email })
intent.putExtra(Intent.EXTRA_TEXT, body); // optional if you have the body in your mailto: link
intent.putExtra(Intent.EXTRA_SUBJECT, subject); // optional if you have the subject in your mailto: link
intent.setType("text/plain");

return intent;
}

Конечные точки:

Я просто хочу сказать, что если вы используете WebView, вы должны присоединить WebViewClient, чтобы использовать передовой опыт.Это позволяет вам обрабатывать все, что касается веб-просмотра, а не просто быть статическим элементом.Метод shouldOverrideUrlLoading() и onErrorReceived() - это минимум, который вам следует использовать при использовании веб-просмотра в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...