# \[Android]アプリ内メッセージのリンクを制御する

## リンクの制御について

### リンククリック時の挙動

ユーザーがアクション内のリンク（aタグ）をクリックすると、SDKは自動でリンクに指定されているURLを開きます。

この時SDKは、暗黙的インテントを生成し `startActivity` メソッドを呼び出します。\
インテントのアクションは `ACTION_VIEW`、データにはリンクに指定されているURLが設定されます。\
そのため基本的には、`http` または `https` から始まるリンクの場合は Chrome等のブラウザが起動し、それ以外のスキームの場合は、スキームに対応するアプリケーションが起動する形となります。

### リンククリック時にアプリケーション側で処理を行う

リンククリック後、アプリケーション側で処理を行いたい場合は、`InAppMessagingDelegate` クラスの `shouldOpenURL()` メソッドを実装する必要があります。

`InAppMessagingDelegate`クラスは抽象クラスで実装されています。

{% code title="InAppMessagingDelegate.kt" overflow="wrap" %}

```kotlin
/**
 * アプリ内メッセージで発生するイベントを委譲するためのクラスです。
 */
abstract class InAppMessagingDelegate {
    /* 実装省略 */

    /**
     * 接客サービスアクション中のボタンがクリックされた際に、リンクをSDK側で自動的に処理するかどうか問い合わせます。
     *
     * @param[url] リンクURL
     * @return `true` を返した場合はSDK側でリンクを自動で開きます。`false` を返した場合はSDK側では何もしません。
     */
    open fun shouldOpenURL(url: Uri): Boolean {
        return true
    }
}
```

{% endcode %}

アプリ内メッセージ経由のリンク遷移持に独自の処理を追加したい場合は`InAppMessagingDelegate`クラスを継承の後にオーバーライドすることにより挙動を変更することができます。

{% tabs %}
{% tab title="Kotlin" %}
{% code overflow="wrap" %}

```kotlin
override fun shouldOpenURL(url: Uri): Boolean {
  // アプリケーション側で独自の処理を行う

  // SDKデフォルトの処理を行わない場合は `false` を返す
  return false
}
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code overflow="wrap" %}

```java
@Override
public boolean shouldOpenURL(Uri url) {
  // アプリケーション側で独自の処理を行う

  // SDKデフォルトの処理を行わない場合は `false` を返す
  return false;
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

また委譲先のインスタンスの登録は、以下のように実装します。

{% tabs %}
{% tab title="Kotlin" %}
{% code overflow="wrap" %}

```kotlin
InAppMessaging.delegate = instance
```

{% endcode %}
{% endtab %}

{% tab title="Java" %}
{% code overflow="wrap" %}

```java
InAppMessaging.setDelegate(instance);
```

{% endcode %}
{% endtab %}
{% endtabs %}

全体のサンプルコードとしては以下のような形でリンクの制御できます。

{% code title="MainActivity.kt" overflow="wrap" %}

```kotlin
  InAppMessaging.delegate = object : InAppMessagingDelegate() {
      override fun shouldOpenURL(url: Uri): Boolean {
          /* アプリケーション独自の実装を追加　*/
          return super.shouldOpenURL(url)
      }
  }
```

{% endcode %}

## アプリケーション内の特定画面に遷移させる

アプリ内メッセージのリンククリックをトリガーにアプリケーション内の特定画面に遷移させるには、リンクURLとしてディープリンクURLを設定する必要があります。

この時アプリ側の AndroidManifest.xml にもインテント呼び出しに応じて起動する Activity の設定を行っておく必要があります。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://app.developers.karte.io/android-sdk-appendix/appendix-iam-link-control-android-sdk.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
