2016-02-20 7 views
12

Ładowanie strony w WebView. Na stronie znajduje się link, który na pulpicie pobierze plik, ale w aplikacji link powinien wyświetlać Toast, informujący, że link jest wyłączony dla aplikacji.Uzyskaj wartość href z tagu kotwicy w Android WebView po kliknięciu linku

Nie wiem, jak uzyskać wartość z href znacznika zakotwiczenia po kliknięciu łącza.

<a class="btn btn-primary" download="http://xx.xxx.com/wp-content/uploads/2015/11/abc-27-15.mp3" href="http://xx.xxx.com/wp-content/uploads/2015/11/abc-27-15.mp3"> 
<i class="fa fa-download"></i> Download Audio</a> 

Czy ktoś może podzielić się pomysł lub przykładowy kod, jak to zrobić.

EDIT: 1

Oto co robię obecnie:

private static final String URL = "http://xx.xxx.com/wp-content/uploads/"; 

webView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       if (event.getAction() == MotionEvent.ACTION_DOWN) { 

        WebView.HitTestResult hr = ((WebView) v).getHitTestResult(); 
        String extra = hr.getExtra(); 

        if (extra != null && extra.startsWith(URL) && extra.endsWith(".mp3")) { 
         Log.d("WebviewActivity", "Extra: " + extra); 
         Log.d("WebviewActivity", "Contains URL"); 

         return true; 
        } 
       } 

       return false; 
      } 
     }); 

Problem z tym podejściem jest: Po kliknięciu na link, pojawia się adres URL w extra. Działa dobrze, aż tutaj. Ale od następnego razu, niezależnie od tego, gdzie kliknę w podgląd strony internetowej, zwracane jest to samo dodatkowe. Więc nawet jeśli kliknę obraz po kliknięciu adresu URL, otrzymam ten sam adres URL w pliku dodatkowym. Nie jestem pewien, czy robię coś źle. Czy to jest właściwe podejście.

Proszę dać mi znać, jeśli potrzebujesz jakichkolwiek informacji.

EDIT: 2

private Handler mHandler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 
      // Get link-URL. 
      String url = (String) msg.getData().get("url"); 

      // Do something with it. 
      if (url != null) { 
       Log.d(TAG, "URL: "+url); 
      } 
     } 
    }; 



     webView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       if (event.getAction() == MotionEvent.ACTION_DOWN) { 

        WebView.HitTestResult hr = ((WebView) v).getHitTestResult(); 


        if (hr.getType() == WebView.HitTestResult.SRC_ANCHOR_TYPE) { 

         Message msg = mHandler.obtainMessage(); 
         webView.requestFocusNodeHref(msg); 
        } 


       } 

       return false; 
      } 
     }); 



     webView.loadUrl(mUrl); 

    } 

Teraz mogę uzyskać adres URL, który kliknął w ostatnim przypadku action_down. Jak uzyskać aktualny adres URL?

EDIT 3 (próba z webviewclient:

private class MyWebViewClient extends WebViewClient { 

     private static final String URL = "xx.xxx.com/wp-content/uploads/"; 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 

      if (!isFinishing()) 
       mProgressDialog.show(); 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      mProgressDialog.dismiss(); 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, 
            String description, String failingUrl) { 
      super.onReceivedError(view, errorCode, description, failingUrl); 

      Toast.makeText(WebviewActivity.this, 
        "Please check your internet " + "connection and try again", 
        Toast.LENGTH_SHORT).show(); 
     } 


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

      Log.d("xxx", "Url: " + url); 

      if(url.contains(URL)) { 
       Log.d("xxx", "Url Contains: " + URL); 
       return true; 
      } 

      return false; 
     } 

    } 


mMyWebViewClient = new MyWebViewClient(); 
     webView.setWebViewClient(mMyWebViewClient); 

Wyjście w LogCat po kliknięciu łącza.

