2013-10-27 3 views
0

Я пишу приложение для Android, которое использует карты Google APIv2. Он работает практически на всех устройствах. Но есть проблема с Android 4.0.4 и 4.2.2. Сбой приложений во время инициализации карты.Google Maps APIv2

В Android 4.0.4 он работает после перезагрузки, на 4.2.2 он не работает.

Вот код инициализации:

public class MyMapActivity extends FragmentActivity implements LocationListener 
{ 
     private GoogleMap map; 
     @Override 
     protected void onCreate(Bundle savedInstanceState) 
     { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my_map); 
     // Getting Google Play availability status 
     int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()); 

     // Showing status 
     if(status!=ConnectionResult.SUCCESS) 
     { // Google Play Services are not available 
       int requestCode = 10; 
       Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); 
       dialog.show(); 
     } 
     else 
     {// Google Play Services are available 
       // Getting reference to the SupportMapFragment of activity_main.xml 
       SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map); 

       // Getting GoogleMap object from the fragment 
       map = fm.getMap(); 

       // Enabling MyLocation Layer of Google Map 
       map.setMyLocationEnabled(true); 
     } 
     } 
} 

activity_my_map.xml:

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


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

</RelativeLayout> 
+2

Используйте LogCat для проверки трассировки стека Java, связанной с вашим сбоем. Если вы не можете определить, что такое трассировка стека, отредактируйте свой вопрос и вставьте трассировку стека в вопрос. – CommonsWare

ответ

0

Я думаю, что GetMap может возвращать нуль, попробуйте настроить свой код примерно так:

private GoogleMap mMap; 

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

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

    if (savedInstanceState == null) { 
     // First incarnation of this activity. 
     mapFragment.setRetainInstance(true); 
    } else { 
     // Reincarnated activity. The obtained map is the same map instance in the previous 
     // activity life cycle. There is no need to reinitialize it. 
     mMap = mapFragment.getMap(); 
    } 
    setUpMapIfNeeded(); 
} 

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

private void setUpMapIfNeeded() { 
    if (mMap == null) { 
     mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
       .getMap(); 
     if (mMap != null) { 
      // Enabling MyLocation Layer of Google Map 
      map.setMyLocationEnabled(true); 
     } 
    } 
} 

Код был из-за демонстрации API RetainMapActivity

+0

Пример «RetainMapActivity» вызывает утечку первого экземпляра 'Activity', потому что объект' GoogleMap' (или некоторый другой объект на графике этого объекта) должен удерживать 'Context'. –

+0

Я не считаю, что это вызывает утечку, поскольку я использую этот подход и такие вещи, как шаблон обратного вызова фрагмента, и не испытывал утечек. Было бы проблемой, если бы я передал весь объект Activity без использования WeakReference, иначе нет. – cYrixmorten

+0

Это не то, во что вы верите или нет. Запустите приложение (или пример «RetainMapActivity»), поверните экран, сделайте кучу кучи и просмотрите его в [MAT] (http://www.eclipse.org/mat/). Вы увидите два вида деятельности. –

Смежные вопросы