API: Etc

    API: Etc


    記事の要約

    ShopLive.mute

    プレイヤーをミュートします。

    fun mute()


    ShopLive.unmute

    プレイヤーのミュートを解除します。

    fun unmute()


    ShopLiveCampaigns.getCampaigns

    accessKey に属するキャンペーン(配信)の一覧と、各キャンペーンの現在の状態を取得します。呼び出す前に ShopLive.setAccessKey(accessKey) で accessKey を設定してください。Android SDK 1.8.14 以降で利用できます。

    class ShopLiveCampaigns {
        companion object {
            @JvmStatic
            @JvmOverloads
            fun getCampaigns(
                request: ShopLiveCampaignListRequest = ShopLiveCampaignListRequest(),
                listener: ShopLiveCampaignListListener,
            ): ShopLiveCancellable
        }
    }
    
    interface ShopLiveCampaignListListener {
        fun onData(response: ShopLiveCampaignListResponse)
        fun onError(error: ShopLiveCommonError)
    }
    
    interface ShopLiveCancellable {
        fun cancel()
    }

    注意

    • 結果は onData / onError のどちらかがちょうど 1 回、メインスレッドで呼び出されます。結果が 0 件でもエラーではなく、空のリストで onData が呼び出されます。

    • 戻り値 ShopLiveCancellable の cancel() で進行中のリクエストをキャンセルできます。キャンセル後はどのコールバックも呼び出されません。SDK は Context・Lifecycle を受け取らないため、画面を離れるとき(onDestroy)にアプリ側でキャンセルしてください。

    • Kotlin で request を省略する場合は getCampaigns(listener = ...) のように名前付き引数で渡します。Java では getCampaigns(listener) で呼び出せます。

    • ShopLiveCampaigns は cloud.shoplive:shoplive-sdk-core に、リクエスト・レスポンスのモデルとリスナーは cloud.shoplive:shoplive-common にあります。両方のアーティファクトと shoplive-network を依存関係として宣言してください。

    • すべての String フィールドは空文字列("")になり得ます。これは「値なし」を意味するため、使用前に isNullOrBlank() で確認してください。Boolean フィールドはサーバーが値を返さない場合 false です。

    ShopLiveCampaignListRequest

    取得条件です。すべてのパラメータは任意(オプション)で、引数なしの ShopLiveCampaignListRequest() を渡すとサーバーのデフォルト値で全状態を取得します。値を指定しない条件はクエリに付与されません。

    パラメータ

    型

    説明

    page

    Int?

    ページ番号。1 から始まります。(デフォルト: 1) 1 未満を指定すると SDK が 1 に補正します。

    size

    Int?

    1 ページあたりのキャンペーン数。(デフォルト: 10) 1~20 の範囲外を指定すると SDK が範囲内に補正します。

    statuses

    List<ShopLiveCampaignFilterStatus>

    取得する状態のフィルター。空の場合は全状態を取得します。READY / ONAIR / CLOSED の 3 種類のみ指定でき、重複は除去されます。

    order

    ShopLiveCampaignOrder?

    scheduledAt 基準の並び順。ASCENDING / DESCENDING (デフォルト: DESCENDING、新しい順)。ASCENDING は過去の配信も含む全期間の昇順です。

    ShopLiveCampaignListResponse

    取得結果です。

    プロパティ

    型

    説明

    campaigns

    List<ShopLiveCampaign>

    取得したキャンペーンの一覧。0 件の場合は空のリストです。

    hasMore

    Boolean

    次のページがあるかどうか。true の場合は page を 1 増やして再度取得します。

    ShopLiveCampaign

    キャンペーン 1 件の情報です。時刻はすべて epoch millis です。

    プロパティ

    型

    説明

    campaignId

    Long

    キャンペーン ID

    campaignKey

    String

    キャンペーンキー。ShopLive.play(...) の campaignKey として使用します。空文字列の場合は再生に使用できません。

    title

    String?

    キャンペーンのタイトル

    description

    String?

    キャンペーンの説明

    campaignUrl

    String

    キャンペーン URL。表示・共有用です。

    rerun

    Boolean

    再配信かどうか

    archiveStream

    Boolean

    アーカイブストリーム(見逃し配信)が提供されるかどうか

    privateLive

    Boolean

    プライベート配信かどうか。一覧にはそのまま含まれるため、表示するかどうかはアプリ側で判断します。

    scheduledAt

    Long?

    配信予定開始時刻 (epoch millis)

    scheduledEndAt

    Long?

    配信予定終了時刻 (epoch millis)

    posterUrl

    String?

    ポスター画像 URL

    lifecycle

    ShopLiveCampaignLifecycle

    状態と状態遷移の時刻

    metrics

    ShopLiveCampaignMetrics?

    視聴指標。OnAir / Closed の状態でのみ返され、それ以外の状態では null です。

    ShopLiveCampaignLifecycle

    キャンペーンの状態と、状態遷移の時刻です。

    プロパティ

    型

    説明

    status

    ShopLiveCampaignStatus

    キャンペーンの状態。リハーサル中は Ready、終了処理中は OnAir として表記されます。

    rehearsal

    Boolean

    リハーサル中かどうか。リハーサル中も status は Ready のため、この値で区別します。

    startedAt

    Long?

    配信開始時刻 (epoch millis)

    closingAt

    Long?

    終了処理の開始時刻 (epoch millis)。status が OnAir でこの値がある場合は終了処理中です。

    endedAt

    Long?

    配信終了時刻 (epoch millis)

    ShopLiveCampaignStatus

    キャンペーンの状態値です。sealed class で、rawValue からサーバーの元の値を取得できます。未定義の値は Unknown として渡されます。Java では instanceof で比較し、単一の状態は ShopLiveCampaignStatus.OnAir.INSTANCE のように参照します。

    Case

    サーバー値

    説明

    Reserved

    RESERVED

    予約済みの配信。リクエストのフィルター(statuses)では指定できず、全状態を取得した場合のみ含まれます。

    Ready

    READY

    配信準備(待機)中。lifecycle.rehearsal が true の場合はリハーサル中です。

    OnAir

    ONAIR

    配信中。lifecycle.closingAt がある場合は終了処理中です。

    Closed

    CLOSED

    配信終了

    Unknown(raw: String)

    その他

    未定義のサーバー状態値です。今後追加される状態に備えて元の文字列をそのまま保持します。

    ShopLiveCampaignMetrics

    視聴指標です。OnAir / Closed の状態でのみ提供されます。

    プロパティ

    型

    説明

    userCount

    Long?

    視聴者数

    adoreCount

    Long?

    いいね(ハート)数

    showUserCount

    Boolean

    false の場合、userCount / adoreCount を UI に表示してはいけません。

    エラー処理

    失敗時は onError に ShopLiveCommonError が渡されます。原因は code で判別してください。サーバーエラー・HTTP エラーの message は固定文言 Failed to fetch campaign list. Refer to the error code. に置き換えられ(サーバーの原文は公開されません)、SDK 内部エラー(9000・9900・9901・10000)は各エラーの SDK 文言がそのまま入ります。サーバーが返したコードは ShopLiveCampaignErrorCode の定数と比較できます。コードの一覧は Error codes ドキュメントを参照してください。

    Code

    定数

    説明

    9000

    ShopLiveCommonErrorCode.NOT_INITIALIZED_ACCESS_KEY

    accessKey が設定されていません。先に ShopLive.setAccessKey(accessKey) を呼び出してください。

    -200

    ShopLiveCampaignErrorCode.SERVICE_NOT_EXIST

    存在しない accessKey です。

    -201

    ShopLiveCampaignErrorCode.ACCESS_KEY_EXPIRED

    期限切れの accessKey です。

    -510

    ShopLiveCampaignErrorCode.INVALID_PARAMETER

    不正なリクエスト引数です。

    HTTP ステータスコード

    -

    サーバーがエラー本文なしで応答した場合、HTTP ステータスコード(例: 404、500)がそのまま渡されます。

    9900

    ShopLiveCommonErrorCode.FAILED_NETWORK

    ネットワーク接続に失敗しました。

    9901

    ShopLiveCommonErrorCode.FAILED_JSON_PARSING

    レスポンス JSON の解析に失敗しました。

    10000

    ShopLiveCommonErrorCode.UNEXPECTED_ERROR

    予期しないエラーです。

    サンプルコード (Kotlin)

    import cloud.shoplive.sdk.ShopLive
    import cloud.shoplive.sdk.ShopLiveCampaigns
    import cloud.shoplive.sdk.common.ShopLiveCancellable
    import cloud.shoplive.sdk.common.ShopLiveCommonError
    import cloud.shoplive.sdk.common.campaign.ShopLiveCampaignFilterStatus
    import cloud.shoplive.sdk.common.campaign.ShopLiveCampaignListListener
    import cloud.shoplive.sdk.common.campaign.ShopLiveCampaignListRequest
    import cloud.shoplive.sdk.common.campaign.ShopLiveCampaignListResponse
    import cloud.shoplive.sdk.common.campaign.ShopLiveCampaignOrder
    import cloud.shoplive.sdk.common.campaign.ShopLiveCampaignStatus
    
    class CampaignListActivity : AppCompatActivity() {
    
        // 進行中のリクエスト。画面を離れるときにキャンセルします。
        private var pending: ShopLiveCancellable? = null
    
        private val listener = object : ShopLiveCampaignListListener {
            override fun onData(response: ShopLiveCampaignListResponse) {
                pending = null
                // 0 件はエラーではありません。条件に合う配信がないことを意味します。
                response.campaigns.forEach { campaign ->
                    val label = when (val status = campaign.lifecycle.status) {
                        ShopLiveCampaignStatus.Reserved -> "予約"
                        ShopLiveCampaignStatus.Ready -> if (campaign.lifecycle.rehearsal) "リハーサル中" else "準備中"
                        ShopLiveCampaignStatus.OnAir -> if (campaign.lifecycle.closingAt == null) "配信中" else "終了処理中"
                        ShopLiveCampaignStatus.Closed -> "終了"
                        is ShopLiveCampaignStatus.Unknown -> "不明な状態(${status.raw})"
                    }
                    // String フィールドは空文字列("")になり得るため isNullOrBlank() で確認します。
                    val title = campaign.title?.takeIf { it.isNotBlank() } ?: "(タイトルなし)"
                    Log.d("Campaign", "$label ${campaign.campaignKey} $title")
                }
                if (response.hasMore) {
                    // page を 1 増やして次のページを取得します。
                }
            }
    
            override fun onError(error: ShopLiveCommonError) {
                pending = null
                // 原因は code で判別します。message で分岐しないでください。
                Log.e("Campaign", "getCampaigns failed: code=${error.code} message=${error.message}")
            }
        }
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            // accessKey の設定 (アプリで最初に 1 回)
            ShopLive.setAccessKey("{accessKey}")
    
            // 配信中・準備中のキャンペーンを新しい順に 20 件取得
            pending?.cancel()
            pending = ShopLiveCampaigns.getCampaigns(
                request = ShopLiveCampaignListRequest(
                    page = 1,
                    size = 20,
                    statuses = listOf(ShopLiveCampaignFilterStatus.ONAIR, ShopLiveCampaignFilterStatus.READY),
                    order = ShopLiveCampaignOrder.DESCENDING,
                ),
                listener = listener,
            )
    
            // request を省略する場合は listener に名前を付けて渡します。
            // ShopLiveCampaigns.getCampaigns(listener = listener)
        }
    
        override fun onDestroy() {
            // 画面を離れるときにリクエストをキャンセルします。以降、コールバックは呼び出されません。
            pending?.cancel()
            pending = null
            super.onDestroy()
        }
    }

    サンプルコード (Java)

    // Java — request を省略する場合は getCampaigns(listener) で呼び出せます。
    ShopLiveCancellable pending = ShopLiveCampaigns.getCampaigns(
            new ShopLiveCampaignListRequest(1, 20,
                    Collections.singletonList(ShopLiveCampaignFilterStatus.ONAIR),
                    ShopLiveCampaignOrder.DESCENDING),
            new ShopLiveCampaignListListener() {
                @Override
                public void onData(@NonNull ShopLiveCampaignListResponse response) {
                    for (ShopLiveCampaign campaign : response.getCampaigns()) {
                        ShopLiveCampaignStatus status = campaign.getLifecycle().getStatus();
                        // Java では instanceof で比較し、単一の状態は INSTANCE で参照します。
                        if (status == ShopLiveCampaignStatus.OnAir.INSTANCE) {
                            Log.d("Campaign", "on air: " + campaign.getCampaignKey());
                        } else if (status instanceof ShopLiveCampaignStatus.Unknown) {
                            Log.d("Campaign", "unknown: " + status.getRawValue());
                        }
                    }
                }
    
                @Override
                public void onError(@NonNull ShopLiveCommonError error) {
                    if (error.getCode() == ShopLiveCampaignErrorCode.SERVICE_NOT_EXIST) {
                        // 存在しない accessKey
                    }
                }
            });
    
    // 画面を離れるとき
    pending.cancel();


    What's Next