Как исправить ошибку интеграции Offline Mapbox в Flutter?

Вопрос или проблема

Я пытаюсь внедрить 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

  1. Проверка AndroidManifest.xml:
    Убедитесь, что вы добавили свой токен доступа Mapbox в файл AndroidManifest.xml. Во вложении <application> добавьте следующую строку:

    <meta-data
       android:name="com.mapbox.mapboxsdk.token"
       android:value="YOUR_MAPBOX_ACCESS_TOKEN"/>

    Замените YOUR_MAPBOX_ACCESS_TOKEN на ваш фактический токен доступа.

  2. Проверка зависимостей в build.gradle:
    Проверьте, что в android/app/build.gradle у вас правильно указаны зависимости для Mapbox. У вас должно быть что-то вроде следующего:

    dependencies {
       implementation 'com.mapbox.maps:android:11.6.1'
    }

    Убедитесь, что версия библиотеки соответствует той, которую вы хотите использовать. В вашем случае 11.6.1 — это корректная версия.

  3. 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 на ваш токен.

  4. Версия 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
  5. Проверка файлов настроек Gradle:
    Убедитесь, что файлы android/settings.gradle и android/gradle.properties имеют правильные настройки. Ваш файл gradle.properties должен содержать:

    MAPBOX_DOWNLOADS_TOKEN=skmyprivetetoken

    Проверьте, что строка MAPBOX_DOWNLOADS_TOKEN и ваш токен указаны корректно и без пробелов.

Дополнительные рекомендации

  • Перезапустите приложение: После внесения изменений всегда стоит полностью остановить и перезапустить приложение, чтобы изменения вступили в силу.
  • Доступ к интернету: Убедитесь, что ваше устройство имеет доступ в интернет, так как Mapbox может потребовать первичной загрузки карт.
  • Статус токена: Убедитесь, что ваш токен доступа Mapbox действителен и имеет необходимые права доступа (например, для работы с offline-картами).

Следуя этим шагам, вы должны устранить проблему с интеграцией Mapbox в вашем проекте Flutter. Если после выполнения всех шагов проблема не решается, обратите внимание на ошибки в консоли и проверьте документацию Mapbox и Flutter на наличие возможных обновлений или изменений в API.

Оцените материал
Добавить комментарий

Капча загружается...