03-01 15:38:19.402 19626-19626/com.xx.xxx D/cr_Ime: [ImeAdapter.java:553] focusedNodeChanged: isEditable [false] 
03-01 15:38:19.428 19626-19626/com.xx.xxx D/cr_Ime: [ImeAdapter.java:253] updateKeyboardVisibility: type [0->0], flags [0], show [true], 
03-01 15:38:19.428 19626-19626/com.xx.xxx D/cr_Ime: [ImeAdapter.java:326] hideKeyboard 
03-01 15:38:19.429 19626-19626/com.xx.xxx D/cr_Ime: [InputMethodManagerWrapper.java:56] isActive: true 
03-01 15:38:19.429 19626-19626/com.xx.xxx D/cr_Ime: [InputMethodManagerWrapper.java:65] hideSoftInputFromWindow 

Odpowiedz

1

Większość prac można zrobić z boku strony internetowej sam masz napisać skrypt języka Java, aby określić, które urządzenie uzyskuje dostęp do strony (mobilnej, pulpitu itp.), jeśli jego telefon używa techniki wiązania skryptu Java do wywoływania natywnego kodu Android, aby wyświetlić wiadomość Toast.http://developer.android.com/guide/webapps/webview.html

WebView webView = (WebView) findViewById(R.id.webview); 
webView.addJavascriptInterface(new WebAppInterface(this), "Android"); 

WebAppInterface.java

public class WebAppInterface { 
    Context mContext; 

    /** Instantiate the interface and set the context */ 
    WebAppInterface(Context c) { 
     mContext = c; 
    } 

    /** Show a toast from the web page */ 
    @JavascriptInterface 
    public void showToast(String toast) { 
     Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
    } 
} 

YourHTML Page (próbka ta ma przycisk Click)

<input type="button" value="Say hello" onClick="showAndroidToast('Hello 
      Android!')" /> 

    <script type="text/javascript"> 
    function showAndroidToast(toast) { 
     Android.showToast(toast); 
    } 
</script> 
4

Ponieważ używasz WebView i link nie jest skrypt Java to jest bardzo łatwy do osiągnięcia dzięki WebViewClient, którego możesz użyć do monitorowania swojej WebView

myWebView.setWebViewClient(new WebViewClient() { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     // check something unique to the urls you want to block 
     if (url.contains("xx.xxx.com")) { 
      Toast.make... //trigger the toast 
      return true; //with return true, the webview wont try rendering the url 
     } 
     return false; //let other links work normally 
    } 

}); 

Możliwe, że ponieważ adres URL kończy się na .mp3, plik traktowany jest jak zasób. Należy również zastąpić metodę WebViewClient, aby to sprawdzić.

@Override 
@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { 
    String url = request.getUrl().toString(); 
    Log.d("XXX", "Url from API21 shouldInterceptRequest : " + url); 
    if (url.contains(URL)) { 
     return new WebResourceResponse("text/html", "UTF-8", "<html><body>No downloading from app</body></html>"); 
    } else { 
     return null; 
    } 
} 

public WebResourceResponse shouldInterceptRequest (WebView view, String url) { 
    Log.d("XXX", "Url from shouldInterceptRequest : " + url); 
    if (url.contains(URL)) { 
     return new WebResourceResponse("text/html", "UTF-8", "<html><body>No downloading from app</body></html>"); 
    } else { 
     return null; 
    } 
} 
+0

Przepraszamy za spóźnioną odpowiedź. Próbowałem tego podejścia na samym początku. Ale kiedy kliknę link, nie powinno się wywoływaćOverrideUrlLoading.Jedyny przypadek, w którym uzyskuję adres URL, to kiedy korzystam z metody onTouchListener w WebView, o czym wspomniałem w pytaniu o kod przykładowy –

+0

Jeśli klient webview jest ustawiony poprawnie na widoku internetowym, adresy URL zawsze powodują wywołanie tej metody. Jeśli jest to post, to nie jest tak, ale powiedziałeś link do kotwicy. Czy używałeś tego w tym samym czasie, co słuchacz dotyku? Ponieważ oczywiście to nie zadziała, gdy anulujesz zdarzenie –

+0

, zaktualizowałem to pytanie za pomocą WebViewClient. Proszę spojrzeć. Nie używam obu w tym samym czasie. Najpierw próbowałem z WebViewClient, ale nie mogłem uzyskać adresu URL z shouldOverrideUrlLoading. Tak, próbowałem z onTouchListener. –

Powiązane problemy