ClassCastException при попытке отобразить карту сервисов Google Play v2

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

Попытка создать приложение с использованием API Google Play Services Map v2.

У меня есть ключ API, нет проблем.

Вот мои биты: MainActivity.java

public class MainActivity extends FragmentActivity
{

    GoogleMap googleMap;

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

        int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());
        if ( status==ConnectionResult.SUCCESS)
        {
            SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
            googleMap = supportMapFragment.getMap();
        }
        else
        {
            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
            dialog.show();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

Activity_main.xml:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" 
      android:id="@+id/map"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:name="com.google.android.gms.maps.MapFragment"/>

Соответствующий манифест:

<uses-sdk
    android:minSdkVersion="11"
    android:targetSdkVersion="17" />

<permission
    android:name="com.mcdaniel.mmm4.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.mcdaniel.mmm4.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.persmission.INTERNET" />
<uses-permission android:name="android.persmission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.persmission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

<meta-data
    android:name="com.google.android.maps.v2.API_KEY"
    android:value="MY API KEY" />

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

Я преодолел ошибку NoClassDefFound, связанную с R$styleable и ClassNotFound класса карт, но не могу пройти мимо этой ошибки.

Что касается класса, я безуспешно пробовал пару разных реализаций. Этот кажется наиболее явным. Никаких предупреждений о компиляции.

Моя цель - Android-17 с минимумом Android-11. У меня есть импортированная библиотека (с опцией копирования файлов), на которую ссылается мой проект, а также экспортируется.

Очевидно, я что-то упускаю. Пожалуйста помоги!

Спасибо, Дэвид


person Mac    schedule 03.05.2013    source источник
comment
не могли бы вы опубликовать свой журнал?   -  person HalR    schedule 03.05.2013
comment
вам, вероятно, следует удалить свой ключ оттуда   -  person JRowan    schedule 03.05.2013
comment
@JRowan Не нужно бояться разоблачения ключа. Это [a] невозможно использовать, если у вас нет их ключа подписи и [b] общедоступного значения после того, как APK попадет в Google Play: никто не может помешать вам установить приложение, скопировать его на компьютер, разархивировать и просмотреть (но [a] до сих пор действует).   -  person MaciejGórski    schedule 03.05.2013
comment
хорошо, я подумал, что спасибо   -  person JRowan    schedule 03.05.2013


Ответы (3)


Вы не можете преобразовать MapFragment (из вашего XML) в SupportMapFragment.

Одним из возможных решений является изменение MapFragment в вашем XML на SupportMapFragment, как предлагает ankitmakwana в своем ответе.

На мой взгляд, лучшим подходом было бы установить минимальный поддерживаемый API на API12 вместо API11 и использовать MapFragment вместо SupportMapFragment. Тогда вам не нужно беспокоиться о библиотеке совместимости.

Установка минимального поддерживаемого API на API12 вместо API11 не должна отображать (почти) какие-либо устройства, несовместимые с вашим приложением, как согласно этому ответу, опубликованный одним из крупнейших гуру Android здесь, в SO, практически нет устройств, работающих под управлением API11.

Если вы решили пойти по этому пути, просто оставьте свой XML как есть и измените следующие строки в своем коде:

SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
googleMap = supportMapFragment.getMap();

к этому:

MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.map);
googleMap = mapFragment.getMap();

Тогда это сработает.

person zbr    schedule 03.05.2013
comment
Спасибо за совет!! У меня есть намного дальше, наконец! Я изменил на min=12, избавился от всех ссылок на пакеты support.v4, и теперь я не получаю эти ошибки выше. Но то, что я получаю, не удалось загрузить карту. Не удалось связаться с серверами Google. Добавьте ‹uses-permission anroid:name=android.permission.ACCESS_NETWORK_STATE/› в AndroidManifest.xml. Но это уже есть! Не уверен, что происходит сейчас. - person Mac; 04.05.2013
comment
Я думаю, что должно быть <uses-permission android:name="com.mcdaniel.mmm4.permission.MAPS_RECEIVE" /> вместо <uses-permission android:name="com.mcdaniel.mmm4.MAPS_RECEIVE" />. Пожалуйста, попробуйте отредактировать его и дайте мне знать, если это сработало. - person zbr; 04.05.2013
comment
У меня тоже есть, но ошибка конкретно ссылается на ACCESS_NETWORK_STATE, который у меня тоже есть. - person Mac; 04.05.2013
comment
Так это работает сейчас? Если это так, обязательно примите ответ здесь. (Не обязательно должен быть моим. ;)) Спасибо. - person zbr; 04.05.2013
comment
Да, наконец-то это работает! Спасибо всем, кто помог мне туда добраться! Я приму один из ответов, хотя ни один из них не привел меня туда ... это была комбинация всей вашей помощи! Спасибо еще раз! - person Mac; 04.05.2013

