2014-12-31 3 views
2

Я пытаюсь добавить маркер в карты google в своем приложении для Android. Но я получаю исключение с нулевой точкой при запуске приложения. Я не вижу, где мой код мог пойти не так.Исключительное исключение указателя при добавлении маркера в карты google

Это код, я использовал

GoogleMap googleMap = null; 

      MapFragment fm = (MapFragment) (activity.getFragmentManager()) 
        .findFragmentById(R.id.map); 

      googleMap = fm.getMap(); 
      googleMap.addMarker(new MarkerOptions() 
      .position(new LatLng(7.421226f,80.401264f)) 
      .title("Hello world")); 

LogCat

12-31 16:51:54.667: E/AndroidRuntime(10191): FATAL EXCEPTION: main 
12-31 16:51:54.667: E/AndroidRuntime(10191): java.lang.NullPointerException 
12-31 16:51:54.667: E/AndroidRuntime(10191): at com.fortuna.cinemalk.adapter.ViewPageAdapter.instantiateItem(ViewPageAdapter.java:201) 
12-31 16:51:54.667: E/AndroidRuntime(10191): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:829) 
12-31 16:51:54.667: E/AndroidRuntime(10191): at android.support.v4.view.ViewPager.populate(ViewPager.java:979) 
12-31 16:51:54.667: E/AndroidRuntime(10191): at android.support.v4.view.ViewPager.populate(ViewPager.java:911) 
12-31 16:51:54.667: E/AndroidRuntime(10191): at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:440) 
12-31 16:51:54.667: E/AndroidRuntime(10191): at com.fortuna.cinemalk.TheaterDetailFragment$BackGround.onPostExecute(TheaterDetailFragment.java:148) 
12-31 16:51:54.667: E/AndroidRuntime(10191): at com.fortuna.cinemalk.TheaterDetailFragment$BackGround.onPostExecute(TheaterDetailFragment.java:1) 
+0

в 'NPE' находится в ViewPageAdapter.java:201, что такое строка no.201 в этом классе – user2450263

+0

googleMap = fm.getMap(); – CraZyDroiD

ответ

0

По-видимому, проблема связана с самой карты, а не маркер.

Прежде всего, проверьте, какую версию сервисов Google Play вы используете в качестве библиотеки. Если у вас есть что-то до 6.5 version (выпущено в декабре 2014 года), ознакомьтесь со следующим кодом (заимствованиями в образцах услуг Google Play), чтобы убедиться, что у вас нет нулевого объекта карты.

/* 
* Copyright (C) 2012 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.example.mapdemo; 

import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 

/** 
* This shows how to create a simple activity with a map and a marker on the map. 
* <p> 
* Notice how we deal with the possibility that the Google Play services APK is not 
* installed/enabled/updated on a user's device. 
*/ 
public class BasicMapDemoActivity extends FragmentActivity { 
    /** 
    * Note that this may be null if the Google Play services APK is not available. 
    */ 
    private GoogleMap mMap; 

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

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setUpMapIfNeeded(); 
    } 

    /** 
    * Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly 
    * installed) and the map has not already been instantiated.. This will ensure that we only ever 
    * call {@link #setUpMap()} once when {@link #mMap} is not null. 
    * <p> 
    * If it isn't installed {@link SupportMapFragment} (and 
    * {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to 
    * install/update the Google Play services APK on their device. 
    * <p> 
    * A user can return to this FragmentActivity after following the prompt and correctly 
    * installing/updating/enabling the Google Play services. Since the FragmentActivity may not 
    * have been completely destroyed during this process (it is likely that it would only be 
    * stopped or paused), {@link #onCreate(Bundle)} may not be called again so we should call this 
    * method in {@link #onResume()} to guarantee that it will be called. 
    */ 
    private void setUpMapIfNeeded() { 
     // Do a null check to confirm that we have not already instantiated the map. 
     if (mMap == null) { 
      // Try to obtain the map from the SupportMapFragment. 
      mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
        .getMap(); 
      // Check if we were successful in obtaining the map. 
      if (mMap != null) { 
       setUpMap(); 
      } 
     } 
    } 

    /** 
    * This is where we can add markers or lines, add listeners or move the camera. In this case, we 
    * just add a marker near Africa. 
    * <p> 
    * This should only be called once and when we are sure that {@link #mMap} is not null. 
    */ 
    private void setUpMap() { 
     mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); 
    } 
} 



Другое решение, которое я настоятельно рекомендую, чтобы получить последнюю библиотеку сервисов Google Play (проверить here). Затем вам придется изменить свой код в соответствии с this guide из google, используя getMapAsync() (вместо getMap()) и обратный вызов, где вы можете делать все, пока карта готова к использованию, без каких-либо головных болей ,

0

EDIT: Как и другие ответы уже упоминалось, getMap() на самом деле в настоящее время амортизируется.

Поэтому метод ниже не рекомендуется, но может по-прежнему работать.


Во-первых, убедитесь, что вы ввели свой Карт ключ API для вашего AndroidManifest.xml

<meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="api-key-here" /> 

Затем убедитесь карту корректно определена в макете (пример ниже)

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

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

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

</RelativeLayout> 

После того, что , вы можете получить доступ к карте следующим образом:

android.support.v4.app.FragmentManager mFragmentManager = getSupportFragmentManager(); 
final SupportMapFragment mMapFragment = (SupportMapFragment) mFragmentManager.findFragmentById(R.id.mapView); 
googleMap = mMapFragment.getMap(); 
0

Вы проверили, действительно ли карта загружается? Я предполагаю, что исключение нулевого указателя на самом деле происходит с карты, а не от размещения на нем маркера.

Этот учебник является большое руководство по началу работы с картами Google (в том числе и обработки исключений, таких, как это): http://www.vogella.com/tutorials/AndroidGoogleMaps/article.html

0

getMap устарел, вместо этого используется getMapAsync. Ваша активность должна реализовать интерфейс OnMapReadyCallback, поэтому вы можете добавить маркеры в метод onMapReady.

Из документации:

GetMap() Этот метод является устаревшим. Вместо этого используйте getMapAsync (OnMapReadyCallback).Метод обратного вызова предоставляет вам экземпляр GoogleMap, который должен быть не нулевым и готовым к использованию.

1

1) Фрагмент может быть нулевым.

Если фрагмент карты не определен в макете, вы не сможете найти ее в onCreate. (Если это так, дайте мне знать, я обновлю ответ.)

2) Фрагмент еще не загружен.

Это более вероятный сценарий. У вас может быть экземпляр MapFragment, но он еще не должен иметь экземпляр GoogleMap. Самый новый SDK сервисов Google Play (v6.5.87) предоставляет вам метод MapFragment.getMapAsync(OnMapReadyCallback). Обратный вызов будет запускаться, как только будет доступен экземпляр GoogleMap. Только тогда вы сможете его использовать.

0
  1. Первой карта проверки Google является нулевой или NotNull с помощью этого метода -> Если (! GMAP = нуль)
  2. Имеете ли вы загрузить маркер форму значка URL (или) добавить изображение маркеров в информационном окно маркеров прямо из url.its можно получить исключение основной сетевой сети.
  3. Network Основным исключением резьбы приводит к нулевой маркер изображения, так что вы можете получить исключения нулевого указателя на карте Google

Решение:

добавить следующие строки в OnCreate метод

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

StrictMode.setThreadPolicy(policy); 
Смежные вопросы