[概要]

自転車の走行ログをFitファイルに落とし込み、Stravaにアップロードする機能をもつ  
Androidアプリの開発をしています。  
Fitファイルを作成するにあたって、fitSDKを使用しているのですが、  
このライブラリをうまく扱えず作業が難航している状況です。。

[詳細]  
走行中に取得したログには、あらかじめfitSDKが対応していないデータがあります。  
例えば、ケイデンスを記録するFileldはfitSDKであらかじめ用意されており、

```

    record.cadence = hoge
    encoder.write(record)
    
```

上記のようにして書き込むことができますが、  
住所(文字列を使用する想定)はFieldを自分で作成する必要があります。

現在、この住所Fieldを自前でrecordに追加して書き込む作業でハマっています。

[コード]  
以下が、現在実装中のkotlinコードです。

```

    val startAddressFieldDescMesg = FieldDescriptionMesg()
            startAddressFieldDescMesg.developerDataIndex = 0.toShort()
            startAddressFieldDescMesg.fieldDefinitionNumber = 0.toShort()
            startAddressFieldDescMesg.fitBaseTypeId = Fit.BASE_TYPE_STRING.toShort()
            startAddressFieldDescMesg.setFieldName(0, "startAddress")
            encoder.write(startAddressFieldDescMesg)
            val startAddressField = DeveloperField(startAddressFieldDescMesg, developerIdMessage)
            record.addDeveloperField(startAddressField)
    
```

エラーメッセージは以下の通りで、Fieldがうまくrecordに追加できていない感じです。

```

    com.garmin.fit.FitRuntimeException: Incompatible Protocol Features
    
```

[判明していること]  
・StravaはfitSDKのバージョン1のみサポートしており、バージョン2を指定して上記の実装をした場合に正しくFitファイルが作成される。  
つまり、バージョン1/2でDeveloperFieldの追加方法がことなると思われます。

・住所を追加していない場合はFitファイル作成とStavaへのアップロードが出来たので、  
住所Fieldの追加部分が原因でエラーが発生していると考えられます。

Fitファイルに自前のFieldを追加する方法をご存知でしたら、是非ともご連絡ください。  
よろしくお願いします。
CC BY-SA 4.0
2020-01-16T08:52:30.783
62290
2020-01-21T06:43:07.897
2020-01-19T02:56:25.007
37485
37485
question
kotlin garmin
Fitファイルの作成方法
FitファイルにDeveloperFieldwp追加してStravaにアップロードする方法が分かりました

以下、解決方法です

①FitのProtcolバージョン指定を2にする

```

    encoder = FileEncoder(file, Fit.ProtocolVersion.V2_0)
    
```

②RecordにDeveloperFieldを追加

```

    val startAddressFieldDescMesg = FieldDescriptionMesg()
            startAddressFieldDescMesg.developerDataIndex = 0.toShort()
            startAddressFieldDescMesg.fieldDefinitionNumber = 0.toShort()
            startAddressFieldDescMesg.fitBaseTypeId = Fit.BASE_TYPE_STRING.toShort()
            startAddressFieldDescMesg.setFieldName(0, "startAddress")
            encoder.write(startAddressFieldDescMesg)
            val startAddressField = DeveloperField(startAddressFieldDescMesg, developerIdMessage)
            record.addDeveloperField(startAddressField)
    
```

住所(start)がFitファイルに書き込まれていることが確認できるはずです  
(FitSDK同梱のFitCSVツールを用いてcsvに変換してExcelでファイルを開けば確認できます)
CC BY-SA 4.0
2020-01-21T06:43:07.897
62420
2020-01-21T06:43:07.897
37485
62290
answer