Ł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
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 –
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 –
, 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. –