2010-08-04 4 views
19

В настоящее время я разрабатываю приложение для Android, использующее API карт Google.Как определить устройство Android, поддерживает ли оно карты Google API

Мне интересно, все андроид-устройства поддерживают API-интерфейс карты, потому что этот api является оптическим api, и это дополнение к платформе.

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

Что мне нужно знать, это программно определить, поддерживает ли API-интерфейс карты поддержки устройств, и улавливает исключение и делает что-то еще.

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

Любые комментарии или предложения приветствуются

ответ

2

Спасибо за помощь всем своим парням! все ваше предложение мне полезно!

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

То, что я сделал, я указав <uses-library android:name="com.google.android.maps" android:required="false" />

(но андроид «требуется» атрибут работает только для 2.1 и не работает на 1.6. Мне нужно, чтобы выяснить, почему. Сов, когда я должен был смотреть на документацию , он говорит, что это отнесено к поддержке 1.6)

Таким образом, я могу развернуть приложение на эмулятор.

Во-вторых, я создал карту деятельности, которая называется HelloMaps В моей основной деятельности

try{ 
    mapActivity = new Intent(TestApp.this, HelloMaps.class); 
    startActivityForResult(mapActivity, 0); 
}catch(NoClassDefFoundError e){ 
(Toast.makeText(TestApp.this, "Google Map API not found", Toast.LENGTH_LONG)).show(); 
} 

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

+0

вам удалось заставить его работать на вкладке галактики? –

+2

Это решение не очень хорошо достаточно, и довольно грязно! – TacB0sS

0

Дополнительный API только относится к эмулятору, насколько я знаю. 2 разные версии уровней API предназначены только для эмулятора, у реальных устройств должны быть все API-интерфейсы.

+0

Нет .. К примеру, Archos 5It (или некоторые другие планшеты) не имеют Карты Google (и у них нет Android Matket). –

+0

Да. в некоторых планшетах нет Карт Google. Я тестировал на реальном планшетном устройстве, когда я устанавливаю свою активность на карте, он дает мне установить сообщение об ошибке с ошибкой. –

+0

Команда Casio G'Zone не поставляется с предустановленными Картами Google, у нее установлены B # $ #% ## ing карты (и я не могу ее удалить!). –

2

Вы правы, некоторые устройства, такие как Archos 5IT и Some Tablet, не имеют Google Maps, Android Market, и т. д.

Вот мой код. BelgianMap является MapActivity:

try { 
    Intent i = new Intent(InfoGare.this, BelgianMap.class); 
    startActivityForResult(i, 0); 
} 
catch(ActivityNotFoundException e) { 
    Toast.makeText(context, "Google Map not found", Toast.LENGTH_LONG).show(); 
} 

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

+0

Это будет работать и имеет хорошую избыточность. Однако, если вы просто не хотите, чтобы пользователи могли использовать приложение, то решение, которое я опубликовал, может быть более подходящим, и я думаю, что очень важно, если вы используете API googlemaps. – stealthcopter

+0

Вы правы! Большое спасибо за информацию, которая мне очень поможет! –

+1

Большое спасибо. ваш код работает для меня. но мне нужно поймать NoClassDefFoundError. –

0

Если вы используете GoogleMaps в вашем приложении, вы должны включать в себя следующее в вашем Manifest.xml внутри тегов приложения

<uses-library android:name="com.google.android.maps" /> 

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

+1

Да, вы правы. Рынок Android отфильтровал приложение для пользователя. Однако я хотел бы разрешить пользователю загружать мое приложение не только с рынка, но и с моего сайта. Поскольку использование возможностей карты является лишь одной из особенностей моего приложения, я бы хотел, чтобы те устройства, которые не поддерживают map api, все еще могут загружать и запускать мое приложение, не выполняя другие функции моего приложения. –

+1

use android: required = "false" – hackbod

+0

android: required = "false" помогло мне установить мое приложение карты на не-google api поддерживаемый эмулятор (2.1), по крайней мере, я не получил сообщение об ошибке «Отсутствие общей библиотеки» , Однако этот атрибут не работает для 1.6 каким-то образом, я не могу скомпилировать, я получаю «Нет идентификатора resouce, найденного для« обязательного »сообщения об ошибке, когда я собираю проект –

1

Это работает для меня:

Используйте (без документов?) Использует библиотека андроид: имя = «com.google.android.maps» андроида: требуется = «ложь» в манифесте. Это позволит установить на не поддерживаемое устройство maps-api.

Затем проверить это: http://android-developers.blogspot.com.ar/2009/01/can-i-use-this-intent.html

Вы все еще можете иметь весь код карты-апи нетронутыми в приложение (нет необходимости в 2-х вариантах), просто закодировать свой пользовательский интерфейс для предотвращения запуска. (В моем случае я выбрал предпочтение). Как уже отмечалось, техника, изложенная выше, эффективно предсказывает то, что не будет работать, и позволяет вам реагировать (без FC), а не просто реагировать на проблему.

15

Я использовал следующие решения в дополнение к описанным

<uses-library android:name="com.google.android.maps" android:required="false"/> 

в других ответах:

public void mapClick(View view) 
{ 
    try 
    { 
     // check if Google Maps is supported on given device 
     Class.forName("com.google.android.maps.MapActivity"); 

     this.startActivity(new Intent(this, MyMapActivity.class)); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
     UIUtils.showAlert(this, R.string.google_maps_not_found); 
    } 
} 
+0

это, похоже, не работает на вкладке galaxy galaxy с Android 3.2 и на виртуальном боксе с android x86. 2.2 – max4ever

+0

Как это может произойти? класс существует, или нет ... Возможно, нулевая проверка может быть добавлена, если класс равен нулю, а затем исключение исключить в случае, если оно равно null. Это просто не может потерпеть неудачу, иначе Java будет очень хромым языком. ;) – TacB0sS

+1

Возможно, он имеет в виду: «он не обнаруживает присутствие Карт Google, когда он должен, как он есть»? –

5

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

public static boolean hasSystemSharedLibraryInstalled(Context ctx, 
     String libraryName) { 
    boolean hasLibraryInstalled = false; 
    if (!TextUtils.isEmpty(libraryName)) { 
     String[] installedLibraries = ctx.getPackageManager() 
       .getSystemSharedLibraryNames(); 
     if (installedLibraries != null) { 
      for (String s : installedLibraries) { 
       if (libraryName.equals(s)) { 
        hasLibraryInstalled = true; 
        break; 
       } 
      } 
     } 
    } 
    return hasLibraryInstalled; 
} 

И затем я проверяю, установлен ли com.google.android.maps.

0

С помощью adb, чтобы печатать все системные библиотеки:

adb shell cmd package list libraries 

Если ваше устройство поддерживает Google Maps, вы увидите строку:

library:com.google.android.maps 
Смежные вопросы