[英]google maps activity on android
我想学习如何通过Android Studio使用Google Maps,并尝试在Android Studio上使用Google Maps活动,但出现此错误,我已经将googleMap API放在了我的代码上
03-04 01:17:43.584 3419-3419/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.dennis.peta, PID: 3419
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dennis.peta/com.example.dennis.peta.MapsActivity}: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class fragment
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
at android.app.Activity.setContentView(Activity.java:2166)
at com.example.dennis.peta.MapsActivity.onCreate(MapsActivity.java:21)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
at android.app.Activity.setContentView(Activity.java:2166)
at com.example.dennis.peta.MapsActivity.onCreate(MapsActivity.java:21)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.io.File.mkdir()' on a null object reference
at com.google.maps.api.android.lib6.gmm6.m.ad.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.c.h.a(Unknown Source)
at com.google.maps.api.android.lib6.gmm6.c.ao.a(Unknown Source)
at com.google.maps.api.android.lib6.e.bd.a(Unknown Source)
at com.google.maps.api.android.lib6.e.ev.a(Unknown Source)
at com.google.maps.api.android.lib6.e.z.a(Unknown Source)
at com.google.maps.api.android.lib6.e.y.a(Unknown Source)
at com.google.android.gms.maps.internal.u.onTransact(SourceFile:107)
at android.os.Binder.transact(Binder.java:387)
at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onCreateView(Unknown Source)
at com.google.android.gms.maps.SupportMapFragment$zza.onCreateView(Unknown Source)
at com.google.android.gms.dynamic.zza$4.zzb(Unknown Source)
at com.google.android.gms.dynamic.zza.zza(Unknown Source)
at com.google.android.gms.dynamic.zza.onCreateView(Unknown Source)
at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:1974)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1036)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230)
at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1332)
at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2288)
at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:120)
at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:357)
at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:31)
at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:80)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:754)
我的代码是java
package com.example.dennis.peta;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
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.OnMapReadyCallback;
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 MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case,
* we just add a marker near Sydney, Australia.
* If Google Play services is not installed on the device, the user will be prompted to install
* it inside the SupportMapFragment. This method will only be triggered once the user has
* installed Google Play services and returned to the app.
*/
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
}
我的xml
<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="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.dennis.peta.MapsActivity" />
请帮助我,我是Android新手
我认为您做错了事,因此我将在代码中添加简单的MapFragment。
首先将以下依赖项添加到builde.gradle中:
compile 'com.google.android.gms:play-services-maps:8.4.0'
接下来,创建新类,该类负责显示Map。
public class MapFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_map, container, false);
return view;
}
}
它需要该片段的布局,所以这里是fragment_map.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.google.android.gms.maps.MapView android:id="@+id/maps"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
这是包装片段的活动-MapActivity.java
public class MapActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
MapFragment mapFragment = new MapFragment();
getFragmentManager().beginTransaction().add(R.id.fragment_container, mapFragment).commit();
}
}
最后一个是此活动的布局-activity_map.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/fragment_container">
</FrameLayout>
</RelativeLayout>
还要记住,您已经为Google Maps生成了API密钥,并将其添加到Manifest中,这将在此处进行详细介绍。
希望现在能正常工作!
EDITED
你的问题:
“ ...想学习如何通过Android Studio使用Google地图”
我在下面写的很多内容都可以作为您的案例的有用清单,但是,如果您想了解有关Android Studio中的Google Maps的更多信息,最好像我在下面所做的那样,从基本的空白活动MainActivity开始,然后添加一些Google Map元素。 在此处提供的示例中,我先从一个空白活动开始,然后添加一个简单的片段布局文件,该文件至少可以让我测试Google Maps Android API是否可以与新项目一起使用。 我不依赖新项目“向移动设备添加活动”中提供的Android Studio的Google Maps活动模板。 您当然可以从中学到一些东西,但是从头开始可能会更好。
您是否正在物理设备上进行测试? 如果不是,请在物理设备上尝试。 如果尚未完成,请打开设备上的USB调试。 http://developer.android.com/tools/device.html
设备上的位置服务是否已打开? 通过转到物理设备的“设置”>“位置”(在“个人”下)进行查找,然后查看滑块处于“ 打开”状态 。
您是否创建了Google Maps API密钥? 如果没有,请创建一个。 在以下链接中,查看第4步以获取相关说明: https : //developers.google.com/maps/documentation/android-api/start概述:
转到console.developers.google.com
登录并创建一个项目(如果尚未创建)
创建您的Google Maps API密钥:单击蓝色的大按钮,转到Google API,单击Google Maps Android API链接,然后单击蓝色的启用按钮。 如果您以前没有做过此操作,则会收到以下消息:“已启用此API,但只有在创建凭据后才能在项目中使用它。单击“转到凭据”以立即执行此操作(强烈推荐的)。” 当您转到“凭据”页面时,它应该会在第一个下拉菜单中自动为您选择Google Maps Android API : 您使用的是哪个API? (如果不是,则需要这样做),然后转到第二个下拉菜单,您将从何处调用API? ,然后选择选择Android 。 创建一个API密钥名称-我的建议只是给它命名一个与项目相关的名称,但是您可以随意调用它。 稍后添加软件包名称和指纹。 然后点击创建API密钥按钮。
将API密钥复制并粘贴到AndroidManifest.xml的末尾,例如
</application> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="YOUR API KEY HERE"/> </manifest>
将以下4个权限添加到清单标记和应用程序标记开头之间的AndroidManifest.xml中,例如
<?xml version="1.0" encoding="utf-8"?> <manifest package="YOUR PACKAGE NAME" xmlns:android="http://schemas.android.com/apk/res/android"> <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"/> <application android:allowBackup="true"...
另外,请确保您具有必需的库和SDK软件包:
转到您的build.gradle(app)文件并添加Google Play依赖项,该行为:compile'com.google.android.gms:play-services:8.4.0'例如
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.google.android.gms:play-services:8.4.0'
}
然后将以下内容添加到您的AndroidManifest.xml中,这将验证您项目中的Google Play服务库:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
然后在MainActivity.java中,将maps包添加到您的import语句中:
import com.google.android.gms.maps.GoogleMap; public class MainActivity extends AppCompatActivity {
由于您使用的是片段,因此我将在此处坚持:
我创建一个新的布局(右键单击res / layout,单击“新建”>“布局资源文件”),并将其命名为activity_map ,其根为fragment 。
在activity_map中,我保留了您的大部分片段代码:
<?xml version="1.0" encoding="utf-8"?>
<fragment android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
为了测试该应用程序,最后一项更改是将片段添加到您的MainActivity中,以代替activity_main。 当然,您应该启动片段,但是当您知道它实际上在运行时,您会喜欢它:
setContentView(R.layout.activity_map);
我有同样的问题。 这绝对可以帮助您:
在AndroidManifest.xml中,将以下元素添加到<application>
元素的子元素中,方法是将其插入在</application>
标记的紧前面 :
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="YOUR_API_KEY"/>
更多详细信息: https : //developers.google.com/maps/documentation/android-api/signup#add_the_api_key_to_your_application
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.