Проблема с FileProvider в модульном тесте Android, специфичном для ОС WindowsAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Проблема с FileProvider в модульном тесте Android, специфичном для ОС Windows

Сообщение Anonymous »

Мои основные рабочие машины — 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Получение конфигурации Nacos в модульном тесте в .NET Core 6
    Anonymous » » в форуме C#
    0 Ответы
    42 Просмотры
    Последнее сообщение Anonymous
  • Как я могу разделить все выбросы в модульном тесте?
    Гость » » в форуме Android
    0 Ответы
    28 Просмотры
    Последнее сообщение Гость
  • Использование MatrixCursor в модульном тесте
    Anonymous » » в форуме Android
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Макет IConfiguration выдает исключение NullReferenceException в модульном тесте с использованием Moq [дубликат]
    Anonymous » » в форуме C#
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Как игнорировать порядок параметра списка, переданного для утверждения, вызываемого в модульном тесте Python
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»