Мои основные рабочие машины — MacO и ArchLinux, но иногда мне приходится работать и в Windows.
Впервые я замечаю разницу в представлении путей из-за использования \ и /. Думаю, это легко исправить, используя File.separator. Раздражающее решение, но оно работает.
Однако у меня возникла проблема с моим провайдером. Выглядит это так:
Он отлично работает на MacOs и ArchLinux, но на Windows появляется такая ошибка:
Failed to find configured root that contains C:\Users\my_user\AppData\Local\Temp\robolectric-CameraFileHandlerLegacyTest_providedUriShouldBeForApplicationPackage1487572707286514179\external-files\Android\data\com.my.app.debug\Camera\20240624_1649111606355212673536148.jpg
java.lang.IllegalArgumentException: Failed to find configured root that contains C:\Users\my_user\AppData\Local\Temp\robolectric-CameraFileHandlerLegacyTest_providedUriShouldBeForApplicationPackage1487572707286514179\external-files\Android\data\com.my.app.debug\Camera\20240624_1649111606355212673536148.jpg
at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:867)
at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:467)
Это мой тест:
@Test
fun providedUriShouldBeForApplicationPackage() {
val handler = CameraFileHandler(
context = InstrumentationRegistry.getInstrumentation().context,
)
val given = handler.createTempPhotoFile()
val actual = handler.provideExternalUri(given)
actual.scheme shouldBe "content"
actual.host shouldBe "${BuildConfig.APPLICATION_ID}.provider"
}
и мой класс такой:
@Singleton
class CameraFileHandler @Inject constructor(
@ApplicationContext private val context: Context,
) {
@Throws(IOException::class)
fun createTempPhotoFile(): File {
val storageDir = context.getExternalFilesDir(ExternalCameraDirectory)
val timestamp = Clock.System.now()
return File.createTempFile(timestamp.formatPhotoDate(), PhotoFileExtension, storageDir)
}
fun provideExternalUri(file: File): Uri =
FileProvider.getUriForFile(context, "${BuildConfig.APPLICATION_ID}.provider", file)
private fun Instant.formatPhotoDate() = DateTimeFormatter.ofPattern(PhotoDateFormat)
.withZone(ZoneId.systemDefault())
.format(toJavaInstant())
companion object {
@VisibleForTesting
const val ExternalCameraDirectory = "Camera"
private const val PhotoDateFormat = "yyyyMMdd_HHmmss"
@VisibleForTesting
const val PhotoFileExtension = ".jpg"
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... windows-os
Проблема с FileProvider в модульном тесте Android, специфичном для ОС Windows ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение