Intereting Posts
Как я могу отправить данные обратно из onPostExecute в AsyncTask? Обнаружение Нажмите кнопку «Установить обои» в меню «Живые обои» Как найти континент в определенном месте с помощью Geocoder в приложении для Android Почему приложение для Android говорит «Не удается воспроизвести видео» после воспроизведения? Android: как рисовать маршруты маршрутов Google Maps API V2 от текущего местоположения до пункта назначения Исключение Android Studio, возникающее при рендеринге Android – открытие приложения gmail с моим приложением Должен ли передавать контекст большинству классов признаком плохого дизайна? Программное подключение к другим сетевым операторам Что на самом деле дает мне функция getMaxAmplitude () для MediaRecorder для Android? Как лучше всего обращаться с жестом fling для Android ListActivity Firebase с мобильными приложениями Android: BitmapFactory.decodeByteArray дает пикселированное растровое изображение Aapt закончил с ненулевым значением выхода 127 Зафиксируйте ориентацию до окончания работы Asynctask

Android: автоматически выбирает debug / release Maps api key?

OBSOLETED: этот старый вопрос относится к устаревшему API Google Maps v1. При использовании API v2 вы можете использовать несколько отпечатков сертификата в одной записи консоли Google API . API-ключ больше не сохраняется в манифесте или коде.


Можно ли автоматически определить, какой сертификат использовался для подписания APK? Я хотел бы отлаживать и выпускать сертификаты Карты в приложении и передавать их в конструктор MapView.

С такой настройкой я не ошибусь при выпуске приложения – я использую сертификат отладки на эмуляторе и моем устройстве, а затем подписываюсь с выпуском до отправки приложения на Market.

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

Solutions Collecting From Web of "Android: автоматически выбирает debug / release Maps api key?"

Существует новый способ определить, является ли это отладочной сборкой или выпуском в SDK Tools, редакция 17 . Выдержка из обзора новых функций:

Builds теперь генерирует класс BuildConfig, содержащий константу DEBUG, которая автоматически устанавливается в соответствии с вашим типом сборки. Вы можете проверить константу ( BuildConfig.DEBUG ) в своем коде, чтобы запускать функции только для отладки.

Итак, теперь вы можете просто написать что-то вроде этого:

