android - 未找到 Google Play 服务资源 - 推送通知

标签 android push-notification google-cloud-messaging google-play-services

我正在按照 Google 教程在 Android 上安装推送通知。 我正在使用 Google Play 服务模块,因为 Google Cloud Messaging 最近被弃用

教程:Google Cloud Messaging - Google Play Services

但是当我启动该应用程序时出现以下错误:

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 服务已被添加

Project Tree thedjnivek

在我的模块设置

Module settings 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
    }
}

不知道问题出在哪里。有人不能帮助我吗?非常感谢!

最佳答案

我从未玩过推送通知,但我正在使用 google play 服务。您应该将 google-play-services_lib 文件夹添加为单独的项目,并将其作为库添加到您的 Android 项目中。

  1. 导入 google-play-services_lib(同时勾选复制到工作区)。 您可以在 sdk floder -> extra > google -> google_play_services -> libproject -> google-play-services_lib

  2. 将新创建的项目设置为库(在eclipse -> build path -> android -> 勾选“is Library”并确定。

  3. 转到您的 android 项目的构建路径 -> android -> 添加 -> 添加您刚刚创建的 google-play-services_lib 库。

希望对你有帮助(-:

关于android - 未找到 Google Play 服务资源 - 推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19812973/

相关文章:

java - `file://` uri 前缀是我可以硬编码的吗?

php - 如何在 Android 中使用 firebase 向 1000 多个用户发送推送通知?

ios - "WatchKit Simulator Actions"不适用于实际的 Apple Watch 设备

ios - 如何通过 FCM(Firebase) 或 native 在 iOS 10 中发送推送通知?

android - 在不崩溃 GCM 的情况下限制存储消息

php - C2DM 和 GCM 有什么区别

android - 在子文件夹中组织 Android src 文件夹 (Eclipse)

android - 如何获取在 jni 中返回泛型类型的函数的方法 ID?

android - 从 Azure 获取结果,插入一行并在插入 Azure 数据库后从本地数据库删除行数据

android - android P 中的 GCM 推送通知问题 (28)