Вопрос или проблема
Я пытаюсь внедрить Mapbox в свой проект Flutter, потому что мне нужны офлайн-карты. Я использую пакет mapbox_gl. Я следовал всем шагам, указанным в документации, от создания токенов до конфигураций в Gradle. Однако я постоянно сталкиваюсь со следующей ошибкой:
(Вставьте сюда сообщение об ошибке)
Я прилагаю свои файлы конфигурации для справки:
1. android/app/src/main/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.google_maps_api">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:label="google_maps_api"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:taskAffinity=""
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Указывает тему Android, которую следует применить к этому Activity, как только
процесс Android будет запущен. Эта тема видна пользователю
во время инициализации пользовательского интерфейса Flutter. После этого эта тема продолжает
определять фон окна за пользовательским интерфейсом Flutter. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Не удаляйте метаданные ниже.
Они используются инструментом Flutter для генерации GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
<!-- Требуется для запроса активностей, которые могут обрабатывать текст, см.:
https://developer.android.com/training/package-visibility и
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
В частности, это используется движком Flutter в io.flutter.plugin.text.ProcessTextPlugin. -->
<queries>
<intent>
<action android:name="android.intent.action.PROCESS_TEXT"/>
<data android:mimeType="text/plain"/>
</intent>
</queries>
</manifest>
2. android/build.gradle
allprojects {
repositories {
google()
mavenCentral()
}
}
rootProject.buildDir = "../build"
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(":app")
}
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
3. android/gradle/wrapper/gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
4. android/app/build.gradle
plugins {
id "com.android.application"
id "kotlin-android"
// Плагин Flutter Gradle должен применяться после плагинов Android и Kotlin Gradle.
id "dev.flutter.flutter-gradle-plugin"
}
android {
namespace = "com.example.google_maps_api"
compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8
}
defaultConfig {
// TODO: Укажите свой уникальный идентификатор приложения (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.example.google_maps_api"
// Вы можете обновить следующие значения, чтобы соответствовать потребностям вашего приложения.
// Для получения дополнительной информации см. https://flutter.dev/to/review-gradle-config.
minSdk = 21
targetSdk = flutter.targetSdkVersion
versionCode = flutter.versionCode
versionName = flutter.versionName
}
buildTypes {
release {
// TODO: Добавьте свою конфигурацию подписи для сборки релиза.
// В данный момент подпись производится с помощью отладочных ключей, чтобы работала команда `flutter run --release`.
signingConfig = signingConfigs.debug
}
}
}
flutter {
source = "../.."
}
dependencies {
implementation 'com.mapbox.maps:android:11.6.1'
}
5. android/gradle.properties
org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
MAPBOX_DOWNLOADS_TOKEN=skmyprivetetoken
6. android/settings.gradle
pluginManagement {
def flutterSdkPath = {
def properties = new Properties()
file("local.properties").withInputStream { properties.load(it) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
return flutterSdkPath
}()
includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
repositories {
google()
mavenCentral()
gradlePluginPortal()
// Репозиторий Mapbox Maven
maven {
url = uri("https://api.mapbox.com/downloads/v2/releases/maven")
// Не изменяйте имя пользователя ниже. Оно всегда должно быть "mapbox" (не ваше имя пользователя).
credentials.username = "mapbox"
// Используйте секретный токен, хранящийся в gradle.properties, в качестве пароля
credentials.password = providers.gradleProperty("MAPBOX_DOWNLOADS_TOKEN").get()
authentication { basic(BasicAuthentication) }
}
}
}
plugins {
id "dev.flutter.flutter-plugin-loader" version "1.0.0"
id "com.android.application" version "8.1.0" apply false
id "org.jetbrains.kotlin.android" version "1.8.22" apply false
}
include ":app"
Можете ли вы помочь мне определить коренную причину этой проблемы? Я использую Flutter 3.24
и mapbox_gl: ^0.16.0
с папкой Android, созданной по умолчанию Flutter, которая недавно претерпела некоторые изменения. Может ли это быть связано с использованием неправильной версии Gradle, Android или Java? Я буду признателен за любые идеи!
Кажется, вы не указали токен в AndroidManifest внутри приложения и не проверили зависимости в android/app/build.gradle.
Не забудьте указать токен в main.dart для инициализации.
Ответ или решение
Чтобы решить проблему с интеграцией offline-карт Mapbox в проекте Flutter, вам необходимо убедиться, что вы правильно настроили все необходимые компоненты и правильно указали токены. Ниже приведены шаги для устранения ошибки, которую вы получаете.
Основные шаги для устранения ошибки интеграции Mapbox
-
Проверка AndroidManifest.xml:
Убедитесь, что вы добавили свой токен доступа Mapbox в файлAndroidManifest.xml
. Во вложении<application>
добавьте следующую строку:<meta-data android:name="com.mapbox.mapboxsdk.token" android:value="YOUR_MAPBOX_ACCESS_TOKEN"/>
Замените
YOUR_MAPBOX_ACCESS_TOKEN
на ваш фактический токен доступа. -
Проверка зависимостей в build.gradle:
Проверьте, что вandroid/app/build.gradle
у вас правильно указаны зависимости для Mapbox. У вас должно быть что-то вроде следующего:dependencies { implementation 'com.mapbox.maps:android:11.6.1' }
Убедитесь, что версия библиотеки соответствует той, которую вы хотите использовать. В вашем случае
11.6.1
— это корректная версия. -
Token в main.dart:
Не забудьте инициализировать Mapbox с использованием вашего токена в файлеmain.dart
. Обычно это делается следующим образом:import 'package:mapbox_gl/mapbox_gl.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); MapboxMap.init( accessToken: 'YOUR_MAPBOX_ACCESS_TOKEN', ); runApp(MyApp()); }
Подобным образом, замените
YOUR_MAPBOX_ACCESS_TOKEN
на ваш токен. -
Версия Gradle и настройки Android:
Убедитесь, что вы используете актуальную версию Gradle и совместимую версию плагина Android. В вашемandroid/gradle/wrapper/gradle-wrapper.properties
должно быть следующее:distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
Убедитесь, что версии Android и Kotlin соответствуют. В вашем случае, проверьте в
android/app/build.gradle
:id "com.android.application" version "8.1.0" apply false id "org.jetbrains.kotlin.android" version "1.8.22" apply false
-
Проверка файлов настроек Gradle:
Убедитесь, что файлыandroid/settings.gradle
иandroid/gradle.properties
имеют правильные настройки. Ваш файлgradle.properties
должен содержать:MAPBOX_DOWNLOADS_TOKEN=skmyprivetetoken
Проверьте, что строка
MAPBOX_DOWNLOADS_TOKEN
и ваш токен указаны корректно и без пробелов.
Дополнительные рекомендации
- Перезапустите приложение: После внесения изменений всегда стоит полностью остановить и перезапустить приложение, чтобы изменения вступили в силу.
- Доступ к интернету: Убедитесь, что ваше устройство имеет доступ в интернет, так как Mapbox может потребовать первичной загрузки карт.
- Статус токена: Убедитесь, что ваш токен доступа Mapbox действителен и имеет необходимые права доступа (например, для работы с offline-картами).
Следуя этим шагам, вы должны устранить проблему с интеграцией Mapbox в вашем проекте Flutter. Если после выполнения всех шагов проблема не решается, обратите внимание на ошибки в консоли и проверьте документацию Mapbox и Flutter на наличие возможных обновлений или изменений в API.