Java.lang.SecurityException: недопустимое имя пакета: com.google.android.gms

У меня есть эта странная трассировка стека при тестировании приложения на Samsung Galaxy S2 (GT-i9100), Android версии 4.3. Если это помогает, Bugsense сообщает также "данные журнала" = {u'ms_from_start ': u'19915', u'rooted ': u'true'}, поэтому я не совсем уверен, что это устройство коренится или нет (клиент тестирует приложение, а не меня). EDIT: пока я набираю это, клиент подтвердил, что у устройства есть пользовательский ПЗУ, если это имеет значение.

Во всяком случае, это полная трассировка стека:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mypackagename/com.mypackagename.activities.ARActivity}: 

java.lang.SecurityException: invalid package name: com.google.android.gms
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2355)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2405)
    at android.app.ActivityThread.access$600(ActivityThread.java:156)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5303)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
    at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.SecurityException: invalid package name: com.google.android.gms
    at android.os.Parcel.readException(Parcel.java:1431)
    at android.os.Parcel.readException(Parcel.java:1385)
    at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:540)
    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:836)
    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:430)
    at android.privacy.surrogate.PrivacyLocationManager.requestLocationUpdates(PrivacyLocationManager.java:290)
    at com.mypackagename.activities.ARActivity.onCreate(ARActivity.java:371)
    at android.app.Activity.performCreate(Activity.java:5259)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1098)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2309)

Теперь ARActivity.java:371 просто вызывает

locationManager.requestLocationUpdates(GPS, gpsRefreshPeriod, 0, locListener);

где

private String GPS = "gps";
private int gpsRefreshPeriod = 500;

и locListener - это идентификатор местоположения.

Теперь я понятия не имею, что здесь может пойти не так, и я не могу воспроизвести эту ошибку на своих тестовых устройствах (Samsung Galaxy Tab2, Motorola Atrix 4G, Samsung Note2, Galaxy Nexus).

Я думаю, что может быть проверка com.google.android.gms каким-то образом, и, возможно, может быть Intent (или что-то еще), что в случае отсутствия этого пакета пользовательский компонент устройства обновления. Но я совершенно не конечно, если я пойду в правильном направлении с этим мышлением.

Любые идеи или опыт с этим сбоем?

Спасибо.

Ответ 1

попробуйте использовать

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

в теге приложения. Пример

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name" >
    <uses-library android:name="com.google.android.gms" />

Ответ 2

Некоторые устройства, которые я использую для тестирования, не имеют возможностей для поддержки gps и получения местоположения, вот почему я получил исключение

"неверное имя пакета: com.google.android.gms"

Мы должны добавить необходимые разрешения

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>  

и очень важно добавить android: required = false "для GPS.

  <uses-feature
         android:name="android.hardware.location.gps"
         android:required="false" />

Дополнительная информация: < uses-feature >

Ответ 3

Мне кажется, что на этом устройстве просто не установлено приложение GoogleApps. Пользовательский ПЗУ на самом деле может быть для этого намеком. Например, владелец этого устройства мог установить Cyanogenmod, но он забыл (или намеренно не установил) Google Apps, которые поставляются отдельно.