2016-02-20 2 views
12

Ich lade eine Webseite in WebView. Es gibt einen Link in der Webseite, der auf dem Desktop die Datei herunterladen wird, aber in der App sollte der Link einen Toast anzeigen, der besagt, dass der Link für die App deaktiviert ist.Erhalten Sie href Wert von Anchor-Tag in Android WebView, wenn Link geklickt wird

Ich bin mir nicht sicher, wie man den Wert von href des Anchor-Tags erhält, wenn auf den Link geklickt wird.

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

Kann jemand eine Idee oder einen Beispielcode teilen, wie man das macht.

EDIT: 1

Hier ist, was ich tue momentan:

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

Das Problem bei diesem Ansatz ist: Wenn ich auf den Link klicken, erhalte ich die URL in der Verlängerung. Es funktioniert gut bis hier. Aber vom nächsten Mal, egal wo ich auf die Webansicht klicke, wird das gleiche Extra zurückgegeben. Also selbst wenn ich auf ein Bild klicke, nachdem ich auf die URL geklickt habe, bekomme ich die gleiche URL im Extra. Nicht sicher, ob ich etwas falsch mache. Oder ist das der richtige Ansatz?

Bitte lassen Sie mich wissen, wenn Sie irgendwelche Details benötigen.

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

    } 

Nun bekomme ich die URL, die in der letzten action_down Ereignis geklickt wird. Wie bekomme ich die aktuelle URL?

EDIT 3 (Versuch mit 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); 

Ausgabe in logcat, wenn der Link angeklickt wird.

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 

Antwort

1

Die meisten Arbeiten können sich auf der Webseite Seite getan werden, Sie haben Java-Skript schreiben, um zu identifizieren, welches Gerät auf die Seite zugreift (Mobilgerät, Desktop usw.), wenn sein Mobiltelefon Java-Skriptbindungsverfahren verwendet, um den nativen Android-Code anzurufen, um Toast-Nachricht anzuzeigen

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 Seite (diese Probe bekam einen Button-Klick)

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

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

Da Sie eine WebView verwenden und die Verbindung ist nicht Java-Script diese ist sehr einfach mit einem WebViewClient zu erreichen, mit dem Sie Ihr WebView

überwachen können 10
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 
    } 

}); 

Da Ihre URL in .mp3 endet, wird die Datei möglicherweise als Ressource behandelt. Sie sollten auch die Methode shouldInterceptRequest des WebViewClient überschreiben, um dies zu überprüfen.

@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

Entschuldigung für die späte Antwort. Ich habe diesen Ansatz von Anfang an ausprobiert. Aber wenn ich auf den Link klicke, wird shouldOverrideUrlLoading nicht aufgerufen.Die einzige Zeit, die ich die URL erhalte, ist, wenn ich onTouchListener auf dem WebView verwende, wie ich in der Frage Beispiel –

+0

erwähnt. Wenn der Webview-Client auf der Webansicht korrekt eingestellt ist, URL immer veranlassen, die Methode aufgerufen werden. Wenn es sich um einen Formularpost handelt, ist das nicht der Fall, aber Sie haben einen Ankerlink angegeben. Haben Sie das gleichzeitig mit dem Touch Listener verwendet? Da dies natürlich nicht funktioniert, wenn Sie das Ereignis abbrechen –

+0

Ich habe die Frage mit WebViewClient aktualisiert. Bitte guck dir das an. Ich benutze beide nicht gleichzeitig. Zuerst versuchte ich mit WebViewClient, aber ich konnte die URL von shouldOverrideUrlLoading nicht erhalten. Also, ich habe versucht mit onTouchListener. –