Почему я не могу прочитать файл .ttf при запуске конфигурации Android?

9

При запуске или отладке моей игры на устройстве Android я получаю эту ошибку в logcat:

com.badlogic.gdx.utils.GdxRuntimeException: Ошибка чтения файла: data / fonts / myFont.ttf (Internal)

Который создан этой строкой кода:

FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile);

где fontFileопределяется так:

FileHandle fontFile = Gdx.files.internal("data/fonts/myFont.ttf");

Этого не происходит, когда я запускаю конфигурацию рабочего стола.

Я знаю, что для конфигурации рабочего стола вы должны определить рабочий каталог вашего проекта, но я не вижу такой опции в конфигурации Android, и это также не имеет смысла, поэтому я не думаю, что это проблема, связанная с «рабочим каталогом» ,

Очевидно, файл находится в правильном пути.

Также обратите внимание, что все работало нормально в моем предыдущем проекте. Я создал этот новый проект, создав новый пустой prj с помощью libgdx-setup, а затем скопировав все классы и пакеты из более старого проекта. Так может это проблема, связанная с каким-то файлом Gradle?

Давиде Каттани
источник
1
ты получаешь FileNotFoundException? Файловая система Android чувствительна к регистру, убедитесь, что вы написали ее правильно, «myFont.ttf» отличается от «myFont.TTF»
Алекс Сифуэнтес,
Да, я не читал его в logcat, вот другая часть сообщения logcat: Причина: java.io.FileNotFoundException: data / fonts / myFont.ttf в android.content.res.AssetManager.openAsset (Native Метод) на android.content.res.AssetManager.open (AssetManager.java:359) на com.badlogic.gdx.backends.android.AndroidFileHandle.read (AndroidFileHandle.java:75) Я уверен, что файл правильный, он внутри assets / data / fonts / myFont.ttf Я думаю, что по какой-то причине Android не смотрит в нужную папку ... Но запуск конфигурации рабочего стола работает нормально
Davide Cattani
Возможно, лучше обратиться в техподдержку Android?
Wow_mentor

Ответы:

1

Если тестовая файловая система настольного компьютера работает в Windows NTFS, а файловая система устройства Android - в нативном Android, разница заключается в драйверах файловой системы.

Драйверы файловой системы Windows не чувствительны к регистру, но Android использует Linux, который чувствителен к регистру.

Удостоверьтесь, что ваша прописная буква в файле правильная.

Кроме того, я заметил, что вы используете абсолютный путь без переменных среды. Это динамически для вашего текущего рабочего каталога на Android. Следовательно, если приложение запускается из другого каталога, оно будет искать файл в другом месте. Это может вызвать проблемы между различными ревизиями системы. Всегда указывайте абсолютные пути в Android. Это означает, что нужно начинать с переменной среды или с корневого каталога (т. Е. «/»). Чтобы можно было переместить приложение на SD-карту, лучше использовать переменные среды.

Кроме того, вы не должны использовать динамический каталог данных для вашего шрифта. Вы должны поместить его в пакет вашего приложения.

Роберт Вм Рудисуэли
источник
0

Я считаю, что для Android вам нужно иметь папку активов со всеми загруженными в нее ресурсами, эта папка ресурсов будет в проекте Android, а не в основном проекте. Рабочий стол, HTML и т. Д. Все используют основные ресурсы проекта, чтобы они работали нормально, но для android нужна собственная папка ресурсов. у вас есть один для этого?

Praefervidus
источник
2
HTML и ядро ​​рабочего стола используют папку ресурсов Android, которая является единственной папкой ресурсов в проекте.
Давиде Каттани
0

Варианты:

1) Попробуйте использовать верхний регистр TTF вместо ttf во всем вашем коде - в случае, если ваш исходный файл имеет суффикс TTF, потому что android чувствителен к регистру.

2) В файле build.gradle под вашим модулем Android убедитесь, что:

assets.srcDirs = ['assets']

И не:

assets.srcDirs = ['assetManager']

Другими словами, убедитесь, что это ваша папка для Android. этот работал для меня. затем очистите проект сборки и удалите старое приложение с устройства Android.

Yan.F
источник
[DMGregory] получил его, ответ отредактирован.
Yan.F
-1

Попробуйте скопировать файлы шрифтов прямо в папку ресурсов.

jobr97
источник
-1

Просто сделайте одну вещь, которую вы можете изменить метод, который вы используете сейчас. Вы можете использовать инструмент "hiero" для создания шрифта. Просто скачайте файл "hiero" jar по следующей ссылке

https://libgdx.badlogicgames.com/tools.html

с помощью hiero вы сможете получить доступ почти ко всем шрифтам. После создания шрифтов сохраните его в папке «актив» файлов вашего проекта Android и добавьте следующий код.

     private BitmapFont font;
     font = new BitmapFont(Gdx.files.internal("myNewFontCreatedByHiero.fnt"));

просто попробуйте этот метод. это будет работать.

Гокул Сринивасан
источник
Извините, должен понизить это. Используя, FreeTypeFontGeneratorдавайте импортируем любой шрифт и напишем в нем в любом размере. Где Hiero требует, чтобы вы генерировали растровые изображения для каждого шрифта и размера. Я согласен, что hiero - отличный инструмент, но это не ответ на вопрос.
Madmenyo
@Madmenyo Привет, я просто даю альтернативный способ решить его проблему. Вышеприведенная концепция не ошибается. Что является альтернативным решением его проблемы. Я не знаю, какова точная причина для голосования.
Гокул Сринивасан
Откуда вы знаете? Может быть, ему нужно много динамически сгенерированного текста, hiero не поможет с этим.
Madmenyo
@Madmenyo Привет, ты можешь сначала прочитать его вопрос. Я дал альтернативное решение.
Гокул Сринивасан
Он хочет загрузить, если вы предложите создать растровый шрифт.
Madmenyo
-1

Убедитесь, что файлы находятся внутри / android / assets.

kwantuM
источник