我目前对此问题感到困惑:Google地图似乎根本没有加载。请参见下图:
这真的使我发疯。我已经做过以下事情:
这是我片段的代码:
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>
答案 0 :(得分:8)
昨天我在设计公司的客户时遇到了这个问题。与我背后的客户一起解决这是疯狂的两天。我所做的是:
从Google Dashboard API中删除当前密钥(API密钥)。 从Google仪表板API中删除Firebase Web密钥。创建一个 新的Android密钥API,注册SHA-1和程序包名称。和 在项目android studio中添加;
在FIrebase项目中,删除SHA-1代码以再次添加。下载 google-services.json,然后添加项目;
以发布模式生成应用,在商店中发布并下载 在某些设备上,运行应用程序时应正常显示地图;
如果没有,它将向您显示LogCat中的错误,表示您必须 注册以下SHA-1密钥: XXXXXXXXXXXXXXXXX 和程序包 名称:com.your.packagename;
只需在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会禁用即时运行。
禁用即时运行:
答案 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)
一些注意事项。
答案 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));
}
答案 7 :(得分:0)
我遇到了这个问题。就我而言,我更改了API密钥,然后一切开始正常运行。检查问题的日志。如果是相同的问题,请更改密钥,它应该可以工作。
答案 8 :(得分:0)
我做了一个简单的修复,现在 Google 地图运行良好: 设置-应用程序-地图-点击右上角的三个点-卸载所有更新。 它会警告您地图将重置为出厂设置。只需忽略它并按确定。重启手机。