Разрешение на 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 из-за отсутствия разрешения.