teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ご回答を修正

2018/11/08 10:15

投稿

退会済みユーザー
answer CHANGED
@@ -1,20 +1,52 @@
1
- intentスキームURLを用いれば実現きそす。
1
+ Web側対応するのは難しいよに思えます。
2
2
 
3
+ もし、アプリ側を修正してもよいのであれば、`shouldOverrideUrlLoading()`を独自実装した`WebViewClient`を`WebView`に設定することにより、実現できます。
4
+
5
+ ```Java
3
- 次の形式のURLを、AndroidのWebViewで開こうとすると、VIEWアクションに対応するアプリが起動します。
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アクションを用いた方法に変更

2018/11/08 10:15

投稿

退会済みユーザー
answer CHANGED
@@ -1,13 +1,13 @@
1
- 遷移先をChromeで開くのであれば、intentスキームのURLを用いれば実現できそうです。
1
+ intentスキームのURLを用いれば実現できそうです。
2
2
 
3
- 次の形式のURLを、AndroidのWebViewで開こうとすると、Chromeが起動します。
3
+ 次の形式のURLを、AndroidのWebViewで開こうとすると、VIEWアクションに対応するアプリが起動します。
4
4
  ```
5
- intent://《遷移先URL(スキーム除く)》#Intent;scheme=《遷移先URLのスキーム》;package=com.android.chrome;end
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;package=com.android.chrome;end">外部リンク</a>
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アプリからのアクセスであるか判別し、遷移先を制御する必要があります。