3

私はアンドロイドの初心者です。チュートリアルに従って、アンドロイドを使用してグーグルマップに現在の場所を表示しようとしています。以下はコードです:

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 Services が古くなっています。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"
  />

編集:

申し訳ありませんが、android:class ではなく、class: のみにする必要があります。

于 2013-08-15T02:50:31.407 に答える