繁体   English   中英

Google在Android上的地图活动

[英]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活动模板。 您当然可以从中学到一些东西,但是从头开始可能会更好。

  1. 您是否正在物理设备上进行测试? 如果不是,请在物理设备上尝试。 如果尚未完成,请打开设备上的USB调试。 http://developer.android.com/tools/device.html

  2. 设备上的位置服务是否已打开? 通过转到物理设备的“设置”>“位置”(在“个人”下)进行查找,然后查看滑块处于“ 打开”状态

  3. 您是否创建了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. 将以下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"... 
  5. 另外,请确保您具有必需的库和SDK软件包:

    • Android支持存储库
    • Google储存库
    • Google Play服务
    • Android支持库

转到您的build.gradle(app)文件并添加Google Play依赖项,该行为:compile'c​​om.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'
}
  1. 然后将以下内容添加到您的AndroidManifest.xml中,这将验证您项目中的Google Play服务库:

     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> 
  2. 然后在MainActivity.java中,将maps包添加到您的import语句中:

     import com.google.android.gms.maps.GoogleMap; public class MainActivity extends AppCompatActivity { 
  3. 由于您使用的是片段,因此我将在此处坚持:

我创建一个新的布局(右键单击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"/>
  1. 为了测试该应用程序,最后一项更改是将片段添加到您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM