Skip to content

Android implement LobiRecSDK Cocos2d x

devmassive edited this page Apr 28, 2014 · 30 revisions

Android Cocos2d-x Lobi Rec SDK 導入手順書


NOTE
Android版LobiRankingSDKはLobiRecSDKと統合されました

事前にお読みください

Android版の留意点

  • 初期設定では録画を無効にし、ユーザ操作によって有効・無効が切り替えられるようにしてください。
  • 端末が録画機能に対応しているかを取得(後述のbool KLMVideoCapture::isSupported()を利用)し、 対応しない場合はユーザが録画機能を有効にできないようにしてください。
  • 端末が録画機能に対応しているかのフラグは保存せず、 常にbool KLMVideoCapture::isSupported()を用いて取得してください。

Cocos2d-x 導入準備

LobiRecSDKではAndroidアプリにゲーム実況録画機能を提供します。

  • 対応OS: Android 4.1 またはそれ以降のバージョン
  • 対応Cocos2dx : 2.2.x
  • 動作確認端末 : 一覧
  • 事前に用意いただくファイル・情報
    • LobiRankingSDK
    • Client ID

LobiRecSDK構成

LobiRecSDKは以下のファイル群で構成されています。

LobiRankingSDKライブラリプロジェクト

  • LobiRankingSDKライブラリプロジェクト

Cocos2dxカスタマイズファイル

java

  • Cocos2dxMusic.java
  • Cocos2dxSound.java
  • Cocos2dxRenderer.java
  • Cocos2dxGLSurfaceView.java

cpp

  • KLMVideoCapture.cpp
  • KLMVideoCapture.h
  • KLRInterface.cpp
  • KLRInterface.h

Client ID

Lobi SDKを利用するには、クライアントIDを用意する必要があります。
クライアントIDは開発者向けページにて取得することができます。
詳しくはLobi SDK導入までのフローを参照してください。

Cocos2d-xプロジェクト設定

Cocos2d-xファイルの置換

http://www.cocos2d-x.org/downloadからCocos2d-x v2.2.xを取得し、LobiRanking内のファイルで置換します。

Cocos2d-xの以下のファイル

  • <COCOS2DX_LIBRARY_ROOT>/platform/android/java/src/org/cocos2dx/lib/Cocos2dxMusic.java
  • <COCOS2DX_LIBRARY_ROOT>/platform/android/java/src/org/cocos2dx/lib/Cocos2dxSound.java
  • <COCOS2DX_LIBRARY_ROOT>/platform/android/java/src/org/cocos2dx/lib/Cocos2dxRenderer.java
  • <COCOS2DX_LIBRARY_ROOT>/platform/android/java/src/org/cocos2dx/lib/Cocos2dxGLSurfaceView.java

を以下で置き換えます。

  • <LOBI_RANKING_SDK_ROOT>/cocos2dx/java/Cocos2dxMusic.java
  • <LOBI_RANKING_SDK_ROOT>/cocos2dx/java/Cocos2dxSound.java
  • <LOBI_RANKING_SDK_ROOT>/cocos2dx/java/Cocos2dxRenderer.java
  • <LOBI_RANKING_SDK_ROOT>/cocos2dx/java/Cocos2dxGLSurfaceView.java

LobiRankingSDKライブラリプロジェクトへの参照

録画機能を使用するためには、Cocos2d-xライブラリプロジェクトからLobiRankingSDKライブラリプロジェクトを参照する必要があります。
Cocos2d-xライブラリプロジェクトのプロパティを開き、Android > Library > Reference > Add... からLobiRankingSDKを選択してください。

プログラムの実装 - Lobi SDK初期化処理

LobiRecSDK用ファイルの追加

<LOBI_RANKING_SDK_ROOT>/cocos2dx/Classes以下の

  • <LOBI_RANKING_SDK_ROOT>/cocos2dx/cpp/KLMVideoCapture.cpp
  • <LOBI_RANKING_SDK_ROOT>/cocos2dx/cpp/KLMVideoCapture.h
  • <LOBI_RANKING_SDK_ROOT>/cocos2dx/cpp/KLRInterface.cpp
  • <LOBI_RANKING_SDK_ROOT>/cocos2dx/cpp/KLRInterface.h

<COCOS2DX_PROJECT_ROOT>/Classes以下に配置してください。

<COCOS2DX_PROJECT_ROOT>/proj.android/Android.mk に以下を追記してください。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := game_shared

LOCAL_MODULE_FILENAME := libgame

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ...

