Android GCM 示例 - 如何在现有项目中实现?

Posted

技术标签:

【中文标题】Android GCM 示例 - 如何在现有项目中实现?【英文标题】:Android GCM example - how to implement in existing project? 【发布时间】:2015-09-06 07:36:08 【问题描述】:

我在 GitHub 上从 Google 下载了最新的 GCM 示例。

它运作良好,但我无法让它在我自己的项目中运作。 我得到了甜甜圈转动和消息“正在生成 InstanceID 令牌...”

我不明白他们示例中与 GcmSender 类的链接。

这是我的代码

公共类 MainActivity 扩展 ActionBarActivity 私有静态最终 int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 私有静态最终字符串 TAG = "MainActivity"; 私有广播接收器 mRegistrationBroadcastReceiver; 私有进度条 mRegistrationProgressBar; 私有TextView mInformationTextView; @覆盖 protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 网址 字符串 url="http://www.monurl.org/"; WebView mWview=(WebView) this.findViewById(R.id.webView); //自动提升javascript mWview.getSettings().setJavaScriptEnabled(true); mWview.loadUrl(url); //当事人通知 mRegistrationProgressBar = (ProgressBar) findViewById(R.id.registrationProgressBar); mRegistrationBroadcastReceiver = new BroadcastReceiver() @覆盖 公共无效 onReceive(上下文上下文,意图意图) mRegistrationProgressBar.setVisibility(ProgressBar.GONE); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); boolean sentToken = sharedPreferences .getBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false); 如果(发送令牌) mInformationTextView.setText(getString(R.string.gcm_send_message)); 别的 mInformationTextView.setText(getString(R.string.token_error_message)); ; mInformationTextView = (TextView) findViewById(R.id.informationTextView); // 检查 si Google Play Services APK est sur le phone if (checkPlayServices()) // 启动 IntentService 以向 GCM 注册此应用程序。 Intent intent = new Intent(this, MyGcmRegistrationIntentService.class); 启动服务(意图); @覆盖 公共布尔 onCreateOptionsMenu(菜单菜单) // 膨胀菜单;如果存在,这会将项目添加到操作栏。 getMenuInflater().inflate(R.menu.menu_main, menu); 返回真; @覆盖 public boolean onOptionsItemSelected(MenuItem item) // 处理操作栏项目点击这里。操作栏将 // 自动处理对 Home/Up 按钮的点击,这么久 // 当您在 androidManifest.xml 中指定父活动时。 int id = item.getItemId(); //无检查 SimplifiableIfStatement 如果(id == R.id.action_settings) 返回真; 返回 super.onOptionsItemSelected(item); /** * 检查设备以确保它具有 Google Play Services APK。如果 * 它没有,显示一个对话框,允许用户从以下位置下载 APK * Google Play 商店或在设备的系统设置中启用它。 */ 私人布尔 checkPlayServices() int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this); 如果(结果代码!= ConnectionResult.SUCCESS) if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) GooglePlayServicesUtil.getErrorDialog(resultCode, 这个, PLAY_SERVICES_RESOLUTION_REQUEST).show(); 别的 Log.i(TAG, "Ce peripherique n'est pas supporte."); 结束(); 返回假; 返回真; 公共类 MyGcmListenerService 扩展 GcmListenerService 私有静态最终字符串 TAG = "MyGcmListenerService"; 公共 MyGcmListenerService() /** * 收到消息时调用。 * * @param 来自发件人的 SenderID。 * @param data 包含消息数据作为键/值对的数据包。 * 对于键集使用 data.keySet()。 */ // [开始接收消息] @覆盖 公共无效onMessageReceived(字符串来自,捆绑数据) 字符串消息 = data.getString("消息"); Log.d(TAG, "发件人:" + 发件人); Log.d(TAG, "消息:" + 消息); /** * 生产应用程序通常会在此处处理消息。 * 例如: - 与服务器同步。 * - 在本地数据库中存储消息。 * - 更新用户界面。 */ /** * 在某些情况下,向用户显示通知可能会很有用 * 收到一条消息。 */ 发送通知(消息); // [结束接收消息] /** * 创建并显示包含收到的 GCM 消息的简单通知。 * * @param message 收到 GCM 消息。 */ 私人无效发送通知(字符串消息) Intent 意图 = new Intent(this, MainActivity.class); 意图.addFlags(意图.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* 请求代码 */, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_stat_ic_notification) .setContentTitle("GCM 消息") .setContentText(消息) .setAutoCancel(真) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); 通知管理器通知管理器 = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* 通知 ID */, notificationBuilder.build()); Log.v("通知消息",message); 公共类 MyGcmRegistrationIntentService 扩展 IntentService 私有静态最终字符串 TAG = "MyGcmRegistrationIntentService"; 私有静态最终字符串 [] 主题 = “全局”; /** * 启动此服务以使用给定的参数执行操作 Foo。如果 * 服务已经在执行一个任务,这个动作将被排队。 * * @see IntentService */ // TODO: 自定义辅助方法 公共静态无效startActionFoo(上下文上下文,字符串参数1,字符串参数2) Intent intent = new Intent(context, MyGcmRegistrationIntentService.class); 意图.setAction(ACTION_FOO); 意图.putExtra(EXTRA_PARAM1,param1); 意图.putExtra(EXTRA_PARAM2, param2); context.startService(intent); /** * 启动此服务以使用给定参数执行操作 Baz。如果 * 服务已经在执行一个任务,这个动作将被排队。 * * @see IntentService */ // TODO: 自定义辅助方法 公共静态无效 startActionBaz(上下文上下文,字符串参数 1,字符串参数 2) Intent intent = new Intent(context, MyGcmRegistrationIntentService.class); 意图.setAction(ACTION_BAZ); 意图.putExtra(EXTRA_PARAM1,param1); 意图.putExtra(EXTRA_PARAM2, param2); context.startService(intent); 公共 MyGcmRegistrationIntentService() // super("MyGcmRegistrationIntentService"); // 大约 超级(标签); //fin ajout @覆盖 受保护的无效onHandleIntent(意图意图) SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); 尝试 // 在多个刷新操作同时发生的(不太可能的)事件中, // 确保它们是按顺序处理的。 同步(标签) // [开始 register_for_gcm] // 最初,此调用会发送到网络以检索令牌,随后的调用 // 是本地的。 // [开始获取令牌] InstanceID instanceID = InstanceID.getInstance(this); 字符串令牌 = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE,空); // [END get_token] Log.i(TAG, "GCM 注册令牌:" + 令牌); // TODO: 实现此方法以将任何注册发送到您应用的服务器。 sendRegistrationToServer(令牌); // 订阅主题频道 订阅主题(令牌); // 您应该存储一个布尔值,指示生成的令牌是否已被 // 发送到您的服务器。如果布尔值为假,则将令牌发送到您的服务器, // 否则你的服务器应该已经收到了令牌。 sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, true).apply(); // [结束 register_for_gcm] 捕捉(异常 e) Log.d(TAG, "无法完成令牌刷新", e); // 如果在获取新令牌或更新我们的注册数据时发生异常 // 在第三方服务器上,这确保我们稍后会尝试更新。 sharedPreferences.edit().putBoolean(QuickstartPreferences.SENT_TOKEN_TO_SERVER, false).apply(); // 通知 UI 注册已完成,因此可以隐藏进度指示器。 Intent registrationComplete = new Intent(QuickstartPreferences.REGISTRATION_COMPLETE); LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete); /** * 使用提供的在提供的后台线程中处理动作 Foo * 参数。 */ 私人无效handleActionFoo(字符串参数1,字符串参数2) // TODO: 处理动作 Foo throw new UnsupportedOperationException("尚未实现"); /** * 使用提供的在提供的后台线程中处理动作 Baz * 参数。 */ 私人无效handleActionBaz(字符串参数1,字符串参数2) // TODO: 处理动作 Baz throw new UnsupportedOperationException("尚未实现"); 私人无效订阅主题(字符串令牌)抛出 IOException 对于(字符串主题:主题) GcmPubSub pubSub = GcmPubSub.getInstance(this); pubSub.subscribe(token, "/topics/" + topic, null); /** * 坚持注册到第三方服务器。 * * 修改此方法以将用户的 GCM 注册令牌与任何服务器端帐户关联 * 由您的应用程序维护。 * * @param token 新的令牌。 */ 私人无效 sendRegistrationToServer(字符串令牌) // 根据需要添加自定义实现。 私人无效sendTokenToServer(字符串令牌) 公共类 MyInstanceIDListenerService 扩展 InstanceIDListenerService 公共 MyInstanceIDListenerService() @覆盖 公共IBinder onBind(意图意图) // TODO: 将通信通道返回给服务。 throw new UnsupportedOperationException("尚未实现"); // 倾倒通知 @覆盖 公共无效 onTokenRefresh() // 获取更新的实例 ID 令牌并通知我们应用程序的服务器任何更改(如果适用)。 Intent intent = new Intent(this, MyGcmRegistrationIntentService.class); 启动服务(意图);

【问题讨论】:

您能否提供一些将示例集成到您的应用程序中的源代码? 【参考方案1】:

你好,我发现了发生了什么,我在 Main 中忘记了这个

@覆盖 受保护的无效 onResume() 超级.onResume(); LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, 新的 IntentFilter(QuickstartPreferences.REGISTRATION_COMPLETE)); @覆盖 受保护的无效 onPause() LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver); 超级.onPause();

【讨论】:

以上是关于Android GCM 示例 - 如何在现有项目中实现?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GCM 在 Android 中解析或实际获取推送消息

在支持 Android 2.2 的情况下,如何设置供 GCM 使用的 Android 项目?

是否可以将现有的 GCM senderId 和 API 密钥用于 GCM To APNS 推送通知?

如何在 Android + GCM 中获得带有声音 + 自定义应用程序图标的推送通知

在 Android Studio 中使用 GCM

如何分享两个Android应用程序的GCM服务?