это может помочь вам в xml изменении Нравится SupportMapFragment

<fragment
            android:id="@+id/chk_aerrow_map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="fill_parent"
            android:layout_margin="5dp"
            android:layout_height="100dp" />

Подробности см. здесь

person Ankitkumar Makwana    schedule 03.05.2013
comment
Простой ответ. Забри и Рагунандан могли меньше спорить и делать свои (тоже в основном правильные) ответы краткими. - person MaciejGórski; 03.05.2013
comment
Что ж, это помогло, но теперь я вернулся к NoClassDefFoundError: com.google.android.gms.R$styleable... так странно. Спасибо, Анкитмаквана! - person Mac; 04.05.2013
comment
На самом деле я вернулся к MapFragment, так как мне действительно не нравилось использовать библиотеку поддержки. Также переключите min=12, как указано ниже. - person Mac; 04.05.2013

         My target is android-17 with min of android-11

Ваш минимальный SDK равен 11.

Примечание. Если вы хотите запустить приложение на API 11 и ниже, вам также потребуется добавить библиотеку поддержки.

http://developer.android.com/tools/extras/support-library.html

Использовать этот

  android:name="com.google.android.gms.maps.SupportMapFragment"

Поскольку вы не добавили библиотеку поддержки, вы получили classcastexception

Также убедитесь, что вы выполнили все шаги по ссылке ниже.

https://developers.google.com/maps/documentation/android/start

Редактировать

https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/MapFragment

Фрагмент MapFragment для API 12 и выше поддерживает фрагмент для API 11 и ниже

введите здесь описание изображения

person Raghunandan    schedule 03.05.2013
comment
API11 это соты. Нет необходимости в библиотеке поддержки. - person zbr; 03.05.2013
comment
@Zabri, я только что ответил на аналогичный вопрос здесь stackoverflow.com/questions/16322472/. Работал на пользователя. Пожалуйста, проверьте, прежде чем минусовать - person Raghunandan; 03.05.2013
comment
@Zabri проверьте ссылку в редактировании для получения дополнительной информации. проверьте последнее утверждение в прикрепленном снимке. вы должны поддержать свою претензию, прежде чем добавлять комментарий. - person Raghunandan; 03.05.2013
comment
Да, ты прав. Удаление отрицательного голоса сейчас. Но, пожалуйста, проверьте правку, которую я внес в свой ответ. - person zbr; 03.05.2013
comment
@Zabri, если он использует фрагмент поддержки, он должен добавить библиотеку поддержки. - person Raghunandan; 03.05.2013
comment
Ага, о чем я говорю, что если бы он поддержал мин. API12 (который, согласно ответу CommonsWare на вопрос, ссылку на который я разместил в своем ответе, совпадает с поддержкой мин. API11), тогда ему нет необходимости использовать SupportMapFragment. Хотя мог. Но нет необходимости. - person zbr; 03.05.2013
comment
Можете ли вы поддержать документацию, в которой говорится, что требуется API 12? В этих документах было много ошибок, и похоже, что это еще не исправлено. - person MaciejGórski; 03.05.2013
comment
dd вы проверяете моментальный снимок редактирования. проверьте последнюю строку. Я не знаю, содержат ли документы ошибку. Я не могу это комментировать - person Raghunandan; 03.05.2013
comment
ОК, переключился на min=12. Я просто хочу не избавляться от тонны устройств. - person Mac; 04.05.2013
comment
Я также удалил ссылку на поддержку FragmentActivity, так что теперь мой класс расширяет Activity. Я проверил две ссылки и перешел по первой на 100%, чтобы получить свой исходный код, и, как я уже писал выше, использовал getMap(), чтобы фактически получить карту. Теперь у меня также есть LinearLayout, окружающий фрагмент моей карты в моем файле .xml. - person Mac; 04.05.2013