# LobiRecSDKで使用するために追加
LOCAL_SRC_FILES += ../../Classes/KLMVideoCapture.cpp ../../Classes/KLRInterface.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes                   

LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static
            
include $(BUILD_SHARED_LIBRARY)

$(call import-module,CocosDenshion/android)
$(call import-module,cocos2dx)

<COCOS2DX_PROJECT_ROOT>/proj.android/Application.mk に以下を追記してください。

# ARMv7-A向けにもビルドする
APP_ABI := armeabi armeabi-v7a

LobiRecSDKの初期化処理

LobiRecSDKの初期化をするために以下のようにandroid.app.Applicationを継承したクラスを作成する必要があります

package org.cocos2dx.simplegame;

import com.kayac.lobi.ranking.sdk.NakamapRanking;
import com.kayac.lobi.ranking.sdk.model.Configuration;

import android.app.Application;

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // SDK の初期化
        // RankingSDKとRecSDKは統合されたため、
        // RankingSDKの初期化を行うことで、RecSDKの初期化も行われます。
        NakamapRanking.sharedInstance().setContext(this);
        Configuration.currentConfiguration().setCliendId("<CLIENT_ID>");
    }
}

NOTE
取得したクライアントIDが1234の場合はConfiguration.currentConfiguration().setCliendId("1234");としてください

AndroidManifest.xmlの修正

LobiRecSDKでは動画投稿画面、動画閲覧画面や動画投稿サービス等の機能があります。そのためAndroidManifest.xmlに以下を記述してください。
また、nakamapapp-<CLIENT_ID>はあらかじめ取得したクライアントIDと置き換えてください。

NOTE
取得したクライアントIDが1234の場合はnakamapapp-1234としてください

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.cocos2dx.simplegame"
      android:versionCode="1"
      android:versionName="1.0">

    <!-- 以下のパーミッションを許可してください -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 実況を有効にする場合のみ必要です -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <uses-sdk android:minSdkVersion="8"/>
    <uses-feature android:glEsVersion="0x00020000" />

    <!-- LobiRecSDKの初期化処理ので作成したorg.cocos2dx.simplegame.MyApplicationを使用するように指定します -->
    <application android:label="@string/app_name"
        android:name="org.cocos2dx.simplegame.MyApplication"
        android:icon="@drawable/icon">

        <activity android:name=".SimpleGame"
                  android:label="@string/app_name"
                  android:screenOrientation="landscape"
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:configChanges="orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- for LobiRecSDK START -->
        <!-- 現在はRankingSDK同梱されているためRankingSDK用の設定も必要です -->
        <activity
            android:name="com.kayac.lobi.ranking.sdk.activity.RankingActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="nakamapapp-<CLIENT_ID>" />
            </intent-filter>
        </activity>

        <!-- リプレイ動画一覧画面 -->
        <activity
            android:name="com.kayac.lobi.rec.ui.RecPlayActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            />
        <!-- プレイ動画シェア画面 -->
        <activity
            android:name="com.kayac.lobi.rec.ui.RecPostVideoActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            />
        <!-- プレイ動画シェア時用のSNSログイン画面 -->
        <activity
            android:name="com.kayac.lobi.rec.ui.RecSNSLoginActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            />
        <!-- 動画再生画面 -->
        <activity
            android:name="com.kayac.lobi.rec.ui.RecVideoPlayerActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            />
        <!-- プレイ動画投稿サービス -->
        <service android:name="com.kayac.lobi.rec.service.MovieUploadService" />
        <!-- 広告の効果測定の為に使用します -->
        <receiver
            android:name="com.kayac.lobi.ranking.sdk.receiver.PackageAddedReceiver"
            android:exported="true" >
            <intent-filter>
                <action android:name="com.android.vending.INSTALL_REFERRER" />
            </intent-filter>
        </receiver>
        <!-- for LobiRecSDK END -->
        
    </application>
    <supports-screens android:largeScreens="true"
                      android:smallScreens="true"
                      android:anyDensity="true"
                      android:normalScreens="true"/>
</manifest> 

プログラムの実装 - 録画処理

  • 録画機能のサポートチェック処理
  • 録画開始処理
  • 録画終了処理
  • 状態の取得

クラス構成

  • KLMVideoCapture : LobiRecSDKのJavaメソッドをラップするクラス。編集する必要はありません。
  • KLRInterface : KLMVideoCaptureを使うインタフェースクラス。サンプルとして実装してありますので、編集してお使いいただけます。

録画機能のサポートチェック処理

