我目前遇到了这个问题:Google map 似乎根本无法加载。请看下图:
这真的让我发疯。我已经完成了以下操作:
- 将我的包名称 + SHA1(调试 keystore )+ SHA1(发布 keystore )添加到 Google 开发者控制台。
- Android 版 map SDK 已启用。 API key 有 Android 应用限制
- 从 Firebase 控制台将 google-services.json 添加到我的应用
- 添加了必要的权限:
- 将 API key 添加到 list 文件 - 来自 Google Developer Console
- 为 gms 版本添加了元数据
这是我的 fragment 的代码:
import android.content.Context;
import android.content.pm.FeatureInfo;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.ErrorDialogFragment;
import com.google.android.gms.common.GoogleApiAvailability;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MapsActivity extends Fragment implements OnMapReadyCallback {
private MapFragment mapFragment;
protected boolean readyToGo() {
GoogleApiAvailability checker=
GoogleApiAvailability.getInstance();
int status=checker.isGooglePlayServicesAvailable(getActivity());
if (status == ConnectionResult.SUCCESS) {
if (getVersionFromPackageManager(getActivity())>=2) {
return(true);
}
else {
Toast.makeText(getActivity(), "no maps", Toast.LENGTH_LONG).show();
}
}
else if (checker.isUserResolvableError(status)) {
}
else {
Toast.makeText(getActivity(),"no maps", Toast.LENGTH_LONG).show();
}
return(false);
}
private static int getVersionFromPackageManager(Context context) {
PackageManager packageManager=context.getPackageManager();
FeatureInfo[] featureInfos=
packageManager.getSystemAvailableFeatures();
if (featureInfos != null && featureInfos.length > 0) {
for (FeatureInfo featureInfo : featureInfos) {
// Null feature name means this feature is the open
// gl es version feature.
if (featureInfo.name == null) {
if (featureInfo.reqGlEsVersion != FeatureInfo.GL_ES_VERSION_UNDEFINED) {
return getMajorVersion(featureInfo.reqGlEsVersion);
}
else {
return 1; // Lack of property means OpenGL ES
// version 1
}
}
}
}
return 1;
}
private static int getMajorVersion(int glEsVersion) {
return((glEsVersion & 0xffff0000) >> 16);
}
public static MapsActivity newInstance() {
MapsActivity fragment = new MapsActivity();
return fragment;
}
public MapsActivity() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
readyToGo();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_maps, null, false);
SupportMapFragment mapFragment = (SupportMapFragment) this.getChildFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
return view;
}
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng augsburg = new LatLng(48.348527, 10.915952);
if (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
googleMap.setMyLocationEnabled(true);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(augsburg, 13));
googleMap.addMarker(new MarkerOptions()
.title("Augsburg Zoo")
.snippet("Der coolste Zoo der Welt")
.position(augsburg));
}
}
这是我的布局代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/constraintLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<TextView
android:id="@+id/textView15"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Coming soon!"
android:textColor="@color/colorPrimary"
android:textSize="30sp"
android:visibility="invisible" />
</RelativeLayout>
谁能告诉我还缺少什么?
洛卡特:
10-17 15:33:25.917 1637-1648/system_process I/ActivityManager: Killing 2335:com.google.android.apps.maps/u0a39 (adj 15): empty #17
10-17 15:33:43.441 3591-3591/com.apptechgateway.AppTech I/DynamiteModule: Considering local module com.google.android.gms.maps_dynamite:0 and remote module com.google.android.gms.maps_dynamite:220
Selected remote version of com.google.android.gms.maps_dynamite, version >= 220
10-17 15:33:43.464 3800-3800/? E/dex2oat: Failed to create oat file: /data/dalvik-cache/x86_64/data@data@com.google.android.gms@app_chimera@m@00000006@MapsDynamite.apk@classes.dex: Permission denied
10-17 15:33:43.465 3591-3591/com.apptechgateway.AppTech W/art: Failed execv(/system/bin/dex2oat --runtime-arg -classpath --runtime-arg --debuggable --instruction-set=x86_64 --instruction-set-features=smp,ssse3,sse4.1,sse4.2,-avx,-avx2 --runtime-arg -Xrelocate --boot-image=/system/framework/boot.art --runtime-arg -Xms64m --runtime-arg -Xmx512m --instruction-set-variant=x86_64 --instruction-set-features=default --dex-file=/data/data/com.google.android.gms/app_chimera/m/00000006/MapsDynamite.apk --oat-file=/data/dalvik-cache/x86_64/data@data@com.google.android.gms@app_chimera@m@00000006@MapsDynamite.apk@classes.dex) because non-0 exit status
10-17 15:33:43.514 3591-3591/com.apptechgateway.AppTech I/Google Maps Android API: Google Play services client version: 12451000
10-17 15:33:43.517 3591-3591/com.apptechgateway.AppTech I/Google Maps Android API: Google Play services package version: 12874027
10-17 15:33:56.802 3591-3591/com.apptechgateway.AppTech I/Google Maps Android API: Google Play services package version: 12874027
请注意,当我将相同的 API_KEY 用于其他 map 项目时,它工作正常。 map 似乎没有显示在我的应用程序上,而是在其他项目上显示。
这些是我的依赖项:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0-rc02'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.google.android.gms:play-services-maps:15.0.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.mikhaellopez:circularimageview:3.2.0'
implementation 'gr.pantrif:easy-android-splash-screen:0.0.1'
implementation 'com.github.GrenderG:Toasty:1.3.0'
implementation 'com.github.adrielcafe:AndroidAudioRecorder:0.3.0'
implementation 'com.google.firebase:firebase-core:16.0.1'
implementation 'com.crashlytics.sdk.android:crashlytics:2.9.5'
implementation 'com.android.volley:volley:1.1.0'
compile 'com.github.ybq:Android-SpinKit:1.1.0'
implementation 'com.google.firebase:firebase-database:16.0.1'
compile 'com.android.support:cardview-v7:28.0.0'
compile 'com.github.bumptech.glide:glide:3.6.0'
compile 'com.github.clans:fab:1.6.4'
compile 'com.github.blikoon:QRCodeScanner:0.1.2'
compile 'com.github.droidbyme:DroidDialog:c6decc7167'
implementation 'com.android.support:multidex:1.0.3'
compile project(':library')
}
apply plugin: 'com.google.gms.google-services'
apply plugin: 'io.fabric'
这是我的 AndroidManifest.xml
的内容:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.sample.x">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<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" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="MY_API_KEY" />
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.com.vansuita.pickimage.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/picker_provider_paths"
tools:replace="android:resource" />
</provider>
<activity
android:name=".SplashscreenActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MapsMarkerActivity"
android:label="MAPS" />
<activity
android:name=".MapsActivity2"
android:label="@string/title_activity_maps2"></activity>
</application>
</manifest>
最佳答案
昨天在公司做客户设计的时候遇到了这个问题。与我身后的客户一起解决这两个疯狂的日子。我所做的是:
从 Google 信息中心 API 中删除当前 key (API key )。 从 Google 仪表板 API 中删除 firebase 网络 key 。创建一个 新的 Android key API,注册 SHA-1 和包名称。和 在项目android studio中添加;
在 FIrebase 项目中删除 SHA-1 代码以重新添加。下载 google-services.json,在项目中添加;
在 Release模式下生成应用程序,在商店中发布,然后下载 在某些设备上,运行应用程序时应正常显示 map ;
如果不是,它会在 LogCat 中显示错误,说你必须 注册以下 SHA-1 key :XXXXXXXXXXXXXXXXX 和包 名称:com.your.package-name;
只需在 Google API 中注册该 key ,它就会在几个 秒,甚至无需更新商店中的应用程序。
注意:另一件事,考虑升级 Google map 和 Google 服务的依赖项。
希望这对您有所帮助。
关于android - Google map 显示空白 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52848651/