سؤال

لقد قمت بإنشاء تطبيق عرض ويب ، فإن الصفحة التي يتم عرضها في سوق الميزات: // روابط ولكن عند النقر عليها ، أحصل على شاشة 404 مع الخطأ الذي لم يتم دعم البروتوكول. لقد حاولت البحث من خلال الوثائق ولكن لم أتمكن من العثور على أي شيء يتعلق بهذا. أي مساعدة هي محل تقدير كبير.

هل كانت مفيدة؟

المحلول

بالنسبة لي ، لم يكن شيء JavaScript حلاً لأن HTML ليس تحت سيطرتي. لذلك إذا كنت بحاجة إلى التحكم في هذا من جانب التطبيق ، فهناك حل بسيط نسبي: اشتق من WebViewClientوحقن التنفيذ باستخدام WebView.setWebViewClient(). كل ما تحتاجه للتجاوز في WebViewClientالتنفيذ هو shouldOverrideUrlLoading الطريقة كما هو موضح هنا:

public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url != null && url.startsWith("market://")) {
        view.getContext().startActivity(
            new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
        return true;
    } else {
        return false;
    }
}

بالنسبة لي هذا يعمل بشكل جيد.

نصائح أخرى

للحصول على روابط للعمل ، يجب تثبيت تطبيق السوق على جهازك/المحاكي. كما يحتاج تطبيقك إلى طلب إذن للوصول إلى الشبكة.

تحديث: كحل بديل ، يمكنك الاتصال برمز Java من داخل WebView ، على سبيل المثال إذا قمت بإنشاء روابط مثل هذا:

<a href="javascript:go('market://your.path.to.market.app')">..</a>

حدد وظيفة JavaScript المسمى Go ():

<script type="text/javascript">
   function go(link) {
     if (handler) {
           handler.go(link);
         } else {
           document.location = link;
         }
   }
</script>

يمكنك بعد ذلك المرور في كائن معالج إلى WebView:

webview.addJavascriptInterface(new Handler() {
        @Override
        public void go(String marketUrl) {
                         //start market intent here
        }
    },  "handler");

يمكن تعريف واجهة المعالج على النحو التالي:

   public interface Handler{

    public void go(String url);

}

آمل أن يساعدك هذا

public boolean shouldOverrideUrlLoading(WebView view, String url) 
{
    if (url.startsWith("market://")||url.startsWith("vnd:youtube")||url.startsWith("tel:")||url.startsWith("mailto:"))
    {
        Intent intent = new Intent(Intent.ACTION_VIEW); 
        intent.setData(Uri.parse(url)); 
        startActivity(intent);
        return true;
     }
    else{
        view.loadUrl(url);
        return true;
        }
}

يعمل لدي:

webView = (WebView) findViewById(R.id.webView);
webView.setWebChromeClient(new WebChromeClient());
webView.getSettings().setPluginState(WebSettings.PluginState.ON);
webView.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND);

webView.setWebViewClient(new MyWebViewClient());
webView.getSettings().setJavaScriptEnabled(true);

webView.loadUrl("http://myweb.com");

private class MyWebViewClient extends WebViewClient {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url != null && url.startsWith("whatsapp://")) {
            view.getContext().startActivity(
                    new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
            return true;
        } else {
            return false;
        }
    }
}

من المهم أن نفهم كيف يعمل WebView وعملائه (WebViewClient و WebChromeclient). من فضلك اذهب من خلال http://therockncoder.blogspot.in/2014/04/undergening-droids-webchromeclient.html

في طريقة WebViewClient في حالة ustoverrideurlloading () ، يمكنك تحديد ما إذا كنت تريد فتح الرابط في متصفح جديد أو داخل WebView. إذا لم تقم بتجاوز هذه الطريقة ، فسيتم افتتاح الرابط افتراضيًا في متصفح جديد خارج تطبيق Android الخاص بك. إذا كنت ترغب في فتح داخل WebView ، فتجاوز الطريقة على النحو التالي

public boolean shouldOverrideUrlLoading(WebView view, String url) { <br>
    Log.v("activity", "INSIDE WEBVIEW CLIENT ON shouldOverrideUrlLoading");
        view.loadUrl(url);
        return false; //need to understand return value based on usage
    }

مخططات مثل WhatsApp: // إرسال؟ Text = Hello ٪ 20World! أو السوق: // التفاصيل؟ id = xx.xx.xx سيتم فتح التطبيقات المقابلة تلقائيًا إذا تم فتحها خارج مقابلة الويب وإذا تم تثبيت هذا التطبيق على الهاتف.

إذا كنت ترغب في فتح روابط معينة داخل WebView ومخططات محددة خارج WebView ، فأنت بحاجة إلى تجاوز طريقة WebChromeclients onCreatewIndow () كما هو موضح في الرابط الوارد أعلاه. يجب أن يحل الغرض.

بدلاً من إضافة التحقق من مخطط معين ، وتعديل SEVEN ، فإن هذا سيعمل لجميع المخططات

public boolean shouldOverrideUrlLoading(WebView view, String url) {
 String host= Uri.parse(url).getHost();
 if (host == null) {
    view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
    return true;
   }

   view.loadUrl(url);
   return false;
 }

أبسط حل

 Intent newApp = new Intent(Intent.ACTION_VIEW,  Uri.parse(URL));
startActivity(newApp);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top