if (BuildConfig.DEBUG) { //Your debug code goes here } else { //Your release code goes here } 

ОБНОВЛЕНИЕ: я столкнулся с ошибкой в ​​ADT: иногда BuildConfig.DEBUG true после экспорта пакета приложений. Описание находится здесь: http://code.google.com/p/android/issues/detail?id=27940

Имел те же проблемы с ключом API. Вот полное решение, основанное на приведенной выше ссылке и примере из Bijarni (что почему-то не сработало для меня), теперь я использую этот метод:

 // Define the debug signature hash (Android default debug cert). Code from sigs[i].hashCode() protected final static int DEBUG_SIGNATURE_HASH = <your hash value>; // Checks if this apk was built using the debug certificate // Used eg for Google Maps API key determination (from: http://whereblogger.klaki.net/2009/10/choosing-android-maps-api-key-at-run.html) public static Boolean isDebugBuild(Context context) { if (_isDebugBuild == null) { try { _isDebugBuild = false; Signature [] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures; for (int i = 0; i < sigs.length; i++) { if (sigs[i].hashCode() == DEBUG_SIGNATURE_HASH) { Log.d(TAG, "This is a debug build!"); _isDebugBuild = true; break; } } } catch (NameNotFoundException e) { e.printStackTrace(); } } return _isDebugBuild; } 

Вы должны сразу выяснить, hashValue () отладки подписи, только вывести sigs [i] .hashCode ().

Тогда я не хотел динамически добавлять MapView, а скорее использовать xml-файл. Вы не можете установить атрибут ключа api в коде и использовать макет xml, поэтому я использую этот простой метод (хотя копирование макета xml не так красиво):

В моей MapActivity:

  public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Select the proper xml layout file which includes the matching Google API Key if (isDebugBuild(this)) { setContentView(R.layout.map_activity_debug); } else { setContentView(R.layout.map_activity_release); } 

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

 public boolean isDebugBuild() throws Exception { PackageManager pm = _context.getPackageManager(); PackageInfo pi = pm.getPackageInfo(_context.getPackageName(), 0); return ((pi.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0); } 

После обнаружения отладки вы можете использовать другой ресурс для отображения карты или создания карты в приложении и добавления в макет.

  if(isDebugBuild()) { _mapView = new MapView(this, getString(R.string.debugmapskey)); } else { _mapView = new MapView(this, getString(R.string.releasemapskey)); } 

Я работал над ужасающей неправильной интеграцией ключей api в процесс сборки и контроля источника, создавая его свойство, хранящееся в local.properties . Мне пришлось добавить следующее в build.xml :

 <property name="mapviewxml" value="res/layout/mapview.xml" /> <target name="-pre-build"> <fail unless="mapsApiKey">You need to add mapsApiKey=... to local.properties</fail> <copy file="mapview.xml.tpl" tofile="${mapviewxml}" overwrite="true"> <filterchain> <replacetokens> <token key="apiKey" value="${mapsApiKey}"/> </replacetokens> </filterchain> </copy> </target> 

Теперь, конечно, мне пришлось создать mapview.xml.tpl в моем mapview.xml.tpl root (он не может перейти к res/layout потому что он сломает процесс сборки):

 <?xml version="1.0" encoding="utf-8"?> <com.google.android.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:apiKey="@apiKey@" /> 

Во время предварительной компиляции шаблон копируется в нужное место, а @ apiKey @ заменяется реальным ключом. К сожалению, я не нашел способа отличить отладочную и выпускную сборки на этом этапе, поэтому для компиляции для выпуска я просто добавляю apiKey release к параметрам ant:

 ant -DmapsApiKey=.... release 

Этот подход хорошо интегрируется с SCM (мне не нужно проверять ключи) и приемлемо с процессом сборки.

Если вы все еще заинтересованы, я просто написал о другом способе сделать это. С простым изменением сценария сборки Android вы можете переключить ключ API карты, а также все другие необходимые изменения выпуска. Что мне нравится в этом, так это то, что в релиз не входит связанное с отладкой, и вы можете хранить макеты XML так, как раньше.

http://blog.cuttleworks.com/2011/02/android-dev-prod-builds/

Я думаю, что создание записи в консоли Google API, которая включает в себя как ключ освобождения, так и ваш ключ отладки (оба сопоставления с одним и тем же пакетом) отлично работает, и это гораздо более простой способ не беспокоиться о том, отлаживаете ли вы или компилируете Релиз. Решение описано здесь

Все ответы здесь выглядят устаревшими, если вы используете андроид-студию, тогда град – это способ пойти

Используйте разные клавиши в файле build.gradle

 android { .. .. ... buildTypes { debug { resValue "string", "google_maps_api_key", "[YOUR DEV KEY]" } release { resValue "string", "google_maps_api_key", "[YOUR PROD KEY]" } } } 

И в вашем AndroidManifest.xml

 <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="@string/google_maps_api_key"/> 

источник

И если вы хотите сохранить несколько паролей для отладки и выпуска по-разному, вы должны следовать этому

Я получил специальный файл на SD-карте – если он есть, используйте отладочный ключ; Отсутствует – используйте выпуск один. И это работает.

EDIT: см. Новый принятый ответ, он работает лучше

Я не знаю, помогает ли это кому-либо, но я объединил некоторые другие предложения здесь, чтобы создать следующую MapViewActivity.

В этом примере R.layout.map_dbg используется, только если это сборка отладки и файл существует (добавьте этот файл в свой .gitignore).

Преимущества этого подхода:

  1. Вам не нужно писать муравьиную цель (хорошо, если вы используете eclipse)
  2. Правильный ключ освобождения всегда находится в map.xml (надеюсь, что ключ отладки не будет проверен по ошибке)
  3. Ключ освобождения всегда используется для сборки релиза
  4. Можно использовать несколько клавиш отладки

Недостатками этого подхода являются:

  1. Вам нужно помнить об обновлении map_dbg.xml каждый раз, когда обновляется map.xml

     public class MapViewActivity extends MapActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // // copy the map.xml to map_dbg.xml and update the api key. // int id = getLayoutId("map_dbg"); if(id ==0) id = R.layout.map; setContentView(id); } int getLayoutId(String name) { return isDebugBuild() ? getResources().getIdentifier(name, "layout", getPackageName()) : 0; } public boolean isDebugBuild() { boolean dbg = false; try { PackageManager pm = getPackageManager(); PackageInfo pi = pm.getPackageInfo(getPackageName(), 0); dbg = ((pi.applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0); } catch (Exception e) { } return dbg; } } 

У меня установлена ​​простая цель муравья, которая заменяет apikey либо отладочным ключом, либо ключом release. Это действительно просто, и код не содержит ненужной логики.

 <target name="apikey"> <!-- Location of target layout file --> <first id="first"> <fileset dir="." includes="res/layout/kondi_training_templates.xml" /> </first> <property name="layout-file" value="${toString:first}"/> <echo>template-file: ${template-file}</echo> <replaceregexp file="${template-file}" match="android:apiKey=.*" replace='android:apiKey="${mapview.apikey}"' byline="true" /> </target> 

В Map V2 Легко отправлять отдельные ключи с помощью инструмента Android Studio Gradle. Я реализовал для этого простой способ. Пожалуйста, проверьте ссылку здесь .