我有一个管理第三方服务器列表的应用程序,可以轮询它们以获取信息.这些服务器应该彼此独立(并且可能不在我的控制之下).
现在我想实现c2dm通知以避免持续的主动轮询.第三方服务器将能够发布他们的senderId并允许我的客户在向registrationId谷歌注册后向他们发送C2DM .
现在我的问题是:是否可以从同一个应用程序包中注册多个c2dm发件人?如果是这样,我如何区分注册(尤其是注销)进程,以便我可以更新正确的本地服务器配置条目?
我找到的唯一资源是这个google群组线程,但它暂时没有回答.我希望你能提供帮助.
注意:这只是关于注册.发送消息时,第三方服务器可以注入其服务器名称,因此消息处理程序可以区分它们.但谷歌服务器的注册过程似乎没有给我一个选择将用户定义的信息传递给我的BroadcastReceiver
我使用安装在虚拟盒中的Android-x86并与adb通信来调试我的android应用程序.我知道,由于它是一个开源项目,因此无法使用谷歌API库.但我知道使用地图是可能的(有些人这样做了),你知道安装cd2m库以便能够在我的模拟器中测试推送吗?Thxs
我目前正在开发一个应用程序,它以一定的间隔从服务器中提取数据.我意识到这不是最有效的方式,因为它经常轮询服务器而不检索任何新数据.
解决方案是使用C2DM,我目前正在研究如何设置它.但是,大约7%的用户仍在使用Android 2.1,我不想将其从我的应用中排除.
我想我可以检查用户正在运行哪个版本的android,然后决定是使用C2DM还是轮询(在同一个apk中都有代码).但是,为了运行C2DM代码,我需要在清单中指定使用某些权限,而我担心有了这些权限,android 2.1用户将无法下载我的apk文件.
所以我的问题是,如果我认为2.1用户将无法下载具有C2DM权限的应用程序,以及如何解决此问题,我是否正确.我是否必须创建两个不同的apk文件并使用我对应用程序进行的每个(其他)更新单独更新它们不受旧版Android版本的限制?
谢谢你.
我已经使用google c2dm成功实现了android推送通知.我总是发送一个设备的发布请求,一个设备延迟1-2秒.因此,如果我有1000个设备,我的脚本将需要超过1000秒才能完成对所有设备的推送.
我想知道的是,我们可以将所有设备的发布请求发送到谷歌c2dm吗?如果可以,该怎么办?
我正在使用PHP脚本.
这是我将消息推送到设备的代码:
function sendMessageToPhone($authCode, $deviceRegistrationId, $msgType, $messageText, $infoType, $messageInfo) {
$headers = array('Authorization: GoogleLogin auth=' . $authCode);
$data = array(
'registration_id' => $deviceRegistrationId,
'collapse_key' => $msgType,
'data.message' => $messageText,
'data.type' => $infoType,
'data.data' => $messageInfo
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://android.apis.google.com/c2dm/send");
if ($headers)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
Run Code Online (Sandbox Code Playgroud)
如果我有更多设备,我会像这样循环:
while($row = mysql_fetch_assoc($result)) {
sendMessageToPhone($authCode, $row['deviceRegistrationId'], GOOGLE_MSG_TYPE, $messageText, …Run Code Online (Sandbox Code Playgroud) 我有一个C2DM基于应用程序,它工作正常,但最近我得到Auth Error
虽然我得到RID(注册ID)和消息正在发送.最近我读到客户端登录密钥即将到期(4月30日),may be因为我得到此错误.我的问题是如何重新生成Client Login Keys???? 如何重新生成AUTH TOKEN????? 任何帮助都会感激不尽....谢谢
我正在开发必须向设备发送消息的系统的服务器部分.这适用于GoogleLogin方法,但我想将其迁移到OAuth 2.0,因为其他身份验证方法已被弃用.
在Google API控制台中,我创建了一个项目,然后为服务帐户创建了一个密钥.
这是我用来验证服务器的代码:
public boolean authenticateServer(){
try {
File privateKey =
new File(getClass().getResource("/something-privatekey.p12").toURI());
GoogleCredential cred =
new GoogleCredential.Builder().setTransport(new NetHttpTransport())
.setJsonFactory(new JacksonFactory())
.setServiceAccountId("something@developer.gserviceaccount.com")
.setServiceAccountScopes("https://android.apis.google.com/c2dm")
.setServiceAccountPrivateKeyFromP12File(privateKey)
.addRefreshListener(this)
.build();
boolean success = cred.refreshToken();
this.credential = cred;
return success;
}
catch (Exception ex) {
//handle this
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
当我执行此,该方法onTokenResponse被调用,我得到一个access_token与token_type"载体",在3600秒到期.到现在为止还挺好.
这是我用来将消息发送到设备的代码,它始终给我401状态(未授权).有任何想法吗?
private static String UTF8 = "UTF-8";
public void sendMessage(String text, String registrationId) {
try {
StringBuilder postDataBuilder = new StringBuilder();
postDataBuilder
.append("registration_id")
.append("=")
.append(registrationId); …Run Code Online (Sandbox Code Playgroud) /**
* @author Sebastien Lorber <i>(lorber.sebastien@gmail.com)</i>
*/
public enum EnumDeviceType {
ANDROID {
@Override
public boolean validateDeviceIdentifier(String deviceIdentifier) {
Preconditions.checkArgument( !Strings.isNullOrEmpty(deviceIdentifier) );
return ANDROID_REGISTRATION_ID_PATTERN.matcher(deviceIdentifier).matches();
}
},
IOS {
@Override
public boolean validateDeviceIdentifier(String deviceIdentifier) {
Preconditions.checkArgument( !Strings.isNullOrEmpty(deviceIdentifier) );
return IOS_DEVICE_TOKEN_PATTERN.matcher(deviceIdentifier).matches();
}
},
;
// TODO how do we validate registration Ids
public static final Pattern ANDROID_REGISTRATION_ID_PATTERN = Pattern.compile(".*");
// IOS device token is a 64 HEX string
public static final Pattern IOS_DEVICE_TOKEN_PATTERN = Pattern.compile("[a-fA-F0-9]{64,64}");
public abstract boolean validateDeviceIdentifier(String deviceIdentifier);
public boolean …Run Code Online (Sandbox Code Playgroud) 我有一个完美的GCM通知实现.但是,问题是一旦在接收到的方法中意图收到消息,所显示的消息始终是旧消息.那就是'extras.getString("payload")'总是显示旧消息.我似乎无法弄清问题是什么.
发送GCM通知的类是:
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class C2DMMessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.w("C2DM", "Message Receiver called");
if ("com.google.android.c2dm.intent.RECEIVE".equals(action)) {
Log.w("C2DM", "Received message");
String payload = intent.getStringExtra("payload");
Log.d("C2DM", "dmControl: payload = " + payload);
// TODO Send this to my application server to get the real data
// Lets make something visible to show that we received the message …Run Code Online (Sandbox Code Playgroud) 我有GCM通知实施.我知道客户端应用程序会收到通知,无论它是处于前台,后台还是被杀死状态.我想知道的是,当应用程序处于被杀死状态时,如何在收到通知时启动我的应用程序?
如果可以,请帮帮我.我一直在尝试实现基本的gcm设置.在服务器端,我使用的是顶级答案的PHP代码 - 带有PHP的GCM(Google云消息传递) 在客户端,我已经关注了Google的GCM教程.整个过程在我的Nexus 4上工作正常,但它不适用于我尝试过的两个4.0.4之前的设备.一个是htc one v运行4.0.3,另一个是sony ericsson运行2.3.4.它可能是关于4.0.4之前设备的东西,但它们正在成功注册并正确地给我注册.他们只是不会收到任何消息,虽然gcm服务器正在接收它们并成功发回消息ID ..即使广播接收器也不会触发.如果您知道为什么会发生这种情况,请帮助我吗?这两种设备都注册了谷歌帐户.
这是我的清单文件.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.gole.firstgcm"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<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" />
<permission android:name="com.gole.firstgcm.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.gole.firstgcm.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.C2D_MESSAGE" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name="com.gole.firstgcm.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.gole.firstgcm.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" />
<action …Run Code Online (Sandbox Code Playgroud) android ×10
android-c2dm ×10
java ×2
android-x86 ×1
api ×1
auth-token ×1
oauth-2.0 ×1
permissions ×1
php ×1
version ×1