Java android谷歌地图问题
我目前正在构建一个android应用程序。我了解基础知识,我做了很多应用程序,但现在我的项目更大了。我的应用程序包括许多包含NavigationDrawer的屏幕,这迫使我在我希望在应用程序上显示的每个类上使用Fragment类的扩展。 这是我的问题——不久前,我创建了一个应用程序,一个简单的一页谷歌地图屏幕,它工作得很好。我想在我目前正在使用的应用程序上做同样的事情,但当我进入页面时,它给我的只是左下角屏幕上的谷歌日志,其余部分是灰色的,就像没有显示地图一样。我在很多地方搜索解决方案,包括这个网站,我得到的答案是,这可能与我的API密钥有关谷歌给我的。我检查了一下,我很确定它不是来自密钥,因为我在我的一页谷歌地图应用程序上应用了它,它工作得很好。我还拥有所有需要的权限。我检查了6次。所以我的结论是代码中有某种东西阻止了地图的显示 这是我的密码:Java android谷歌地图问题,java,android,google-maps,Java,Android,Google Maps,我目前正在构建一个android应用程序。我了解基础知识,我做了很多应用程序,但现在我的项目更大了。我的应用程序包括许多包含NavigationDrawer的屏幕,这迫使我在我希望在应用程序上显示的每个类上使用Fragment类的扩展。 这是我的问题——不久前,我创建了一个应用程序,一个简单的一页谷歌地图屏幕,它工作得很好。我想在我目前正在使用的应用程序上做同样的事情,但当我进入页面时,它给我的只是左下角屏幕上的谷歌日志,其余部分是灰色的,就像没有显示地图一样。我在很多地方搜索解决方案,包括这个
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class guide extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// inflat and return the layout
View v = inflater.inflate(R.layout.test, container,
false);
return v;
}
class HoldFragmentPlace extends FragmentActivity{
private GoogleMap mMap;
public HoldFragmentPlace(){
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// inflat and return the layout
View v = inflater.inflate(R.layout.test, container,
false);
return v;
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
}
}
}
我的NavigationDrawer需要这个片段扩展才能工作,所以我创建了一个内部类,并在那里为映射应用了代码
以下是我在舱单上的信息:
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/google_maps_key" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
这是我的地图xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.gms.maps.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="fill_parent"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_marginTop="-470dp" />
</LinearLayout>
我还尝试了java代码的一些其他变体,其中一些没有包含内部类,结果仍然是一样的。我要么错过了一些非常基本的东西,要么我误解了关于Android的一些概念。如果您已经阅读了所有这些,感谢您抽出时间 我怀疑某些零件丢失了: 1声明使用地图的权限\u接收: 2缺少Declare gms版本变量:
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
3 API_密钥的生成可能存在一些问题:
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="your_key" />
请首先检查上述3个可疑点:然后,如果仍然存在错误,您可以重新确认启用Google地图的步骤
仔细检查与API_密钥相关的内容检查APK签名。您必须在测试中分配调试API密钥,在释放APK时分配释放API密钥。插入正确的API密钥,清理并重建项目 我在那里已经一年了,我可以保证这就是问题所在。仔细检查您的密钥,看看它是调试密钥还是释放密钥 另一件要检查的事情是你的应用程序包名。。。 让我知道如果你这样做了,仍然得到灰色视图而不是 更新: 当我意识到你的问题只是在签约阶段时,我正试图把一切都包括进去 您只需要获取调试密钥库的SHA-1指纹并将其放入API密钥对话框中。相信我,没有什么比谷歌文档更清晰、更丰富的了 按照本文中的步骤获取调试证书和SHA-1指纹 更新2:
为了获得密钥库的SHA-1,您可以选中此项。您可以使用SupportMapFragment在片段中显示映射 xml应更改为
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/mapView"
android:layout_marginTop="-470dp"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
注意:如果找不到SupportMapFragment的getMapAsync方法,请更新您的google play服务。04-15 12:42:28.960 1961-2088/******************E/google Maps Android API﹕ 授权失败。请参阅以了解如何正确设置地图。04-15 12:42:28.960 1961-2088/****************E/谷歌地图Android API﹕ 在Google开发者控制台中,确保启用了Google Maps Android API v2。确保以下Android密钥存在:API密钥:******************Android应用程序;:********************************还有E/Google地图Android API﹕ 未能加载映射。联系谷歌服务器时出错。这可能是一个身份验证问题,但可能是由于网络错误。我的包名与我在构建应用程序时已生成的API密钥相同。我创建了一个映射活动,该活动生成了xml文件,其中包含一些SHA1代码。我用它来生成密钥,我假设这是一个调试密钥,除此之外,我不知道如何检查它是否真的是一个。另外,当我在signingConfigs{}上转到gradle.app时,该方法是空的。我在我的.android文件夹中发现了一个debug.keystore文件。你知道我如何通过任何机会访问它以查看密钥吗?谢谢!同时,我从文件->项目结构创建了一个新的调试密钥库,现在我的gradle具有以下签名配置{map{keyalis'map'keyPassword'********'storeFile文件'C:/Android Key Store/Key_Store.jks'storePassword'***}我还在BuildTypes中将其设置为每次自动启动。但现在,当我运行它时,在运行时出现此错误错误:任务执行失败“:app:packageDebug”。>无法从密钥库读取密钥
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/mapView"
android:layout_marginTop="-470dp"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
public class guide extends Fragment {
private GoogleMap mMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// inflat and return the layout
View v = inflater.inflate(R.layout.test, container, false);
((SupportMapFragment) getFragmentManager()
.findFragmentById(R.id.mapView)).getMapAsync (new OnMapReadyCallback(){
@Override
public void onMapReady(final GoogleMap map) {
this.mMap = map;
mMap.setMyLocationEnabled(true);
setUpMap();
}
});
return v;
}
private void setUpMap() {
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
}
}