録画機能がサポートされるかのチェックを行います。

NOTE
サポートされていない端末でも、リプレイ動画一覧画面を開くことができます。

bool KLMVideoCapture::isSupported();

録画機能をサポートするかどうかは、端末のスペックに依存します。
対応状況

本SDKは必要に応じて通信を行い、最新のサポート状況を反映します。
この反映処理はアプリ起動時に非同期で行われ、 反映処理が終了するまでは、この関数は常にfalseを返します。

録画開始処理

ゲーム録画は任意のタイミングで行えます。録画の開始をする場合はKLMVideoCapture::startCapturing()を呼びます。
録画開始までに以下の録画設定を行うことができます。

  • KLMVideoCapture::setMicEnable(bool enabled)
    録画中のマイク入力可否を設定します。
  • KLMVideoCapture::setMicVolume(double volume)
    録画中のマイク入力ボリュームの大きさを設定します。(0.0 - 1.0)
  • KLMVideoCapture::setGameSoundVolume(double volume)
    録画中のゲームボリュームの大きさを設定します。(0.0 - 1.0)
  • KLMVideoCapture::setCapturePerFrame(int frames)
    レンダリングループのフレームに対してゲーム録画ファイルに出力する回数を設定します。

なお、上記以外のiOS版に実装されている機能は、現在Android版ではサポートされません。

ゲーム開始処理の実装例はKLRInterface::startCapturing(int)にあります。
用途に応じて書き換えてご利用ください。

組み込み例

#include "KLRInterface.h"
...

if (/* 録画しない */) {
    // 何もしない
} else if (/* 実況なし録画 */) {
    KLRInterface::startCapturing(1);
} else if (/* 実況あり録画 */) {
    KLRInterface::startCapturing(2);
}

録画終了処理

録画の終了をする場合はKLMVideoCapture::stopCapturing()を呼びます。

組み込み例

#include "KLRInterface.h"
...

KLRInterface::stopCapturing();

状態の取得

  • bool KLMVideoCapture::hasMovie() 未送信の録画ファイルがあるかどうかを返します。
  • bool KLMVideoCapture::isCapturing() 録画中かどうかを返します。

プログラムの実装 - プレイ動画シェア画面

プレイ動画シェア画面

組み込み例

#include "KLRInterface.h"
...

KLRInterface::openPostViewController();

プログラムの実装 - リプレイ動画一覧画面

リプレイ動画一覧画面

組み込み例

#include "KLRInterface.h"
...

KLRInterface::openWebViewController();

プログラムの実装 - 通知のハンドリング

通知のハンドリング

LobiRecSDKでは以下のイベント発生時にBroadcast Intentの送信を行います。
適宜通知を受け取った際に処理してください。

  • com.kayac.lobi.rec.LobiRec.ACTION_MOVIE_CREATED
    プレイ動画情報をサーバにPOSTした際に、Extraにcom.kayac.lobi.rec.LobiRec.EXTRA_MOVIE_CREATED_URLをキーとしたhttp://play.lobi.coのプレビューURLを文字列で格納して通知する通知名称です。

  • com.kayac.lobi.rec.LobiRec.ACTION_MOVIE_CREATED_ERROR
    プレイ動画情報をサーバにPOST中にエラーが発生した際に通知する通知名称です。

  • com.kayac.lobi.rec.LobiRec.ACTION_MOVIE_UPLOADED
    プレイ動画ファイルをサーバにPOSTした際に通知する通知名称です。

  • com.kayac.lobi.rec.LobiRec.ACTION_MOVIE_UPLOADED_ERROR
    プレイ動画ファイルをサーバにPOST中にエラーが発生した際に通知する通知名称です。

  • com.kayac.lobi.rec.LobiRec.ACTION_FINISH_POST_VIDEO_ACTIVITY
    プレイ動画シェア画面(com.kayac.lobi.rec.ui.RecPostVideoActivity)を閉じた際に,EXTRA_FINISH_POST_VIDEO_ACTIVITY_TRY_POSTに動画投稿を試みたかどうかをboolean型で格納して通知する通知名称です。

FAQ

Multiple dex files define エラーが発生し、apkを作成できない

apkを作成しようとした際に以下のエラーが発生する

[xxxx-xx-xx xx:xx:xx - Dex Loader] Unable to execute dex: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
[xxxx-xx-xx xx:xx:xx - xxxxxxxxxx] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;

android-support-v4.jarが重複しています。
LobiRecSDK/libs/android-support-v4.jarを削除後再度apkを作成してください

Clone this wiki locally