从库项目注册 GCM [英] Register GCM from a library project

查看:19
本文介绍了从库项目注册 GCM的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从库项目注册到 GCM,GCMIntentService 是在库项目中定义的.

I am trying to register to GCM from a library project the GCMIntentService is defined inside the library project.

这是我的注册码(在库项目中):

Here is my registration code(inside the library project):

public static void init(Context context, String id){
    GCMRegistrar.checkDevice(context);
    GCMRegistrar.checkManifest(context);
    GCMRegistrar.register(context, id);
}

但是没有调用 GCMIntentService 的回调,只有当我将库项目作为独立的 android 项目运行时才会调用它们.

But the callbacks of the GCMIntentService are not being called, they are being called only when I run the library project as standalone android project.

这是我的测试项目清单:

Here is my test project manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.pushtest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <permission
        android:name="com.example.pushtest.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="com.example.pushtest.permission.C2D_MESSAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name=".PushTestApp" >
        <activity
            android:name="com.example.pushtest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <category android:name="com.example.pushtest" />
            </intent-filter>
        </receiver>
    </application>
    //push library definition
    <service android:name="com.test.pushlibrary.GCMIntentService" />

</manifest>

推荐答案

这是你必须做的:

编写一个覆盖 GCMBroadcastReceiver 的类(在您的库项目中):

Write a class (in your library project) that overrides GCMBroadcastReceiver :

package com.test.pushlibrary;

import android.content.Context;

import com.google.android.gcm.GCMBroadcastReceiver;


public class PushLibraryBroadcastReceiver extends GCMBroadcastReceiver
{
    /**
     * Gets the class name of the intent service that will handle GCM messages.
     */
    @Override
    protected String getGCMIntentServiceClassName(Context context) {
        return "com.test.pushlibrary.GCMIntentService";
    }
}

更改您的清单以引用新的接收器:

Change your manifest to refer to the new receiver :

    <receiver
        android:name="com.test.pushlibrary.PushLibraryBroadcastReceiver"
        ...

您的原始代码不起作用的原因是 getGCMIntentServiceClassName 的默认实现假定意图服务类位于应用程序的包中,因此它期望 com.example.pushtest.GCMIntentService 而不是 com.test.pushlibrary.GCMIntentService.

The reason that your original code didn't work is that the default implementation of getGCMIntentServiceClassName assumes that the intent service class is located in the package of the application, so it's expecting com.example.pushtest.GCMIntentService instead of com.test.pushlibrary.GCMIntentService.

这篇关于从库项目注册 GCM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