问题
I am currently stuck with this problem: Google Maps seems not to be loading at all. Please see the image below:
This is really driving me crazy. I already have done the following:
- Added my package name + SHA1 (debug keystore) + SHA1 (release keystore) to Google Developer's console.
- Maps SDK for Android is enabled. The API key has Android app restriction
- Added google-services.json to my app from Firebase console
- Added necessary permissions:
- Added API Key to the Manifest file - from Google Developer Console
- Added meta data for gms version
This is the code of my 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));
}
}
And this is the code for my layout:
<?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>
Can anyone tell what still I'm missing?
LOGCAT:
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
Please note that when I use the same API_KEY to other map projects, it is perfectly working. It seems that the map is not showing on my app but working on other projects.
These are my dependecies:
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'
And this is the content of my 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>
回答1:
I had this problem yesterday in designing a customer in the company. it was two crazy days to work it out with the customer behind me. What I did was:
Delete the current key (API Key) from the Google Dashboard APIs. Delete the firebase web key from the Google dashboard APIs. Create a new Key API for android, register the SHA-1 and package name. and add in project android studio;
In the FIrebase project delete the SHA-1 code to add again. Download google-services.json, and add in the project;
Generate the app in release mode, publish in the store, and download on some device, when running the app should show the Map normally;
If not, it will show you the error in LogCat, saying that you must register the following SHA-1 key: XXXXXXXXXXXXXXXXX and the package name: com.your.packagename;
Just register this key in Google APIs, and it will work in a few seconds, without even having to update the app in the store.
NOTE: Another thing, consider upgrading the dependencies of Google Maps, and Google Services.
Hope this helps.
回答2:
I am assuming that this may due to mismatch SHA 1 Fingerprint. Double check that you are using the same keystore for getting SHA1.
or Let's check your API key is valid or not. For that add following MAP_API as your key
AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY
add key directly to manifest
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY" />
Add following permission in your AndroidManifest.xml (Optional/not necessary)
<permission
android:name="your_pakage_name.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
Build your apk. And test it.
If the map is showing then we can fix that your API key is the problem.
Otherwise
Maybe due to child fragment manager, So Initialize your fragment in view pager like below. then test it
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="yourpackage.MapsActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" />
回答3:
Have you tried these methods?
Enable Multidex:
https://stackoverflow.com/a/42827484/9169701
https://developer.android.com/studio/build/multidex
Note: If your project is configured for multidex with minSdkVersion 20 or lower, and you deploy to target devices running Android 4.4 (API level 20) or lower, Android Studio disables Instant Run.
Disable Instant Run:
https://stackoverflow.com/a/46999705/9169701
回答4:
try adding this piece of Code in your onMapReady method
MapsInitializer.initialize(Objects.requireNonNull(getContext()));
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.setMyLocationEnabled(true);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(augsburg, 13));
googleMap.addMarker(new MarkerOptions()
.title("Augsburg Zoo")
.snippet("Der coolste Zoo der Welt")
.position(augsburg));
回答5:
As you are using map in a fragment change your code like below:-
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mMapFragment = SupportMapFragment.newInstance();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.mapContainer, mMapFragment).commit();
mMapFragment.getMapAsync(this);
Change the fragment tag in layout to FrameLayout like below:-
<?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">
<FrameLayout
android:id="@+id/mapContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
.....
</RelativeLayout>
Upgrade your map sdk:-
implementation 'com.google.android.gms:play-services-maps:16.0.0'
回答6:
A few things to note.
- Checking runtime permissions (details) - your logcat says permission denied on one of the lines
- Try uploading the app to playstore in alfa or beta testing channel (to prevent access to targeted users before app passes all the tests.) - some APIs does not work unless your app is registered.
If still the problem persists, try deleting and re-registering your app in firebase.
Also, please note that google maps APIs are no longer available for free as before. You need to subscribe. Follow this link for more info. Hope this helps.
回答7:
Solution:
I had the same problem in my App so you can try this open your Android studio and
make sure you are login with the same user id of what you had created
`console.developer` account and after that you should do
SupportMapFragment mapFragment;
GoogleMap mMap;
Marker marker;
LatLng origin = new LatLng(30.5595, 22.9375);
LatLng dest = new LatLng(30.5595, 22.9375);
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
googleMap.addMarker(new MarkerOptions()
.position(origin)
.title("title")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)));
googleMap.addMarker(new MarkerOptions()
.position(dest));
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(origin, 15));
}
回答8:
I had this problem. In my case, I changed the API key and everything started working correctly. Check the logcat for the issue. If it is the same problem then change the key and it should work.
来源:https://stackoverflow.com/questions/52848651/google-maps-is-showing-a-blank-map