回答編集履歴
2
ご回答を修正
answer
CHANGED
@@ -1,20 +1,52 @@
|
|
1
|
-
|
1
|
+
Web側のみで対応するのは難しいように思えます。
|
2
2
|
|
3
|
+
もし、アプリ側を修正してもよいのであれば、`shouldOverrideUrlLoading()`を独自実装した`WebViewClient`を`WebView`に設定することにより、実現できます。
|
4
|
+
|
5
|
+
```Java
|
3
|
-
|
6
|
+
public class MyWebViewClient extends WebViewClient {
|
7
|
+
|
8
|
+
@Override
|
9
|
+
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
10
|
+
Uri uri = request.getUri();
|
11
|
+
String uriPath = uri.getPath();
|
12
|
+
|
13
|
+
if(!uriPath.startsWith("《サイトのルートURL》")){
|
14
|
+
Intent intent = new Intent(Intent.ACTION_VIEW, uri)
|
15
|
+
view.getContext().startActivity(intent);
|
16
|
+
return true;
|
17
|
+
}
|
18
|
+
|
19
|
+
return false;
|
20
|
+
}
|
21
|
+
}
|
4
22
|
```
|
23
|
+
|
24
|
+
```Java
|
25
|
+
//WebViewを表示するアクティビティ内
|
26
|
+
webView.setWebViewClient(new MyWebViewClient());
|
27
|
+
```
|
28
|
+
|
29
|
+
---
|
30
|
+
以下は、誤回答です。
|
31
|
+
Android版Chromeであれば、下記のように動作しますが、WebViewでは動作しないようです。動作させるには、前述のように`shouldOverrideUrlLoading()`で制御する必要があります。
|
32
|
+
|
33
|
+
~~intentスキームのURLを用いれば実現できそうです。~~
|
34
|
+
|
35
|
+
~~次の形式のURLを、AndroidのWebViewで開こうとすると、VIEWアクションに対応するアプリが起動します。~~
|
36
|
+
```
|
5
37
|
intent://《遷移先URL(スキーム除く)》#Intent;scheme=《遷移先URLのスキーム》;action=android.intent.action.VIEW;end
|
6
38
|
```
|
7
39
|
|
8
|
-
例えば、この質問の場合、次のように指定すればOKです。
|
40
|
+
~~例えば、この質問の場合、次のように指定すればOKです。~~
|
9
41
|
``` html
|
10
42
|
<a href="intent://teratail.com/questions/156743#Intent;scheme=https;action=android.intent.action.VIEW;end">外部リンク</a>
|
11
43
|
```
|
12
44
|
|
13
|
-
ただ、`<a>`タグにURLを直接指定すると、通常のブラウザで遷移できなくなってしまいます。なので、通常のブラウザも考慮する場合、何らかの方法でAndroidアプリからのアクセスであるか判別し、遷移先を制御する必要があります。
|
45
|
+
~~ただ、`<a>`タグにURLを直接指定すると、通常のブラウザで遷移できなくなってしまいます。なので、通常のブラウザも考慮する場合、何らかの方法でAndroidアプリからのアクセスであるか判別し、遷移先を制御する必要があります。~~
|
14
46
|
|
15
|
-
Androidアプリからのアクセスであるか判別するには、JavaScriptでユーザーエージェントによる判別を行うがお手軽です。ただ、一部のAndroid端末で、内蔵ブラウザとWebViewのユーザーエージェントが同じであるため([参考2](https://www.au.com/developer/android/kishu/ua/))、正確な判定ができません。
|
47
|
+
~~Androidアプリからのアクセスであるか判別するには、JavaScriptでユーザーエージェントによる判別を行うがお手軽です。ただ、一部のAndroid端末で、内蔵ブラウザとWebViewのユーザーエージェントが同じであるため([参考2](https://www.au.com/developer/android/kishu/ua/))、正確な判定ができません。~~
|
16
48
|
|
17
|
-
質問の前提を破ることになりますが、通常のブラウザも考慮する場合、AndroidアプリのWebViewのユーザーエージェントに独自の文字列を付与するなどの対応が必要かもしれません。
|
49
|
+
~~質問の前提を破ることになりますが、通常のブラウザも考慮する場合、AndroidアプリのWebViewのユーザーエージェントに独自の文字列を付与するなどの対応が必要かもしれません。~~
|
18
50
|
|
19
51
|
---
|
20
52
|
参考1:[Stack Overflow - What is the intent to launch any website link in Google Chrome](https://stackoverflow.com/questions/29250152/what-is-the-intent-to-launch-any-website-link-in-google-chrome)
|
1
VIEWアクションを用いた方法に変更
answer
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
|
1
|
+
intentスキームのURLを用いれば実現できそうです。
|
2
2
|
|
3
|
-
次の形式のURLを、AndroidのWebViewで開こうとすると、
|
3
|
+
次の形式のURLを、AndroidのWebViewで開こうとすると、VIEWアクションに対応するアプリが起動します。
|
4
4
|
```
|
5
|
-
intent://《遷移先URL(スキーム除く)》#Intent;scheme=《遷移先URLのスキーム》;
|
5
|
+
intent://《遷移先URL(スキーム除く)》#Intent;scheme=《遷移先URLのスキーム》;action=android.intent.action.VIEW;end
|
6
6
|
```
|
7
7
|
|
8
8
|
例えば、この質問の場合、次のように指定すればOKです。
|
9
9
|
``` html
|
10
|
-
<a href="intent://teratail.com/questions/156743#Intent;scheme=https;
|
10
|
+
<a href="intent://teratail.com/questions/156743#Intent;scheme=https;action=android.intent.action.VIEW;end">外部リンク</a>
|
11
11
|
```
|
12
12
|
|
13
13
|
ただ、`<a>`タグにURLを直接指定すると、通常のブラウザで遷移できなくなってしまいます。なので、通常のブラウザも考慮する場合、何らかの方法でAndroidアプリからのアクセスであるか判別し、遷移先を制御する必要があります。
|