2013-05-31 3 views
0

я получаю следующее сообщение об ошибке в моем приложении, сообщенные Google Play:MapFragment - CameraUpdateFactory не инициализируется

... 
Caused by: java.lang.NullPointerException: CameraUpdateFactory is not initialized 
at com.google.android.gms.internal.x.b(Unknown Source) 
at com.google.android.gms.maps.CameraUpdateFactory.aE(Unknown Source) 
at com.google.android.gms.maps.CameraUpdateFactory.newCameraPosition(Unknown Source) 
at com.foo.DetailActivity.onCreate(DetailActivity.java:144) 

Я уже читал сообщения, как this. Мой код в DetailActivity (распространяется FragmentActivity) следующим образом:

try { 
    MapsInitializer.initialize(this); 
} catch (GooglePlayServicesNotAvailableException e) { 
    Log.e("map", " " + e.getMessage()); 
} 

SharedPreferences settings = getPreferences(0); 
CameraPosition cameraPosition = new CameraPosition.Builder() 
    .target(new LatLng(settings.getFloat("lat", -28.709861f), settings.getFloat("lon", 26.015625f))) 
    .zoom(settings.contains("lat") ? 11 : 6) 
    .build(); 
CameraUpdate cu = CameraUpdateFactory.newCameraPosition(cameraPosition); //line 144 

Я не знаю, как это все еще неиницализированные. На этом этапе моего кода я еще не создал MapFragment. Я не вижу, что это должно было быть после создания MapFragment, хотя, поскольку я ничего не звоню из MapFragment.

Любые идеи, почему это не работает?

+0

'Я еще не создал MapFragment. ' Вы еще не добавили« MapFragment »в макет? –

+0

Только около 10 строк. Сначала я инициализирую материал, связанный с картой, затем настройте его, используя все необходимые материалы. –

+0

Код выглядит нормально, а javadoc для MapInitializer указывает, что он инициализирует CameraUpdateFactory. Вы уверены, что вы не выбрали исключение GooglePlayServiceNotAvailableException и не пропустили его в журналах? –

ответ

1

Для следующего обновления заменить:

Log.e("map", " " + e.getMessage()); 

с:

throw new RuntimeException(e); 

По крайней мере, вы получите реальную причину, а не симптом NPE.

В любом случае, если службы Google Play не установлены на устройстве пользователя, этот код никогда не должен пытаться выполнить.

Есть такие вещи, как GooglePlayServicesUtil.isGooglePlayServicesAvailable и другие функции, которые помогут вам.

+1

Проблема с просто исключая исключения заключается в том, что мы получаем нелепые выходы. Неудачное изящество приятно для клиента, но неудача с деталями приятнее для нас, разработчиков. –

+0

Вы также можете просто изменить это на Log.e ("map", "" + e.getMessage(), e); который будет распечатывать трассировку стека (включая причину «причину», и это то, что вам нужно) в качестве части сообщения журнала. – Elroid

+0

@Elroid Это не поможет, так как исключение на устройстве пользователя произошло в строке 144. С включенным разработчиком ACRA можно было получить доступ к журналу ошибок, но без него не было никакого кода. –

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