Ресурсы служб Google Play не найдены – Push Notifications

Я следую Google Tutorial для установки Push Notification на Android. Я использую модуль Google Play Services, потому что облачные сообщения Google недавно устарели .

Учебник: Google Cloud Messaging – Службы Google Play

Но когда я запускаю приложение, у меня возникают такие ошибки:

11-06 13:37:30.119 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1821 (common_google_play_services_unknown_issue) in Lcom/google/android/gms/R$string; 11-06 13:37:30.119 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1821 (common_google_play_services_unknown_issue) in Lcom/google/android/gms/R$string; 11-06 13:37:30.119 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1816 (common_google_play_services_install_title) in Lcom/google/android/gms/R$string; 11-06 13:37:30.119 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1812 (common_google_play_services_enable_title) in Lcom/google/android/gms/R$string; 11-06 13:37:30.119 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1826 (common_google_play_services_update_title) in Lcom/google/android/gms/R$string; 11-06 13:37:30.119 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1823 (common_google_play_services_unsupported_title) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1820 (common_google_play_services_network_error_title) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1821 (common_google_play_services_unknown_issue) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1821 (common_google_play_services_unknown_issue) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1818 (common_google_play_services_invalid_account_title) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1821 (common_google_play_services_unknown_issue) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1813 (common_google_play_services_install_button) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1810 (common_google_play_services_enable_button) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1824 (common_google_play_services_update_button) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1821 (common_google_play_services_unknown_issue) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1815 (common_google_play_services_install_text_tablet) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1814 (common_google_play_services_install_text_phone) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1811 (common_google_play_services_enable_text) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1825 (common_google_play_services_update_text) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1822 (common_google_play_services_unsupported_text) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1819 (common_google_play_services_network_error_text) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1817 (common_google_play_services_invalid_account_text) in Lcom/google/android/gms/R$string; 11-06 13:37:30.129 20097-20097/com.thedjnivek.android.emarchespublics W/dalvikvm﹕ VFY: unable to resolve static field 1821 (common_google_play_services_unknown_issue) in Lcom/google/android/gms/R$string; 11-06 13:37:30.139 20097-20097/com.thedjnivek.android.emarchespublics E/GooglePlayServicesUtil﹕ The Google Play services resources were not found. Check your project configuration to ensure that the resources are included. 11-06 13:37:30.220 20097-20097/com.thedjnivek.android.emarchespublics E/GooglePlayServicesUtil﹕ The Google Play services resources were not found. Check your project configuration to ensure that the resources are included. 

Вы можете увидеть здесь мой исходный код

 //basic import ... import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.gcm.GoogleCloudMessaging; public class AppMainTabActivity extends FragmentActivity { public static final String EXTRA_MESSAGE = "message"; public static final String PROPERTY_REG_ID = "registration_id"; private static final String PROPERTY_APP_VERSION = "appVersion"; private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; /** * Substitute you own sender ID here. This is the project number you got * from the API Console, as described in "Getting Started." */ String SENDER_ID = "7984****78"; /** * Tag used on log messages. */ static final String TAG = "GCMDemo"; TextView mDisplay; GoogleCloudMessaging gcm; AtomicInteger msgId = new AtomicInteger(); SharedPreferences prefs; Context context; String regid; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = getApplicationContext(); // Check device for Play Services APK. If check succeeds, proceed with // GCM registration. if (checkPlayServices()) { gcm = GoogleCloudMessaging.getInstance(this); regid = getRegistrationId(context); if (regid.isEmpty()) { registerInBackground(); } } else { Log.i(TAG, "No valid Google Play Services APK found."); } } // You need to do the Play Services APK check here too. @Override protected void onResume() { super.onResume(); checkPlayServices(); } /** * Check the device to make sure it has the Google Play Services APK. If * it doesn't, display a dialog that allows users to download the APK from * the Google Play Store or enable it in the device's system settings. */ private boolean checkPlayServices() { int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); if (resultCode != ConnectionResult.SUCCESS) { if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_RESOLUTION_REQUEST).show(); } else { Log.i(TAG, "This device is not supported."); finish(); } return false; } return true; } /** * Gets the current registration ID for application on GCM service. * <p> * If result is empty, the app needs to register. * * @return registration ID, or empty string if there is no existing * registration ID. */ private String getRegistrationId(Context context) { final SharedPreferences prefs = getGCMPreferences(context); String registrationId = prefs.getString(PROPERTY_REG_ID, ""); if (registrationId.isEmpty()) { Log.i(TAG, "Registration not found."); return ""; } // Check if app was updated; if so, it must clear the registration ID // since the existing regID is not guaranteed to work with the new // app version. int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); int currentVersion = getAppVersion(context); if (registeredVersion != currentVersion) { Log.i(TAG, "App version changed."); return ""; } return registrationId; } /** * @return Application's {@code SharedPreferences}. */ private SharedPreferences getGCMPreferences(Context context) { // This sample app persists the registration ID in shared preferences, but // how you store the regID in your app is up to you. return getSharedPreferences(AppMainTabActivity.class.getSimpleName(), Context.MODE_PRIVATE); } /** * @return Application's version code from the {@code PackageManager}. */ private static int getAppVersion(Context context) { try { PackageInfo packageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 0); return packageInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { // should never happen throw new RuntimeException("Could not get package name: " + e); } } /** * Registers the application with GCM servers asynchronously. * <p> * Stores the registration ID and app versionCode in the application's * shared preferences. */ private void registerInBackground() { new AsyncTask() { @Override protected Object doInBackground(Object[] objects) { String msg = ""; try { if (gcm == null) { gcm = GoogleCloudMessaging.getInstance(context); } regid = gcm.register(SENDER_ID); msg = "Device registered, registration ID=" + regid; // You should send the registration ID to your server over HTTP, // so it can use GCM/HTTP or CCS to send messages to your app. // The request to your server should be authenticated if your app // is using accounts. sendRegistrationIdToBackend(); // For this demo: we don't need to send it because the device // will send upstream messages to a server that echo back the // message using the 'from' address in the message. // Persist the regID - no need to register again. storeRegistrationId(context, regid); } catch (IOException ex) { msg = "Error :" + ex.getMessage(); // If there is an error, don't just keep trying to register. // Require the user to click a button again, or perform // exponential back-off. } return msg; } @Override protected void onPostExecute(Object o) { mDisplay.append(o + "\n"); Logger.logit("onPostExecute","o"); } }.execute(null, null, null); } /** * Sends the registration ID to your server over HTTP, so it can use GCM/HTTP * or CCS to send messages to your app. Not needed for this demo since the * device sends upstream messages to a server that echoes back the message * using the 'from' address in the message. */ private void sendRegistrationIdToBackend() { // Your implementation here. PushNotification.register(OpenUDID.value(this), regid, new AsyncHRHandler(this, true) { @Override public void onSuccess(String s) { super.onSuccess(s); } }); } /** * Stores the registration ID and app versionCode in the application's * {@code SharedPreferences}. * * @param context application's context. * @param regId registration ID */ private void storeRegistrationId(Context context, String regId) { final SharedPreferences prefs = getGCMPreferences(context); int appVersion = getAppVersion(context); Log.i(TAG, "Saving regId on app version " + appVersion); SharedPreferences.Editor editor = prefs.edit(); editor.putString(PROPERTY_REG_ID, regId); editor.putInt(PROPERTY_APP_VERSION, appVersion); editor.commit(); } } 

