Phenotype.API 在此设备上不可用。连接失败:cmc{statusCode=DEVELOPER_ERROR

问题描述 投票:0回答:1

我目前在使用 Google 地图的 homepage.dart 中遇到错误,当我从 Firebase 数据库更改时,此错误开始发生,我已经完成了 Firebase 和地图 API 的所有配置,但我找不到解决方案。 这是错误:

W/MobStoreFlagStore(10088): java.util.concurrent.ExecutionException: m.few: 17: 17: API: Phenotype.API 在此设备上不可用。连接失败:cmc{statusCode=DEVELOPER_ERROR,resolution=null,message=null}

这是我的代码

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:geocoding/geocoding.dart';

class HomePage extends StatefulWidget {
  const HomePage({Key? key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final Completer<GoogleMapController> googleMapCompleterController =
      Completer<GoogleMapController>();
  GoogleMapController? controllerGoogleMap;
  Position? currentPositionOfUser;
  late List<dynamic> _fletesList = [];
  Set<Marker> _markers = {};

  double calculateDistance(LatLng pos1, LatLng pos2) {
    return Geolocator.distanceBetween(
        pos1.latitude, pos1.longitude, pos2.latitude, pos2.longitude);
  }

  void updateMapTheme(GoogleMapController controller) {
    getJsonFileFromThemes("themes/night_style.json")
        .then((value) => setGoogleMapStyle(value, controller));
  }

  Future<String> getJsonFileFromThemes(String mapStylePath) async {
    ByteData byteData = await rootBundle.load(mapStylePath);
    var list = byteData.buffer
        .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes);
    return utf8.decode(list);
  }

  setGoogleMapStyle(String setGoogleMapStyle, GoogleMapController controller) {
    controller.setMapStyle(setGoogleMapStyle);
  }

  Future<LatLng?> getLatLngFromAddress(String address) async {
    try {
      List<Location> locations = await locationFromAddress(address);
      if (locations.isNotEmpty) {
        double latitude = locations.first.latitude;
        double longitude = locations.first.longitude;
        return LatLng(latitude, longitude);
      }
    } catch (e) {
      print("Error obtaining coordinates: $e");
    }
    return null;
  }

  Future<void> _getFletesFromFirebase() async {
    DatabaseReference databaseReference =
        FirebaseDatabase.instance.ref().child('fletes');

    DatabaseEvent event = await databaseReference.once();
    DataSnapshot dataSnapshot = event.snapshot;

    if (dataSnapshot.value != null) {
      if (dataSnapshot.value is Map) {
        Map<dynamic, dynamic> mapData =
            dataSnapshot.value as Map<dynamic, dynamic>;

        if (mounted) {
          setState(() {
            mapData.forEach((key, value) async {
              String startAddress = value['startAddress'];
              String endAddress = value['endAddress'];

              LatLng? startCoords = await getLatLngFromAddress(startAddress);
              LatLng? endCoords = await getLatLngFromAddress(endAddress);

              if (startCoords != null) {
                _markers.add(
                  Marker(
                    markerId: MarkerId(key.toString()),
                    position: startCoords,
                    infoWindow: InfoWindow(
                      title: 'Inicio del Viaje',
                    ),
                    onTap: () {
                      _showFleteInfoModal(value);
                    },
                  ),
                );
              }

              if (endCoords != null) {
                _markers.add(
                  Marker(
                    markerId: MarkerId(key.toString() + "_end"),
                    position: endCoords,
                    infoWindow: InfoWindow(
                      title: 'Entrega del Viaje',
                    ),
                  ),
                );
              }
            });

            _addMarkersToMap();
          });
        }
      }
    }
  }

  void _showFleteInfoModal(Map<dynamic, dynamic> fleteInfo) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('Detalles del Flete'),
          content: SingleChildScrollView(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                _buildInfoRow('Descripción', fleteInfo['description'] ?? ""),
                _buildInfoRow('Fecha', fleteInfo['date'] ?? ""),
                _buildInfoRow(
                    'Dirección de inicio', fleteInfo['startAddress'] ?? ""),
                _buildInfoRow(
                    'Dirección de entrega', fleteInfo['endAddress'] ?? ""),
                _buildInfoRow('Hora', fleteInfo['time'] ?? ""),
                _buildInfoRow(
                    'Tipo de vehículo', fleteInfo['vehicleType'] ?? ""),
                _buildInfoRow('Pago', fleteInfo['offerRate'] ?? ""),
              ],
            ),
          ),
          actions: [
            ElevatedButton(
              onPressed: () {
                // Lógica para aceptar el flete si es necesario
                Navigator.of(context).pop();
              },
              child: Text('Aceptar Flete'),
            ),
            TextButton(
              onPressed: () {
                Navigator.of(context).pop();
              },
              child: Text('Cerrar'),
            ),
          ],
        );
      },
    );
  }

  Widget _buildInfoRow(String title, String value) {
    return Padding(
      padding: EdgeInsets.symmetric(vertical: 8.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text(
            title,
            style: TextStyle(
              fontWeight: FontWeight.bold,
            ),
          ),
          SizedBox(height: 4),
          Text(value),
          Divider(
            color: Colors.grey,
            thickness: 0.5,
          ),
        ],
      ),
    );
  }

  void _addMarkersToMap() {
    _fletesList.forEach((flete) {
      double latitude = double.parse(flete['latitud'].toString());
      double longitude = double.parse(flete['longitud'].toString());
      LatLng fleteLocation = LatLng(latitude, longitude);

      _markers.add(
        Marker(
          markerId: MarkerId(
              flete['idflete'].toString()), // ID único del marcador
          position: fleteLocation,
          infoWindow: InfoWindow(
            title: flete['description'], // Muestra la descripción del flete
          ),
        ),
      );
    });
  }

  @override
  void initState() {
    super.initState();
    _getFletesFromFirebase();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          GoogleMap(
            padding: EdgeInsets.only(top: 100),
            mapType: MapType.normal,
            myLocationEnabled: true,
            initialCameraPosition: CameraPosition(
              target: LatLng(0, 0), // Coordenadas iniciales del mapa
              zoom: 12.0,
            ),
            onMapCreated: (GoogleMapController mapController) {
              controllerGoogleMap = mapController;

              updateMapTheme(controllerGoogleMap!);

              googleMapCompleterController.complete(controllerGoogleMap);

              // Llama a la función para obtener los marcadores después de que el mapa se haya creado
              _getCurrentLiveLocationOfDriver();
            },
            markers: _markers,
          ),
          Positioned(
            top: 16.0,
            right: 16.0,
            child: ElevatedButton(
              onPressed: () {
                // Llama a la función para obtener los marcadores al presionar el botón
                _getFletesFromFirebase();
              },
              child: Text('Mostrar viajes disponibles'),
            ),
          ),
        ],
      ),
    );
  }

  void _getCurrentLiveLocationOfDriver() async {
    Position positionOfUser = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.bestForNavigation);
    currentPositionOfUser = positionOfUser;

    LatLng positionOfUserInLatLng = LatLng(
        currentPositionOfUser!.latitude, currentPositionOfUser!.longitude);

    CameraPosition cameraPosition =
        CameraPosition(target: positionOfUserInLatLng, zoom: 15);

    controllerGoogleMap!
        .animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
  }
}

我使用 flutterfire 配置并启动了我正在使用的项目和 Android 应用程序,我已经在 Android 应用程序中配置了 ssh1 密钥,并且生成了另一个地图 API 密钥,但似乎没有任何效果。

android flutter dart google-maps
1个回答
0
投票

检查您是否在 AndroidManifest 中正确输入了 API 密钥,如果不存在,则可能是导致错误的原因。 必须出现在应用程序标签中。

<meta-data android:name="com.google.android.geo.API_KEY"
        android:value="XXXXXXxxX-XxxX-XXxxXXXxxXxXXXXx"/>
© www.soinside.com 2019 - 2024. All rights reserved.