eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

Windows環境のRobolectricでUri.toFile() KTXが正常に動作しない

問題点

  • Windowsファイルシステムはドライブレター(C:とか)やパスセパレータ(¥)がLinux/Macと異なる
  • Uri.fromFile()を実行したとき、ドライブレターやバッククォート(日本語だと円マーク)を含んだ文字列がURLエンコードされる

KTXUri.toFile()を行うとどうなるか

  • toFile()は単純に Uri.path 値をFileにラップして返すだけである
  • Windows環境でRobolectricを使用し、Uri.fromFile().pathを取得するとnullになる
  • 結果、File(null)が渡されることとなり、 UnitTestを実行しているカレントディレクトリ と解釈され、ほとんどの場合はその後のテストが落ちる

どうしたか?

  • Uri.path をチェックし、問題があるようならURLデコードを行ってからFileにラップするような拡張関数を書いてやる

こんなの

internal const val SCHEME_FILE = "file://"

fun Uri.toFileCompat(): File {
    val path = this.path ?: ""
    return if (path.isEmpty()) {
        // Windows path.
        val path = toString().substring(SCHEME_FILE.length)
        File(URLDecoder.decode(path, "UTF-8"))
    } else {
        toFile()
    }
}

楽観的な話

  • そのうち公式も直すんじゃねかな?