3

我是 android 初学者,我按照教程并尝试使用 android 在谷歌地图上显示当前位置。下面是代码:

MainActivity.java

package com.example.android_gps_location_detection;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

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.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

@SuppressLint("NewApi")
public class MainActivity extends FragmentActivity {
GoogleMap map;
LocationManager lm;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.mapView);
    map = mapFragment.getMap();

    map.setMyLocationEnabled(true);

    LocationListener ll = new LocationListener() {

        @Override
        public void onStatusChanged(String provider, int status,
                Bundle extras) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProviderDisabled(String provider) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onLocationChanged(Location location) {

            Toast.makeText(getApplicationContext(),
                    location.getLatitude() + " " + location.getLongitude(),
                    Toast.LENGTH_LONG).show();

            map.addMarker(new MarkerOptions()
                    .position(
                            new LatLng(location.getLatitude(), location
                                    .getLongitude()))
                    .title("my position")
                    .icon(BitmapDescriptorFactory
                            .defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

            map.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(
                    location.getLatitude(), location.getLongitude()), 15.0f));

        }
    };
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);

}

}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<fragment  
      android:id="@+id/mapView"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:name="com.google.android.gms.maps.SupportMapFragment"
      />
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyBqwF4D-JhpA32_OL8Bw0dKDqc7Jm0CWHQ"/>

    <uses-library android:name="com.google.android.maps" />

    <activity
        android:name="com.example.android_gps_location_detection.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

<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" />
<!--
 The following two permissions are not required to use
 Google Maps Android API v2, but are recommended.
-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<permission
    android:name="com.ram.mapsv2whereami.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.ram.mapsv2whereami.permission.MAPS_RECEIVE" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

</manifest>

我得到了这个错误 map.setMyLocationEnabled(true); 这一行得到了 NullPointerException,我怀疑 getMap() 返回 null。我做了一些研究,发现有人建议使用 SupportMapFragment。Google Play 服务已过期。需要 3225100 但找到 3158130

项目构建目标是 Google API 级别 18 平台 4.3 我的 AVD 是 Target-google api 级别 18

4

2 回答 2

1

问题出在您的 XML 文件 activity_main.xml 中:

<fragment  
  android:id="@+id/mapView"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:name="com.google.android.gms.maps.SupportMapFragment"
  />

而不是 android:name,你需要使用这样的类:

<fragment  
  android:id="@+id/mapView"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.SupportMapFragment"
  />

编辑:

抱歉,应该只是 class:,而不是 android:class。

于 2013-08-15T02:50:31.407 回答
1

我也有同样的问题。就我而言,它显示了 2 个错误:

The Google Play services resources were not found. Check your project configuration to ensure that the resources are included.

Failed to load map. Error contacting google servers

我通过这样做解决了这个问题:

  1. 验证您的 API 密钥。这并没有解决我的问题。
  2. 确保正确导入项目。它也不能解决问题。
  3. 我的 API 密钥有效且库已正确导入,因此我再次下载了 Google Play 服务库。
  4. 清理并重建所有项目。没有。
  5. 删除并安装应用程序(不仅仅是重新安装)。这解决了我的问题!

编辑:但是它也不起作用,因为您正在模拟器中运行您的应用程序。

它不适用于 AVD,因为即使是最新的 AVD 也不支持最新的 Google Play Services SDK(这是一个错误)。

我建议您通过下载较旧的 SDK 并将其复制到相应的文件夹中来降级 Google Play Services SDK。

另一个,如果你在初始化谷歌地图之前创建一个不断检查是否getMap()为空的线程,它会在特殊情况下修复一些错误。

编辑:顺便说一句,在activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<fragment  
      android:id="@+id/mapView"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:name="com.google.android.gms.maps.SupportMapFragment"
      />
</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>

我不知道为什么<?xml version="1.0" encoding="utf-8"?>在这个 xml 的最后一行。

xml声明不应该在xml的第一行吗?

于 2013-08-30T16:48:22.180 回答