- android
- ios
- google-maps
- debugging
- mobile-development
- react-native
The Problem
I was implementing maps in a React Native app using react-native-maps, which wraps Google Maps on Android and Apple Maps on iOS. Everything seemed fine until I ran the Android build. The map rendered, but instead of showing actual map data, I got a beige screen with just the Google logo in the bottom left corner.
No error messages. No crashes. No warnings. Just beige.
The MapView component was there, had the right dimensions, responded to touch, but refused to show any map tiles. I started questioning everything - did I enable the Maps SDK? Is my API key valid? Did I miss a permission?
Why This Happens
The culprit was a SHA-1 fingerprint mismatch. When you set up API key restrictions in Google Cloud Console, you register which Android apps can use that key by providing a package name and SHA-1 fingerprint combo. Good for security, nightmare for debugging.
Different build types use different signing certificates. Debug builds use one keystore, release builds use another, CI probably uses a third. Each generates a different SHA-1 fingerprint. If you only registered one in the Cloud Console, the others fail silently.
How It Goes Unnoticed
You follow the Expo docs, create your API key, add restrictions, grab your SHA-1, register it. You test in development, everything works. You move on.
What you don't realize is you only registered the debug keystore's SHA-1. When you build a release version or deploy to the Play Store, Google generates a completely different signing certificate. Your app builds fine, installs without errors, the MapView initializes normally. But when it tries to load tiles, Google's servers check the SHA-1, don't find it, and silently reject the request.
There's no build-time validation. No runtime exception. The Maps SDK doesn't even know it's being blocked. You just get a beige screen.
If you're deploying to the Play Store, it gets worse. Google Play uses its own app signing, so even if you registered your upload keystore's SHA-1, the actual certificate is different. You have to go to Play Console > Release > Setup > App integrity > App Signing and copy the SHA-1 from there. That's the one you need, not your local keystore.
The Fix
Get the SHA-1 from the keystore signing your failing build:
keytool -list -v -keystore android/app/debug.keystore -alias androiddebugkey -storepass android -keypass android
For release builds, use your actual release keystore path. For Play Store deployments, get the SHA-1 from the Play Console instead.
Copy the SHA1 from "Certificate fingerprints". Then go to Google Cloud Console > APIs & Services > Credentials, find your Maps API key, and add a new Android restriction with your package name (matching android.package in app.json exactly) and the SHA-1 you just copied.
Don't delete existing entries - you can have multiple SHA-1s for the same package, which is what you want for different build types.
Why It's Silent
From React Native's perspective, everything works. The MapView initializes, the Google Maps SDK loads, API calls go through. What fails is the tile loading, which happens asynchronously. The SDK requests tiles from Google's servers, those servers check the SHA-1, reject it, and return nothing. No exception, no error callback, nothing for react-native-maps to surface. Just a beige screen waiting for tiles that will never arrive.
This is especially brutal when switching between debug and release builds. Map works in debug, breaks in release, and you think you broke something in the config when really it's just a missing SHA-1 entry.
Testing The Fix
After adding the SHA-1, wait a few minutes for propagation. Then clear app cache or reinstall completely. Just restarting might not work because the SDK could be caching the auth failure.
If you're working with a team or have CI/CD, you'll need multiple SHA-1s registered - one for each developer's debug keystore, one for release, one for CI, and one for Play Store signing. Seems redundant but it's the only way to make maps work everywhere.
Wrap Up
This bug ate hours of my time because the complete lack of errors gives you no starting point. Now when I see a beige Google Maps screen, I immediately check SHA-1 fingerprints instead of chasing permissions or API key validity.
React Native Maps is solid for integrating maps without touching native code, but Google's silent failure mode for unauthorized keys is a rough edge that catches everyone at least once.
Affiliate Links
Using these referral links helps support my work. I only recommend products I use and fully trust. Any of the financial links do not constitute financial advice, recommendations or endorsements.