web-dev-qa-db-ja.com

Android WebView err_unknown_url_scheme

以下の簡単なコードでURLを正しくロードできますが、mailto:whatsapp:および-で始まるhtmlリンクをタップしようとすると「ERR_UNKNOWN_URL_SCHEME」が返されますtg:(テレグラム)。

誰でも私にこれを修正するのを手伝ってもらえますか?残念ながら、私はJavaまったく知りません:(

ありがとう。

import Android.app.Activity;
import Android.os.Bundle;
import Android.webkit.WebSettings;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;

public class MainActivity extends Activity {

    private WebView mWebView;

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

        mWebView = (WebView) findViewById(R.id.activity_main_webview);

        // Force links and redirects to open in the WebView instead of in a browser
        mWebView.setWebViewClient(new WebViewClient());

        // Enable Javascript
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        // Use remote resource
        mWebView.loadUrl("http://myexample.com");
    }
}
13
NGC7803

ウェブビューでクライアントを設定し、これらをインテントに渡す必要があります

webView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if( URLUtil.isNetworkUrl(url) ) {
                return false;
            }
            if (appInstalledOrNot(url)) {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity( intent );
            } else {
                // do something if app is not installed
            }
            return true;
        }

    });
}

アプリがインストールされているかどうかを確認する方法があります

private boolean appInstalledOrNot(String uri) {
        PackageManager pm = getPackageManager();
        try {
            pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
        }

        return false;
    }
12
Cristian Gomez

リンク転送を自分で制御できるWebViewClientのメソッドshouldOverrideUrlLoadingをオーバーライドする必要があります。

html links that starts with mailto: whatsapp: and tg: (Telegram).は「http://」または「https://」で始まる一般的なURLではないため、WebViewは適切な場所に解析できないため、意図を使用してURLをリダイレクトする必要があります。

例えば:

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false;

            try {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                view.getContext().startActivity(intent);
                return true;
            } catch (Exception e) {
                Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e);
                return true;
            }
        }

次に、次のようにWebViewClientをWebViewに設定します。

public class MainActivity extends Activity {

private WebView mWebView;

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

    mWebView = (WebView) findViewById(R.id.activity_main_webview);

    // Force links and redirects to open in the WebView instead of in a browser
    mWebView.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false;

        try {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            view.getContext().startActivity(intent);
            return true;
        } catch (Exception e) {
            Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e);
            return true;
        }
    }
    });

    // Enable Javascript
    WebSettings webSettings = mWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);

    // Use remote resource
    mWebView.loadUrl("http://myexample.com");
}}
4
TTKatrina

実際、WebViewは、mailto、tg、sms、phoneなどのURLスキームをどのように使用するかを示しません。 shouldOverrideUrlloading()メソッドをオーバーライドし、これらのタイプのスキームが見つかったときにWebビューで必要なことを実行する必要があります。

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

            if( URLUtil.isNetworkUrl(url) )
            {
                return false;
            }
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                startActivity(intent);

            }catch(ActivityNotFoundException e)
            {
                Log.e("AndroiRide",e.toString());
                Toast.makeText(MainActivity.this,"No activity found",Toast.LENGTH_LONG).show();
            }

            return true;
        }

shouldOverrideUrlLoading(WebViewビュー、文字列url)はAPIレベル24で廃止されました。

したがって、オーバーライドpublic boolean shouldOverrideUrlLoading(WebViewビュー、WebResourceRequest要求)

@RequiresApi(Build.VERSION_CODES.N)
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
        {
            String url=request.getUrl().toString();
            if( URLUtil.isNetworkUrl(url) )
            {
                return false;
            }
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                startActivity(intent);

            }catch(ActivityNotFoundException e)
            {
                Log.e("AndroiRide",e.toString());
                Toast.makeText(MainActivity.this,"No activity found",Toast.LENGTH_LONG).show();
            }

            return true;
        }

独自のスキームを作成する場合は、コードをカスタマイズします。 詳細[Kotlin&Java code]

2
c49

mailtoリンクはwebviewにロードされません。shouldOverrideUrlLoadingでこのようにチェックし、intentで処理します。

    public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith("mailto:")) {

        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("text/plain");
        share.putExtra(Intent.EXTRA_TEXT, message);
        startActivity(Intent.createChooser(share, "Title of the dialog the system will open"));
        view.reload();
        return true;
    }
  }

同様の質問 Android Webview ERR_UNKNOWN_URL_SCHEME Error

0
sunil sunny