Однако Google Play Service добавлен .

Дерево проектов thedjnivek

В настройках моего модуля

Настройки модуля thedjnivek

AndroidManifest.xml

 <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- For notification push --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> <permission android:name="com.thedjnivek.android.emarchespublics.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.thedjnivek.android.emarchespublics.permission.C2D_MESSAGE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme"> <receiver android:name=".GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.thedjnivek.android.emarchespublics" /> </intent-filter> </receiver> <service android:name=".GcmIntentService" /> <activity android:name=".fragmentmodule.AppMainTabActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustResize|stateVisible"> <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activity.PDFActivity" android:label="activity_pdf"/> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIza**************mGE4Mq88"/> </application> 

build.gradle

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.6.+' } } apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile: "com.google.android.gms:play-services:3.+" } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { minSdkVersion 8 targetSdkVersion 16 } } 

Я не знаю, где проблема. Кто-то не может мне помочь? Большое спасибо !

Я никогда не играл с push-уведомлениями, но я работаю с сервисами Google Play. Вы должны добавить папку google-play-services_lib как отдельный проект и добавить его в качестве библиотеки в свой проект Android.

  1. Импортируйте google-play-services_lib (также отметьте копию в рабочей области). Вы можете найти google-play-services_lib в sdk floder -> extra> google -> google_play_services -> libproject -> google-play-services_lib

  2. Установите вновь созданный проект как библиотеку (в eclipse -> путь сборки -> android -> отметьте «Библиотека» и ок.

  3. Перейдите к пути сборки вашего проекта Android -> android -> add -> добавьте только что созданную google-play-services_lib библиотеку.

Я надеюсь, что это помогает (-:

Вы не должны копировать google-play-services.jar прямо в свой проект. Вместо этого вам нужно добавить ссылку на

[Android-SDK] \ Extras \ Google \ google_play_services \ libproject \ Google-плей-services_lib

Библиотеки вашего проекта. Для этого следуйте пункту 4 этих инструкций. В Android Studio должна быть аналогичная процедура.

Причина в том, что библиотека GPS относится к ее собственным (com.google.android.gms.R) ресурсам из предварительно скомпилированного JAR.

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

Я использую IntelliJ IDEA для своего развития. Мне нужно было вызвать настройки проекта и добавить некоторые дополнительные зависимости к моему приложению. Одной из частей является ссылка на JAR-файл Google Play Services. Чтобы получить ресурсы, вам нужно обратиться к самому проекту, чтобы он компилировал класс R для Служб Службы. Вот что я сделал:

  1. Импортирован модуль, который ссылается на google-play-services_lib для источника
  2. Открытые параметры модуля для моего модуля приложения
  3. Щелкните вкладку «Зависимости»
  4. Добавлена ​​новая зависимость «Jars or Directories»
  5. Просмотрен в местоположение SDK для google-play-services.jar и на него ссылается
  6. Добавлена ​​новая зависимость модуля, которая ссылалась на проект для google-play-services_lib

FYI, у меня есть ссылка google-play-services.jar как глобальная библиотека, поэтому я могу легко включить ее в любой проект, но это не обязательно для этого. Вам просто нужно иметь ссылки как на JAR, так и на модуль, чтобы заставить его скомпилировать объект ресурсов Службы Служб.

В моем файле proguard.cfg для моего проекта приложения я добавил следующее:

 -keep public class com.google.android.gms.** 

Модификация конфигурации Proguard может не понадобиться.

После того, как я сделал эти изменения, он собрался довольно быстро. Я скажу, что документация API Google для реализации вызовов в их API очень устарела и неверна. Они упоминают ссылки на JAR, но ничего не говорят о ссылке на проект. Я смутно помню, как они замалчивали тот факт, что вам нужно самому собрать банку вручную самостоятельно, но не совсем ясно, что вам нужно указывать в своей документации.

Надеюсь это поможет!

Intereting Posts