看这个,最起码需要熟悉eclipse的操作。phonegap初级开发经验(包括插件的开发),
熟悉andriod的相关配置和简单的运行原理。穷人用不起ios,等适当的时候再去琢磨xcode的实现。不过baidupush是统一的方式。这个好说
开发语言需要java,js,xml
百度开发官方链接
http://developer.baidu.com/
注册和基本的操作
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/guide
客户端demo下载
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/clientsdk
需要注意的是:
AndroidManifest.xml
权限,对应的接受类和处理类的声明
appk的配置
<meta-data android:name="api_key" android:value="GpcU7jAxPdItPlfYwFnZSiDV" />
主类的运行模式为
android:launchMode=”singleTask”
因为接收和绑定的过程中。会通过调用来传递相关参数和激活应用。如果不进行设置,会造成死循环.特殊情况请自行处理
电脑编译出apk进行安装后,提示”Bind Success”后,在控制台那边简单发送个消息客户端会进行提示。
接下来是pg的集成.
创建 pg 测试项目 (自己解决…)
将push demo代码 相关文件进行复制。
整合配置文件到pg里。
主类的启动换成pg.
不过baidupush是不推荐将绑定的操作在启动过程实现的。不过我放到了
super.loadUrl("file:///android_asset/www/index.html");
因为只是完成绑定操作,可以通过多线程进行操作。
接下来是主类的代码
package org.apache.cordova.test.actions;
import java.util.ArrayList;
import java.util.List;
import org.apache.cordova.DroidGap;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Notification;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Resources;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.widget.TextView;
import android.widget.Toast;
import com.baidu.android.common.logging.Log;
import com.baidu.android.pushservice.CustomPushNotificationBuilder;
import com.baidu.android.pushservice.PushConstants;
import com.baidu.android.pushservice.PushManager;
import com.phonegap.plugin.baidupush.Utils;
public class test extends DroidGap {
public static int initialCnt = 0;
private boolean isLogin = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.init();
android.webkit.WebSettings settings = super.appView.getSettings();
// String appCachePath = this.getCacheDir().getAbsolutePath();
// settings.setAppCachePath(appCachePath);
// settings.setAllowFileAccess(true);
super.appView.addJavascriptInterface(new IGDMOBILE(this, appView),
"IGD_WH");
settings.setAppCacheEnabled(false);
super.loadUrl("file:///android_asset/www/index.html");
// baidu push start
Resources resource = this.getResources();
String pkgName = this.getPackageName();
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_API_KEY,
Utils.getMetaValue(test.this, "api_key"));
CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder(
resource.getIdentifier("notification_custom_builder", "layout",
pkgName), resource.getIdentifier("notification_icon",
"id", pkgName), resource.getIdentifier(
"notification_title", "id", pkgName),
resource.getIdentifier("notification_text", "id", pkgName));
cBuilder.setNotificationFlags(Notification.FLAG_AUTO_CANCEL);
cBuilder.setNotificationDefaults(Notification.DEFAULT_SOUND
| Notification.DEFAULT_VIBRATE);
cBuilder.setStatusbarIcon(this.getApplicationInfo().icon);
cBuilder.setLayoutDrawable(resource.getIdentifier(
"simple_notification_icon", "drawable", pkgName));
PushManager.setNotificationBuilder(this, 1, cBuilder);
// baidu push end
// Set by <content src="index.html" /> in config.xml
// super.loadUrl("http://192.168.1.114:8080/test/phonegap/");//Config.getStartUrl()
// super.setIntegerProperty("splashscreen", R.drawable.splash);
// super.loadUrl("file:///android_asset/www/index.html", 3000);
}
@Override
public void onStart() {
super.onStart();
Log.i("gddebug", "gddebug test.onStart:");
PushManager.activityStarted(this);
}
@Override
public void onResume() {
super.onResume();
showChannelIds();
}
@Override
protected void onNewIntent(Intent intent) {
// 如果要统计Push引起的用户使用应用情况,请实现本方法,且加上这一个语�?
super.onNewIntent(intent);
setIntent(intent);
handleIntent(intent);
}
@Override
public void onStop() {
super.onStop();
PushManager.activityStoped(this);
}
/**
* 处理Intent
*
* @param intent
* intent
*/
private void handleIntent(Intent intent) {
String action = intent.getAction();
if (Utils.ACTION_RESPONSE.equals(action)) {
String method = intent.getStringExtra(Utils.RESPONSE_METHOD);
if (PushConstants.METHOD_BIND.equals(method)) {
String toastStr = "";
int errorCode = intent.getIntExtra(Utils.RESPONSE_ERRCODE, 0);
if (errorCode == 0) {
String content = intent
.getStringExtra(Utils.RESPONSE_CONTENT);
String appid = "";
String channelid = "";
String userid = "";
try {
JSONObject jsonContent = new JSONObject(content);
JSONObject params = jsonContent
.getJSONObject("response_params");
appid = params.getString("appid");
channelid = params.getString("channel_id");
userid = params.getString("user_id");
} catch (JSONException e) {
Log.e(Utils.TAG, "Parse bind json infos error: " + e);
}
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(this);
Editor editor = sp.edit();
editor.putString("appid", appid);
editor.putString("channel_id", channelid);
editor.putString("user_id", userid);
editor.commit();
showChannelIds();
toastStr = "Bind Success";
} else {
toastStr = "Bind Fail, Error Code: " + errorCode;
if (errorCode == 30607) {
Log.d("Bind Fail", "update channel token-----!");
}
}
Toast.makeText(this, toastStr, Toast.LENGTH_LONG).show();
}
} else if (Utils.ACTION_LOGIN.equals(action)) {
String accessToken = intent
.getStringExtra(Utils.EXTRA_ACCESS_TOKEN);
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_ACCESS_TOKEN, accessToken);
isLogin = true;
// initButton.setText("更换百度账号初始化Channel");
} else if (Utils.ACTION_MESSAGE.equals(action)) {
String message = intent.getStringExtra(Utils.EXTRA_MESSAGE);
String summary = "Receive message from server:nt";
Log.e(Utils.TAG, summary + message);
JSONObject contentJson = null;
String contentStr = message;
try {
contentJson = new JSONObject(message);
contentStr = contentJson.toString(4);
} catch (JSONException e) {
Log.d(Utils.TAG, "Parse message json exception.");
}
summary += contentStr;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(summary);
builder.setCancelable(true);
Dialog dialog = builder.create();
dialog.setCanceledOnTouchOutside(true);
dialog.show();
} else {
Log.i(Utils.TAG, "Activity normally start!");
}
}
private void showChannelIds() {
String appId = null;
String channelId = null;
String clientId = null;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(this);
appId = sp.getString("appid", "");
channelId = sp.getString("channel_id", "");
clientId = sp.getString("user_id", "");
Resources resource = this.getResources();
String pkgName = this.getPackageName();
// infoText = (TextView) findViewById(resource.getIdentifier("text", "id", pkgName));
//
// String content = "tApp ID: " + appId + "ntChannel ID: " + channelId
// + "ntUser ID: " + clientId + "nt";
// if (infoText != null) {
// infoText.setText(content);
// infoText.invalidate();
// }
}
private List<String> getTagsList(String originalText) {
List<String> tags = new ArrayList<String>();
int indexOfComma = originalText.indexOf(',');
String tag;
while (indexOfComma != -1) {
tag = originalText.substring(0, indexOfComma);
tags.add(tag);
originalText = originalText.substring(indexOfComma + 1);
indexOfComma = originalText.indexOf(',');
}
tags.add(originalText);
return tags;
}
}
需要注意的是
PushMessageReceiver.java
清楚原控件的相关代码。
启动的时候完成绑定操作,然后再测试推送,ok,成功过。
关于绑定操作,这时候需要自己写插件啦。
代码如下
package com.phonegap.plugin.baidupush;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.apache.cordova.test.R;
import org.apache.cordova.test.actions.test;
import org.json.JSONArray;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;
import com.baidu.android.pushservice.PushConstants;
import com.baidu.android.pushservice.PushManager;
public class BaiduPush extends Plugin {
public static final String PLUGIN_NAME = "BaiduPush";
PendingIntent contentIntent;
@Override
public PluginResult execute(String action, JSONArray args, String callbackId) {
Log.d(PLUGIN_NAME, "Plugin execute called with action: " + action);
boolean result = false;
String appId = null;
String channelId = null;
String clientId = null;
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(this.cordova.getActivity().getApplicationContext());
appId = sp.getString("appid", "");
channelId = sp.getString("channel_id", "");
clientId = sp.getString("user_id", "");
//通过js将这几个值传出去与用户做绑定,漂亮代码我就不写了。可以参考别人的操作把代码写漂亮些。
Log.i("gddebug","gddebug com.phonegap.plugin.baidupush.BaiduPush execute:appId="+appId);
Log.i("gddebug","gddebug com.phonegap.plugin.baidupush.BaiduPush execute:channelId="+channelId);
Log.i("gddebug","gddebug com.phonegap.plugin.baidupush.BaiduPush execute:clientId="+clientId);
return new PluginResult(result ? PluginResult.Status.OK
: PluginResult.Status.ERROR);
}
}
服务器端的东西比较容易解决。这边以php为例.
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/serversdk
下载好后,自己看下吧。Oauth2.0的一般模式呵呵。
主要需要注意的。暂时有
推送消息的具体内容。
基础参数看
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/api/list#push_msg
关于messages的内容分析。。这是我最想骂人的地方。。
上代码:
// 通知类型的内容必须按指定内容发送,示例如下:
$message = json_encode ( array (
'title' => 'test_push2',
//对应的分组。这样应用里就可以分组进行推送了。yd.通过服务器端进行绑定就可以了。哈
'tag'=>'caihaibin',
'description' => 'openurl2',
//必须 为0,basic_style才有效
'notification_builder_id' => 0,
//这个需要强烈注意,文档根本没有说明
//具体的合并参数是 4 铃声 2震动 1可清除 分别累加
'notification_basic_style' => 7,
//这个启动当前应用
'open_type' => 2,
'custom_content' => array (
'type_code' => '1',
'type_content' => '7448969'
) )
好了,基本的东西就到这了。
偶然发现在faq里有简单的说明:唉。。
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/faq
搜索 notification_basic_style 相关
注:
1.有时会有延时。这个可以无视。毕竟处理方面在百度。反正误差估计就1分钟,还算合理。
2.测试分组和两app时的提示是否有冲突。暂时没有发现
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827