我遇到了一个奇怪的问题 - 我在我的应用程序中使用GCM已经有很长一段时间了,一切都运行得很好.然而,发布谷歌Play前,我从改变了我的应用程序包的名字com.android.testapp来com.android.recognition并在此之后GCM停止工作.起初我得到错误GCM sender id not set on constructor并通过覆盖修复它getSenderIds(Context context),但现在我无法获得注册ID.以下是来自logcat的消息:

我怎样才能解决这个问题?当我切换到新包时,我将清单文件中的所有内容更改为新包:
<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.android.recognition" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
那背后的问题是什么?可以重命名应用程序包导致这个还是有另一个原因?
我在大学的最后一年项目中使用谷歌云消息.一切正常,但我在使用GCM时遇到了一些麻烦.很多时候,消息要么几乎立即发送,要么延迟很长.
我已经读过这篇文章了,我认为它不适用于这种情况:
GCM通常会在发送后立即发送消息.但是,这可能并非总是可行.例如,设备可能已关闭,脱机或以其他方式不可用.在其他情况下,发送方本身可能会通过使用delay_while_idle标志请求在设备变为活动状态之前不传递消息.最后,GCM可能会故意延迟消息,以防止应用程序消耗过多的资源并对电池寿命产生负面影响.
在我的项目中,每分钟至少有5或6条来自服务器的消息.如果GCM可用于聊天应用程序,它们肯定无法阻止以此速率发送/接收的消息?它变得非常烦人,如果我的项目只在50%的时间内工作,那将非常糟糕...
这是我的服务器发送消息的代码:
@Override
public void run() {
Message.Builder messageBuilder = new Message.Builder().delayWhileIdle(false);
Gson gson = new Gson();
messageBuilder.addData("profile", gson.toJson(profile));
databaseConnection.notifyDevices(messageBuilder.build());
}
public void notifyDevices(Message message) {
Sender sender = new Sender(xxx);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("message", message.toString()));
//LOG
System.out.println("Notifying devices with the following message \n \"" +message+ "\"");
List<String> deviceIDsList = new ArrayList<String>();
String [] deviceIDArray;
//Get devices to notify
List<JSONDeviceProfile> deviceList = getDevicesToNotify();
for(JSONDeviceProfile device : deviceList) {
deviceIDsList.add(device.getDeviceId());
try {
sender.send(message, device.getDeviceId(), 5); …Run Code Online (Sandbox Code Playgroud)