为什么安卓模拟器报错缺少system image?谷歌地图集成相关问题咨询
解决方案
一、模拟器错误修复
- 更换带Google Play标识的AVD镜像:不带Google服务框架的原生模拟器无法运行谷歌地图,创建模拟器时选择标注了「Google Play」的系统镜像即可。
- 更新Google Play服务:启动模拟器后进入内置的Google Play商店,搜索「Google Play服务」升级到最新版本后重启应用测试。
- 修复依赖冲突:打开app层级build.gradle文件,删除重复的无效依赖行
implementation 'com.google.android.material:material:<version>'。 - 验证API密钥有效性:确认local.properties文件中已正确配置
MAPS_API_KEY为谷歌云控制台申请的有效密钥,密钥需开启Maps SDK for Android权限,且绑定的包名、SHA1签名与当前项目完全匹配。 - 升级地图SDK版本:可将
com.google.android.gms:play-services-maps:17.0.1升级到最新稳定版,避免旧版本兼容性问题。
二、Fragment中集成谷歌地图实现步骤
1. 添加布局组件
在Fragment对应的布局XML文件中加入MapView组件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.gms.maps.MapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
2. 编写Fragment逻辑代码
Fragment实现OnMapReadyCallback接口,同步MapView的生命周期即可:
import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.core.app.ActivityCompat; import androidx.fragment.app.Fragment; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.MapView; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; public class MapFragment extends Fragment implements OnMapReadyCallback { private MapView mapView; private GoogleMap googleMap; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_map, container, false); mapView = rootView.findViewById(R.id.mapView); // 初始化MapView mapView.onCreate(savedInstanceState); // 异步获取地图实例 mapView.getMapAsync(this); return rootView; } @Override public void onMapReady(GoogleMap map) { googleMap = map; // 自定义地图配置示例:添加标记、移动镜头 LatLng defaultPosition = new LatLng(39.9042, 116.4074); googleMap.addMarker(new MarkerOptions().position(defaultPosition).title("北京")); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(defaultPosition, 10f)); // 已获取定位权限时开启我的位置图层 if (ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { googleMap.setMyLocationEnabled(true); } } // 同步MapView生命周期,避免内存泄漏或加载异常 @Override public void onResume() { super.onResume(); mapView.onResume(); } @Override public void onPause() { super.onPause(); mapView.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); mapView.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); mapView.onLowMemory(); } }
3. 动态申请权限
在承载Fragment的Activity中先申请定位权限,用户授权完成后再加载地图Fragment,避免权限不足导致地图功能异常。
内容的提问来源于stack exchange,提问作者Ualibek Nurgulan
相关产品推荐
相关产品推荐

