JINS MEMEを使えるようになるまでの道のり(Android版)


Android初心者がJINS MEMEのデータを取得できるようになるまでの道のりを簡単にメモしておきます。

参考にしたところ

とりあえず以下を参考にしています。
- JINS MEME SDKへようこそ
- YAZ Engineer BLOG

環境

開発環境は以下でした。
- JINS MEME SDK: 1.3.0
- Android Studio: 3.6

前置き

  • SDKをダウンロードする
    とりあえず、SDKをダウンロードしておくこと。
  • アプリを登録する
    JINS MEME DEVELOPERSにログインして、アプリを登録しておくこと。
    登録したアプリのIDとSecretをどこかに記録しておく(あとで使います)。

ライブラリの準備

  • Android Studioでプロジェクトを開く/新規作成する
  • ダウンロードしておいたSDKに含まれるMemeLib.jarファイルを app/libsフォルダにコピー(ドラッグ&ドロップでいけると思います)
  • コピーしたファイルを右クリックして「Add As library...」を選択するとライブラリを使えるようになります
  • build.gradeのdependenciesに以下が追記されているのを確認してください
    implementation files('libs/MemeLib.jar')
  • また、JINS MEME SDKのAndroid版はGsonを使っているので以下も追記してください
    implementation 'com.google.code.gson:gson:2.8.5'
    -ちなみに、 SDKのドキュメントでは以下を追加するようになっていますが、上記で動いているみたいです
    compile 'com.google.code.gson:gson:2.4'

ということで、最終的には以下を追加しました。

build.gradle(Module)

dependencies {

    // for JINS MEME
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation files('libs/MemeLib.jar')
}

パーミッションの設定

AndroidManifestに以下を設定しておく必要があるようです。

AndroidManifest.xml

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

位置情報関連

位置情報を使うことをユーザに許可させる必要があります。
onCreate()に書くか、それ用のメソッドを作って、

MainActivity.kt
private val REQUEST_CODE: Int = 1000

if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
    //パーミッション要求
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), REQUEST_CODE)
    return
    }

さらに、onRequestPermissionResultをoverrideしてユーザの応答を受け取る処理を追加します。

MainActivity.kt
override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode){
            REQUEST_CODE -> if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
                //パーミッションを追加できた時の処理、例えばメッセージを出すなら
                // Toast.makeText(this, "パーミッション追加", Toast.LENGTH_SHORT).show()
            }else{
                //ユーザに拒否された時の処理、例えば終了するなら、
               //  exitThisApprication()
            }
        }
    }

MemeLibの初期化

アプリ登録時のIDとSecretをMemeLibに設定して初期化します。
また、Listenerの設定も必要です。

MainActivity.kt
var appClientId: String? = "ID"  //記録しておいたID
var appClientSecret = "Secret"   //記録しておいたSecret
private lateinit var memeLib: MemeLib

override fun onCreate(savedInstanceState: Bundle?) {

    //MemeLibの処理
    MemeLib.setAppClientID(applicationContext, appClientId, appClientSecret)
    memeLib = MemeLib.getInstance()
    memeLib.setVerbose(true)
    //初期化の結果を取得するためのリスナーを登録する
    memeLib?.setMemeConnectListener(memeConnectListener)

}


//リスナーを設定しておく必要がある
private val memeConnectListener = object: MemeConnectListener{
    override fun memeConnectCallback(p0: Boolean) {
        //ここに接続時の処理を書く
        //例えば、デバイスのスキャンを開始するとか
    }

    override fun memeDisconnectCallback() {
        //ここに切断時の処理を書く
    }
}

デバイスのスキャン

初期化できたら、デバイスをスキャンします。
スキャンした結果はアドレス(String)で返ってくるので保存しておきます。

MainActivity.kt
private var device_address: String = ""  //addressを保存する用
var status = memeLib?.startScan(MemeScanListener { address: String ->
    //スキャンの結果見つかったアドレス(address)をとりあえず保存しておく
    device_address = address
})
if(status != MemeStatus.MEME_OK){
    //スキャンに失敗した時の処理
    memeLib?.stopScan()  //例えば、スキャンを停止する
}

接続

見つかったアドレス(上記の例ではdevice_addressに保存)を使ってデバイスに接続します。

MainActivity.kt
memeLib?.connect(device_address)

データの取得

デバイスに接続できたら後はデータの取得をスタートするだけです。
Listenerも設定しておきます。

MainActivity.kt
//データ取得スタート
memeLib?.startDataReport(memeRealTimeListener)
//止めるときは以下
memeLib?.stopDataReport()

//リアルタイムモードでデータを取得するためのリスナー
private val memeRealTimeListener: MemeRealtimeListener = MemeRealtimeListener { memeRealtimeData ->
    //リアルタイムデータが随時通知される
    //例えば、pitch, roll, yawを取得したければ・・・
    // private var meme_attitude = FloatArray(3)
    // meme_attitude[0] = memeRealtimeData.pitch
    // meme_attitude[1] = memeRealtimeData.roll
    // meme_attitude[2] = memeRealtimeData.yaw
}

おしまい!

後はMemeRealTimeListenerを使って取得したデータを処理するだけです。
取得できるデータについてはSDKのドキュメントを読みましょう!
エラー処理とかは全然考えていないので、実際にはもうちょっと工夫が必要だと思います。