Google地图显示空白地图

时间:2018-10-17 06:38:55

标签: android google-maps android-maps

我目前对此问题感到困惑:Google地图似乎根本没有加载。请参见下图: enter image description here

这真的使我发疯。我已经做过以下事情:

  1. 将我的软件包名称+ SHA1(调试密钥库)+ SHA1(发行密钥库)添加到Google Developer的控制台中。
  2. 已启用Android的Maps SDK。 API密钥具有Android应用限制
  3. 从Firebase控制台向我的应用添加了google-services.json
  4. 添加了必要的权限:                         
  5. 将API密钥添加到清单文件-通过Google Developer Console
  6. 为gms版本添加了元数据

这是我片段的代码:

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>

谁能告诉我我还缺少什么?

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

请注意,当我对其他地图项目使用相同的API_KEY时,它可以正常工作。该地图似乎没有显示在我的应用程序上,但正在其他项目上运行。

这些是我的依赖物

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>

9 个答案:

答案 0 :(得分:8)

昨天我在设计公司的客户时遇到了这个问题。与我背后的客户一起解决这是疯狂的两天。我所做的是:

  1. 从Google Dashboard API中删除当前密钥(API密钥)。 从Google仪表板API中删除Firebase Web密钥。创建一个 新的Android密钥API,注册SHA-1和程序包名称。和 在项目android studio中添加;

  2. 在FIrebase项目中,删除SHA-1代码以再次添加。下载 google-services.json,然后添加项目;

  3. 以发布模式生成应用,在商店中发布并下载 在某些设备上,运行应用程序时应正常显示地图;

  4. 如果没有,它将向您显示LogCat中的错误,表示您必须 注册以下SHA-1密钥: XXXXXXXXXXXXXXXXX 和程序包 名称:com.your.packagename;

  5. 只需在Google API中注册此密钥,即可在少数几个版本中使用 秒,甚至无需更新商店中的应用程序。

注意:另一件事,请考虑升级Google Maps和Google Services的依赖关系。

希望这会有所帮助。

答案 1 :(得分:4)

您尝试过这些方法吗?

启用Multidex:

https://stackoverflow.com/a/42827484/9169701

https://developer.android.com/studio/build/multidex

注意::如果您的项目配置为使用minSdkVersion 20或更低版本的Multidex,并且部署到运行Android 4.4(API级别20)或更低版本的目标设备,则Android Studio会禁用即时运行。

禁用即时运行:

https://stackoverflow.com/a/46999705/9169701

答案 2 :(得分:4)

尝试在您的 onMapReady 方法中添加这段代码

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));

答案 3 :(得分:4)

我假设这可能是由于SHA 1指纹不匹配造成的。仔细检查您是否使用相同的密钥库来获取SHA1。

或让我们检查您的API密钥是否有效。为此,添加以下MAP_API作为密钥

AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY

直接将密钥添加到清单

<meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="AIzaSyDztCvpv3PVBxzWwY7mWqCMnGfDeOiGxwY" />

在AndroidManifest.xml中添加以下权限(可选/不必要)

 <permission
    android:name="your_pakage_name.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

构建您的apk。并对其进行测试。

如果显示地图,则我们可以解决您的API密钥存在问题的问题。

否则

可能是由于子片段管理器的缘故,因此请在视图分页器中初始化您的片段,如下所示。然后测试

 <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" />

答案 4 :(得分:3)

一些注意事项。

  1. 检查运行时权限(details)-您的logcat表示其中一行拒绝了权限
  2. 尝试通过Alfa或Beta测试频道将应用上传到Playstore(以防止在应用通过所有测试之前访问目标用户。)-除非注册了您的应用,否则某些API无效。
  3. 如果问题仍然存在,请尝试在Firebase中删除并重新注册您的应用。

  4. 另外,请注意,谷歌地图API不再像以前一样免费提供。您需要订阅。请遵循此link了解更多信息。 希望这会有所帮助。

答案 5 :(得分:3)

在片段中使用map时,请更改代码,如下所示:-

  // 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);

将布局中的 fragment 标签更改为 FrameLayout ,如下所示:-

<?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>

升级您的地图SDK:-

implementation 'com.google.android.gms:play-services-maps:16.0.0'

答案 6 :(得分:2)

解决方案:

 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));
}

enter image description here

答案 7 :(得分:0)

我遇到了这个问题。就我而言,我更改了API密钥,然后一切开始正常运行。检查问题的日志。如果是相同的问题,请更改密钥,它应该可以工作。

答案 8 :(得分:0)

我做了一个简单的修复,现在 Google 地图运行良好: 设置-应用程序-地图-点击右上角的三个点-卸载所有更新。 它会警告您地图将重置为出厂设置。只需忽略它并按确定。重启手机。