Разрешение на MNC с Google Maps

Я создал минимальный пример, который демонстрирует проблему в этом вопросе

https://github.com/dbachelder/MNCMapTest

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

Проект создан с использованием Android Studio 1.3.1

Это был проект "Google Maps Activity", ориентированный на MNC.

Единственное изменение, которое я сделал, было изменение

compile 'com.android.support:appcompat-v7:23.+'

в

compile 'com.android.support:appcompat-v7:22.+'

как 23.+, кажется, еще не существует... (не уверен, почему он используется мастером создания проекта)

При запуске это исключение видно.

 Caused by: java.lang.SecurityException: The Maps API requires the additional following permissions to be set in the AndroidManifest.xml to ensure a correct behavior:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        at com.google.maps.api.android.lib6.d.t.a(Unknown Source)
        at com.google.maps.api.android.lib6.d.ft.a(Unknown Source)
        at com.google.maps.api.android.lib6.d.aj.a(Unknown Source)
        at com.google.maps.api.android.lib6.d.ai.a(Unknown Source)
        at com.google.android.gms.maps.internal.x.onTransact(SourceFile:107)
        at android.os.Binder.transact(Binder.java:387)
        at com.google.android.gms.maps.internal.IMapFragmentDelegate$zza$zza.onCreateView(Unknown Source)
        at com.google.android.gms.maps.SupportMapFragment$zza.onCreateView(Unknown Source)
        at com.google.android.gms.dynamic.zza$4.zzb(Unknown Source)
        at com.google.android.gms.dynamic.zza.zza(Unknown Source)
        at com.google.android.gms.dynamic.zza.onCreateView(Unknown Source)
        at com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)
        at android.support.v4.app.Fragment.performCreateView(Fragment.java:1789)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:924)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1116)
        at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1218)
        at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2170)
        at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:300)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748)
        ... 19 more

как вы можете видеть в манифесте:

https://github.com/dbachelder/MNCMapTest/blob/master/app/src/main/AndroidManifest.xml

Это разрешение есть.

Эмулятор работает под управлением последней версии M.

Есть что-то, чего мне не хватает, чтобы получить хорошие карты для игры в М? Как спросить разрешения, прежде чем раздувать макет, содержащий карту? Или я просто прыгаю, и мне нужно немного подождать, пока все это будет готово к тестированию?

Это кажется досадным ограничением, когда нужно запрашивать разрешение на хранение при запуске приложений, созданных на карте.

ОБНОВЛЕНИЕ: теперь есть ветвь проекта, которая работает.. вот разница: https://github.com/dbachelder/MNCMapTest/pull/1/files

3 ответа

Решение

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

Есть что-то, чего мне не хватает, чтобы получить хорошие карты для игры в М?

WRITE_EXTERNAL_STORAGE сейчас dangerous разрешение, начиная с v2 MNC. Вы не только должны иметь его в манифесте, но и запрашивать его у пользователя во время выполнения. Процесс для этого (несколько) описан в предварительной документации разработчика.

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

Как спросить разрешения, прежде чем раздувать макет, содержащий карту?

Да, вам нужно будет запросить (и получить) разрешение у пользователя, прежде чем пытаться вызвать любой код, для которого требуется это разрешение. Это, вероятно, означает, прежде чем пытаться что-либо сделать с помощью Карт V2

Или я просто прыгаю, и мне нужно немного подождать, пока все это будет готово к тестированию?

Да, могут быть и ошибки, но ваше приложение не запрашивает разрешения во время выполнения, поэтому я бы начал с него.

Обновление для утомленных путешественников в ближайшем будущем, я столкнулся с той же проблемой, в конечном итоге перейти от MapView к SupportMapFragment (из-за необходимости отложить инициализацию MapView до предоставления разрешения на внешнее хранение, с SupportMapFragment вам не нужно отправлять обратные вызовы жизненного цикла).

Это было довольно просто (немного сложно для нас из-за того, что мы использовали дочерние менеджеры фрагментов, но ничего непреодолимого), за исключением того, что вы должны тщательно обработать случай восстановления состояния фрагмента: скажем, пользователь предоставил разрешение, карта отображается, фоновое приложение перейдет в настройки, чтобы отозвать разрешение. Вернемся к приложению, фреймворк собирается восстановить старые фрагменты + состояния пользовательского интерфейса, поскольку фрагмент карты ранее находился в стеке пользовательского интерфейса, теперь создается фрагмент карты и происходит сбой, когда он попадает в SupportMapFragment#onCreateView из-за отсутствия разрешения.

Другие вопросы по тегам