2015最新最全 Android 谷歌消息推送GCM 详细使用教程

       因为项目是非大陆的手机项目,所以当要使用到消息推送的时候,百度了一下,国内的消息方案可以是:

1.百度云推送。也确实很快就可以搭建客户端和服务端,加载他的sdk,大概花了半个小时,就可以在手机端收到推送的消息。不过我想说说缺点,很多时候,消息推送过来延迟很严重,果然免费的没有好的质量,这一点学习到了,即使是大平台没有利益的驱使,呵呵,有点偏题了,还有一个重要的原因是在国外百度云推送肯定是不能使用的,这个方案取消。

2.极光推送,由于验证过海外是否可以使用,没有购买过付费的版本,也就不评论了。极光推送免费的搭建则比百度来的更快,大概花了10分钟就可以搭建完,并很快收到消息,并且有一点比百度好用的是不用专门去运行客户端拿到固定ID,极光只要安装了它的SDK的设备,都可以在控制台收到消息。当然了,因为不确定海外是否可用,我也放弃了。

          注:关于上述两种推送方案的教程请进到他们的官方网站,下载文档和源码,可以体验一下,这里就不介绍了。

3.本文的重点来了,第三种方案就是谷歌google平台,在前几年推出的GCM消息推送机制,GCM全称Google Cloud Messaging,关于这个机制的架构设计理念,我就不说了,可以自行百度一下,大概就是设备注册了之后,发送给谷歌的云服务并保留,当有消息时,本地服务器将消息发送给谷歌服务器,然后谷歌向注册过的设备发送消息。(有理解的错误,可以去官方查看详细解释,传送门在此:谷歌官网GCM图解(需要使用VPN访问谷歌的官网,请没有VPN的同学自己想办法了,我无能为力,公司给我专门购买的VPN)。

            =============================分割线,以下是在手机上增加谷歌GCM消息推送机制的详细教程,纯手打,尊重劳动成果===========================


       使用GCM消息推送机制的大前提如下:

      1.由于大陆屏蔽谷歌的服务,所以需要的前提是购买一个VPN,能够访问谷歌GCM云服务器,如果没有这个最最基本的条件,下面的内容都是建立在此基础上,如下图:



         2.第2个最关键的前提条件是有一个google 开发者账号,有了vpn之后,到谷歌官网注册一个开发者账号,需要使用信用卡25美元购买,两天之后就可以使用,注册开发者账号主要是拿到程序的ID和最关键的每个开发者拥有的API,参考如下谷歌官方介绍注册流程:谷歌开发者账号注册流程,网上的很多创建create project都过时了,现在谷歌有新版的界面,不过过程也差不多,只不过界面和操作不一样了而已,如下图:

        A.登陆你的谷歌账号,建立一个活动也就是project,网址传送门:谷歌开发者个人中心,这个网站是:https://console.developers.google.com/,别进到别的谷歌网站上,否则是无法创建应用程序的,如图:


     建好一个活动之后,会有一个ID号,这是区分每个活动project也就是中文的程序的唯一识别号,保存它,因为后续推送消息服务需要使用到它。

     B.建好一个project之后,需要拿到一个凭证(谷歌叫做凭证,也就是我说的最重要的API KEY,后面的应用程序,谷歌推送服务必须使用它来识别设备和发送消息,务必保存,如下图:


           



       C.拿到API Key你就可以开始你的谷歌推送服务之旅了,具体的使用过程有明白的可以问我,我也是被网上以前的教程误导的很厉害,总觉得新界面这个没有那个没有,就是那个create project一开始就没明白,怎么改版之后变成了活动,这些中文的翻译害死人。还有那个api key,怎么就翻译成了凭证,一开始怎么找也找不到。


         3.具备了上述的条件,下面的一步是有一台内置了谷歌google play 服务的手机,一个很不幸的消息是如果你觉得你手上的红米、锤子、乐视或者等等国产手机,谷歌服务是被剔除了的,那么这些真机是无法使用,换句话说配置好了服务端和客户端,消息还是接收不到,谷歌的推送GCM服务都是建立在基本的谷歌服务上面的,但别担心,有一个东西叫做模拟器。我说下我使用模拟器碰到的问题:

           A.如果使用eclipse ADT内置的服务器,那么需要你的模拟器有google api,你的android 系统有这个服务,如下图:


         这个其实很简单,启动sdk manager,选择android 4.3以上全部未安装的api就可以了,安装好之后,就是启动一个android 模拟器了,选中刚才你下载的android api版本,新建一个,如下图:



    c.创建好之后就可以了。不过后面我会告诉你 eclipse ADT自带的模拟器有一个很严重的问题:第一运行实在太卡太慢


    4.   第四个大前提就是模拟器或者手机,必须使用邮箱或者设置里面的添加账号,加入刚刚注册好的谷歌账号,否则无法使用谷歌推送服务以及你要玩的谷歌应用市场的游戏,如下图:


      输入你的谷歌账号,添加完成之后,就可以使用了,如下图:



    

     5.由于自带的模拟器速度实在无法忍受,最后选择了Bluestacks模拟器,速度实在是快的惊人,而且可以happy流畅的玩游戏,截图给你们看看,gif图片太大了,无法上传:


  

       B.添加谷歌账号,如图:




         输入你的谷歌账号,建好之后,一切准备工作都已经准备完成,就可以开心的正式进入谷歌gcm消息推送开发了。


=========================================分割线,谷歌android gcm 消息推送开发正式流程==============================================

       1.开发android 客户端,参考链接,感谢这位前辈:Android 消息推送gcm之客户端


      2.开发android 服务器端java版本具体流程:参考链接,还是这位前辈一篇博文:Android 消息推送gcm之java服务端

       

      本着不重复造轮子的精神,csdn有两篇博文实在写的太详细太专业,以至于我也不想重复啰嗦的进行陈列了,也有源代码例子,只要具备上述的所有前提条件,运行客户端和服务端程序,替换掉project ID和API KEY,就可以顺利的收到google 推送的消息,截图如下:

         服务端运行之后,会打印出一个注册ID,也就是每台设备的注册ID,接着在bluestacks模拟器运行的你加入推送消息服务的程序就会收到消息,如下图:

         红色模糊的部分是为了公司保密所需要,我的测试代码就不上传了,提供前辈的例子链接,他的博文里面也有,如下链接:

客户端代码:客户端代码csdn下载链接

服务端代码:服务端谷歌推送代码csdn下载链接


    至此所有谷歌推送服务gcm的流程就走完了,不过上述测试代码只是支持发送单一设备的,需要每次添加注册的设备号到服务端,修改之后才能发送到特定设备,存在极大缺陷,后续的按组发送的功能代码,等项目完成之后,会贴出关键代码,敬请期待!!!请尊重劳动成功,转载请注明出处,欢迎探讨。


===========================分割线,上述前辈实现的是发送单个设备的方法,我更新代码,可以发送多个设备==================

package com.ives.server;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.google.android.gcm.server.Constants;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.MulticastResult;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;

public class Main {
	private static final String apiKey = "AIzaSyDIqNvArRmXFdpSnbvJU1u0lYyY63jrbzY";
	//private static String deviceRegId = "APA91bHwe5H3Ihl-fKWIdXjq-xS76NLAOqpyt3IViUHVflyONw_xsfzbL69pRV_0FMEVVgCjKMEMLLDjOs4GTqR9t83ckzmG6nQDtjl4ZMFzNrFwar5GPue-J9vyNRjBdasLJEFo9AVZ";
	private static String deviceRegId = "APA91bHkqE9t5TwC3jusIKihNorDwzqlxidIndzE3WqkN7VwY2YOMclWt89AuO6sEtvlWhU6zQ8ktD6igatUru93i_KmVzbfDa4MzgrXwiVI-Hdn4aVPRgdTyvJLNq_JQPb-bgV63x7Y";
	
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("APA91bHwe5H3Ihl-fKWIdXjq-xS76NLAOqpyt3IViUHVflyONw_xsfzbL69pRV_0FMEVVgCjKMEMLLDjOs4GTqR9t83ckzmG6nQDtjl4ZMFzNrFwar5GPue-J9vyNRjBdasLJEFo9AVZ");
		list.add("APA91bHkqE9t5TwC3jusIKihNorDwzqlxidIndzE3WqkN7VwY2YOMclWt89AuO6sEtvlWhU6zQ8ktD6igatUru93i_KmVzbfDa4MzgrXwiVI-Hdn4aVPRgdTyvJLNq_JQPb-bgV63x7Y");
		
		Sender sender = new Sender(apiKey);
		Message message = new Message.Builder().addData("看看是否能接收到消息", "呵呵").build();
		//Result result = null;
		MulticastResult resultMulti = null;
		try {
			
			
			//result = sender.send(message, deviceRegId, 5);
			//public MulticastResult send(Message message, List<String> regIds, int retries) throws IOException {
			resultMulti = sender.send(message, list, 5);
				
			System.out.println(resultMulti.getMulticastId());
			System.out.println(resultMulti.getRetryMulticastIds());
			System.out.println(resultMulti.getSuccess());
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

}

运行结果:

8307243719071538299
[]
0



    2.前辈的代码每次发送过来的信息都是系统默认的,所以肯定需要定制,修改服务端代码为:

package com.ives.server;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.google.android.gcm.server.Constants;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.MulticastResult;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;

public class Main {
	private static final String apiKey = "AIzaSyDIqNvArRmXFdpSnbvJU1u0lYyY63jrbzY";
	//private static String deviceRegId = "APA91bHwe5H3Ihl-fKWIdXjq-xS76NLAOqpyt3IViUHVflyONw_xsfzbL69pRV_0FMEVVgCjKMEMLLDjOs4GTqR9t83ckzmG6nQDtjl4ZMFzNrFwar5GPue-J9vyNRjBdasLJEFo9AVZ";
	private static String deviceRegId = "APA91bHkqE9t5TwC3jusIKihNorDwzqlxidIndzE3WqkN7VwY2YOMclWt89AuO6sEtvlWhU6zQ8ktD6igatUru93i_KmVzbfDa4MzgrXwiVI-Hdn4aVPRgdTyvJLNq_JQPb-bgV63x7Y";
	
	
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("APA91bHwe5H3Ihl-fKWIdXjq-xS76NLAOqpyt3IViUHVflyONw_xsfzbL69pRV_0FMEVVgCjKMEMLLDjOs4GTqR9t83ckzmG6nQDtjl4ZMFzNrFwar5GPue-J9vyNRjBdasLJEFo9AVZ");
		list.add("APA91bHkqE9t5TwC3jusIKihNorDwzqlxidIndzE3WqkN7VwY2YOMclWt89AuO6sEtvlWhU6zQ8ktD6igatUru93i_KmVzbfDa4MzgrXwiVI-Hdn4aVPRgdTyvJLNq_JQPb-bgV63x7Y");
		
		Sender sender = new Sender(apiKey);
		Message message = new Message.Builder().addData("message", "google").build();
		//Result result = null;
		MulticastResult resultMulti = null;
		try {
			
			
			//result = sender.send(message, deviceRegId, 5);
			//public MulticastResult send(Message message, List<String> regIds, int retries) throws IOException {
			resultMulti = sender.send(message, list, 5);
				
			System.out.println(resultMulti.getMulticastId());
			System.out.println(resultMulti.getCanonicalIds());
			System.out.println(resultMulti.getResults());
		} catch (IOException e) {
			e.printStackTrace();
		}
		//为空,则消息未发送给任何设备
				if (resultMulti.getResults() != null) {
					 int canonicalRegId = resultMulti.getCanonicalIds();
					 //用户注册了新的注册id,或者谷歌服务器刷新了注册id。
					 //用户注册了新id,旧的id会被保存一段时间。此时使用旧id发送消息,设备即使已使用新id,依然可以收到
					
					} else {
					
					}
		
	}

}

     在客户端GCMIntentService.java接收消息的类修改为,其实就是使用intent的bundle类来接收消息,如下代码:
@Override
	protected void onMessage(Context context, Intent intent) {
		Log.i(TAG, "Received message");
		Bundle bData = intent.getExtras();

		// 處理 bData 內含的訊息
		// 在本例中, 我的 server 端程式 gcm_send.php 傳來了 message, campaigndate, title,
		// description 四項資料
		String message = bData.getString("message");
		Log.i(TAG, "Received message");
		// String message = getString(R.string.gcm_message);
		displayMessage(context, message);
		// notifies user
		generateNotification(context, message);
	}


//==========================================分割线2016年5月18日10:28:31=====================================================

当后面想再加平板项目的谷歌gcm的时候,找建立project的网站花了好长时间,记录一下网站,主要是搜谷歌开发者后台:https://play.google.com/apps/publish/?hl=zh&dev_acc=14503070423488587985#ServicesAndApisPlace:p=tmp.14503070423488587985.1446424805266




  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值