Android Google Map API(v2)显示当前位置获取遗憾应用程序已停止错误

时间:2013-08-15 02:37:29

标签: android google-maps-api-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

Project Build Target是Google API等级18平台4.3我的AVD是Target-google api等级18

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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. 删除并安装应用程序(而不仅仅是重新安装)。 这解决了我的问题!
  6. 编辑:但是它无法正常运行,因为您在模拟器中运行应用程序。

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

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

    另外,如果你创建一个线程,在初始化Google Map之前不断检查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的第一行吗?