import android.app.Activity;
import android.content.res.Resources;
import android.os.Bundle;
CustomActivity.Java
*
* 推送通知时,自定义打开行为的演示activity。 请在控制台通知推送界面中,高级设置->通知后续行为->自定义打开行为,选中并且填写内容:
* intent:#Intent;component=com.baidu.push.example/com.baidu.push.example.
* CustomActivity;end 确认推送后,手机将会收到通知,点击通知后,将打开CustomActivity
*
* 用服务端rest api或者sdk推送的朋友,可以通过设置推送方法的open_type和pkg_content参数来实现。具体见api文档
* 参考:http:
* //developer.baidu.com/wiki/index.php?title=docs/cplat/push/faq#.E4.B8.
* BA.E4.BD.95.E9.80.9A.E8.BF.87Server_SDK.E6
* .8E.A8.E9.80.81.E6.88.90.E5.8A.9F.EF.BC.8CAndroid.E7.AB.AF.E5.8D.B4.E6.94.B6.E4.B8.8D.E5.88.B0.E9.80.9A.E7.9F.A5.EF.B
* C . 9 F
*/
public class CustomActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Resources resource = this.getResources();
String pkgName = this.getPackageName();
setContentView(resource.getIdentifier("custom_activity", "layout",
pkgName));
}
}
=======================================================================
LoginActivity.java
package com.baidu.push.example;
import Android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.net.http.SslError;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.SslErrorHandler;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
/**
* 登录百度账号初始化Channel的Activity
*/
public class LoginActivity extends Activity {
/** log tag. */
private static final String TAG = LoginActivity.class.getSimpleName();
private WebView mWebView;
/** redirect uri 值为"oob" */
private static final String REDIRECT = "oob";
/** 开发中心 */
static final String DEV_CENTER = "https://openapi.baidu.com/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWebView = new WebView(LoginActivity.this);
setContentView(mWebView);
initWebView(mWebView);
getAccessToken();
}
/**
* 获取 access token的url
*/
private void getAccessToken() {
String url = DEV_CENTER + "oauth/2.0/authorize?"
+ "response_type=token" + "&client_id="
+ Utils.getMetaValue(LoginActivity.this, "api_key")
+ "&redirect_uri=" + REDIRECT + "&display=mobile";
Log.d(TAG, "GetAccessTokenUrl: " + url);
mWebView.loadUrl(url);
}
/**
* 设置Webview的WebviewClient
*
* @param webview
* webview
*/
private void initWebView(WebView webview) {
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
webview.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view,
SslErrorHandler handler, SslError error) {
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
if (url.startsWith(REDIRECT) || url.contains("login_success")) {
// change # -> ?
int fragmentIndex = url.indexOf("#");
url = "http://localhost/?"
+ url.substring(fragmentIndex + 1);
// 从URL中获得Access token
String accessToken = Uri.parse(url).getQueryParameter(
"access_token");
Log.d(TAG, ">>> Get Original AccessToken: \r\n"
+ accessToken);
Toast.makeText(LoginActivity.this,
"get access token success", Toast.LENGTH_SHORT)
.show();
// ͨ登录
Intent intent = new Intent(Utils.ACTION_LOGIN);
intent.setClass(LoginActivity.this, PushDemoActivity.class);
intent.putExtra(Utils.EXTRA_ACCESS_TOKEN, accessToken);
startActivity(intent);
finish();
}
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (goBack()) {
return true;
}
}
return super.onKeyDown(keyCode, event);
}
private boolean goBack() {
WebView webView = mWebView;
if (webView != null && webView.canGoBack()) {
webView.goBack();
return true;
}
return false;
}
}
=======================================================================
MyPushMessageReceiver
package com.baidu.push.example;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import com.baidu.android.pushservice.PushMessageReceiver;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;
/*
* Push消息处理receiver。请编写您需要的回调函数, 一般来说: onBind是必须的,用来处理startWork返回值;
*onMessage用来接收透传消息; onSetTags、onDelTags、onListTags是tag相关操作的回调;
*onNotificationClicked在通知被点击时回调; onUnbind是stopWork接口的返回值回调
* 返回值中的errorCode,解释如下:
*0 - Success
*10001 - Network Problem
*10101 Integrate Check Error
*30600 - Internal Server Error
*30601 - Method Not Allowed
*30602 - Request Params Not Valid
*30603 - Authentication Failed
*30604 - Quota Use Up Payment Required
*30605 -Data Required Not Found
*30606 - Request Time Expires Timeout
*30607 - Channel Token Timeout
*30608 - Bind Relation Not Found
*30609 - Bind Number Too Many
* 当您遇到以上返回错误时,如果解释不了您的问题,请用同一请求的返回值requestId和errorCode联系我们追查问题。
*
*/
public class MyPushMessageReceiver extends PushMessageReceiver {
/** TAG to Log */
public static final String TAG = MyPushMessageReceiver.class
.getSimpleName();
/**
* 调用PushManager.startWork后,sdk将对push
* server发起绑定请求,这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送,需要把这里获取的channel
* id和user id上传到应用server中,再调用server接口用channel id和user id给单个手机或者用户推送。
*
* @param context
* BroadcastReceiver的执行Context
* @param errorCode
* 绑定接口返回值,0 - 成功
* @param appid
* 应用id。errorCode非0时为null
* @param userId
* 应用user id。errorCode非0时为null
* @param channelId
* 应用channel id。errorCode非0时为null
* @param requestId
* 向服务端发起的请求id。在追查问题时有用;
* @return none
*/
@Override
public void onBind(Context context, int errorCode, String appid,
String userId, String channelId, String requestId) {
String responseString = "onBind errorCode=" + errorCode + " appid="
+ appid + " userId=" + userId + " channelId=" + channelId
+ " requestId=" + requestId;
Log.d(TAG, responseString);
if (errorCode == 0) {
// 绑定成功
Log.d(TAG, "绑定成功");
}
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
updateContent(context, responseString);
}
/**
* 接收透传消息的函数。
*
* @param context
* 上下文
* @param message
* 推送的消息
* @param customContentString
* 自定义内容,为空或者json字符串
*/
@Override
public void onMessage(Context context, String message,
String customContentString) {
String messageString = "透传消息 onMessage=\"" + message
+ "\" customContentString=" + customContentString;
Log.d(TAG, messageString);
// 自定义内容获取方式,mykey和myvalue对应透传消息推送时自定义内容中设置的键和值
if (!TextUtils.isEmpty(customContentString)) {
JSONObject customJson = null;
try {
customJson = new JSONObject(customContentString);
String myvalue = null;
if (!customJson.isNull("mykey")) {
myvalue = customJson.getString("mykey");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
updateContent(context, messageString);
}
/**
* 接收通知到达的函数。
*
* @param context
* 上下文
* @param title
* 推送的通知的标题
* @param description
* 推送的通知的描述
* @param customContentString
* 自定义内容,为空或者json字符串
*/
@Override
public void onNotificationArrived(Context context, String title,
String description, String customContentString) {
String notifyString = "通知到达 onNotificationArrived title=\"" + title
+ "\" description=\"" + description + "\" customContent="
+ customContentString;
Log.d(TAG, notifyString);
// 自定义内容获取方式,mykey和myvalue对应通知推送时自定义内容中设置的键和值
if (!TextUtils.isEmpty(customContentString)) {
JSONObject customJson = null;
try {
customJson = new JSONObject(customContentString);
String myvalue = null;
if (!customJson.isNull("mykey")) {
myvalue = customJson.getString("mykey");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
// 你可以參考 onNotificationClicked中的提示从自定义内容获取具体值
updateContent(context, notifyString);
}
/**
* 接收通知点击的函数。
*
* @param context
* 上下文
* @param title
* 推送的通知的标题
* @param description
* 推送的通知的描述
* @param customContentString
* 自定义内容,为空或者json字符串
*/
@Override
public void onNotificationClicked(Context context, String title,
String description, String customContentString) {
String notifyString = "通知点击 onNotificationClicked title=\"" + title + "\" description=\""
+ description + "\" customContent=" + customContentString;
Log.d(TAG, notifyString);
// 自定义内容获取方式,mykey和myvalue对应通知推送时自定义内容中设置的键和值
if (!TextUtils.isEmpty(customContentString)) {
JSONObject customJson = null;
try {
customJson = new JSONObject(customContentString);
String myvalue = null;
if (!customJson.isNull("mykey")) {
myvalue = customJson.getString("mykey");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
updateContent(context, notifyString);
}
/**
* setTags() 的回调函数。
*
* @param context
* 上下文
* @param errorCode
* 错误码。0表示某些tag已经设置成功;非0表示所有tag的设置均失败。
* @param successTags
* 设置成功的tag
* @param failTags
* 设置失败的tag
* @param requestId
* 分配给对云推送的请求的id
*/
@Override
public void onSetTags(Context context, int errorCode,
List<String> sucessTags, List<String> failTags, String requestId) {
String responseString = "onSetTags errorCode=" + errorCode
+ " sucessTags=" + sucessTags + " failTags=" + failTags
+ " requestId=" + requestId;
Log.d(TAG, responseString);
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
updateContent(context, responseString);
}
/**
* delTags() 的回调函数。
*
* @param context
* 上下文
* @param errorCode
* 错误码。0表示某些tag已经删除成功;非0表示所有tag均删除失败。
* @param successTags
* 成功删除的tag
* @param failTags
* 删除失败的tag
* @param requestId
* 分配给对云推送的请求的id
*/
@Override
public void onDelTags(Context context, int errorCode,
List<String> sucessTags, List<String> failTags, String requestId) {
String responseString = "onDelTags errorCode=" + errorCode
+ " sucessTags=" + sucessTags + " failTags=" + failTags
+ " requestId=" + requestId;
Log.d(TAG, responseString);
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
updateContent(context, responseString);
}
/**
* listTags() 的回调函数。
*
* @param context
* 上下文
* @param errorCode
* 错误码。0表示列举tag成功;非0表示失败。
* @param tags
* 当前应用设置的所有tag。
* @param requestId
* 分配给对云推送的请求的id
*/
@Override
public void onListTags(Context context, int errorCode, List<String> tags,
String requestId) {
String responseString = "onListTags errorCode=" + errorCode + " tags="
+ tags;
Log.d(TAG, responseString);
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
updateContent(context, responseString);
}
/**
* PushManager.stopWork() 的回调函数。
*
* @param context
* 上下文
* @param errorCode
* 错误码。0表示从云推送解绑定成功;非0表示失败。
* @param requestId
* 分配给对云推送的请求的id
*/
@Override
public void onUnbind(Context context, int errorCode, String requestId) {
String responseString = "onUnbind errorCode=" + errorCode
+ " requestId = " + requestId;
Log.d(TAG, responseString);
if (errorCode == 0) {
// 解绑定成功
Log.d(TAG, "解绑成功");
}
// Demo更新界面展示代码,应用请在这里加入自己的处理逻辑
updateContent(context, responseString);
}
private void updateContent(Context context, String content) {
Log.d(TAG, "updateContent");
String logText = "" + Utils.logStringCache;
if (!logText.equals("")) {
logText += "\n";
}
SimpleDateFormat sDateFormat = new SimpleDateFormat("HH-mm-ss");
logText += sDateFormat.format(new Date()) + ": ";
logText += content;
Utils.logStringCache = logText;
Intent intent = new Intent();
intent.setClass(context.getApplicationContext(), PushDemoActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(intent);
}
}
===============================================================================================
云推送Demo主Activity。
PushDemoActivity.java
package com.baidu.push.example;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Notification;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Audio;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import com.baidu.android.pushservice.CustomPushNotificationBuilder;
import com.baidu.android.pushservice.PushConstants;
import com.baidu.android.pushservice.PushManager;
/*
* 云推送Demo主Activity。
* 代码中,注释以Push标注开头的,表示接下来的代码块是Push接口调用示例
*/
public class PushDemoActivity extends Activity implements View.OnClickListener {
private static final String TAG = PushDemoActivity.class.getSimpleName();
RelativeLayout mainLayout = null;
int akBtnId = 0;
int initBtnId = 0;
int richBtnId = 0;
int setTagBtnId = 0;
int delTagBtnId = 0;
int clearLogBtnId = 0;
int showTagBtnId = 0;
int unbindBtnId = 0;
int setunDisturbBtnId = 0;
Button initButton = null;
Button initWithApiKey = null;
Button displayRichMedia = null;
Button setTags = null;
Button delTags = null;
Button clearLog = null;
Button showTags = null;
Button unbind = null;
Button setunDisturb = null;
TextView logText = null;
ScrollView scrollView = null;
public static int initialCnt = 0;
private boolean isLogin = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// checkApikey();
Utils.logStringCache = Utils.getLogText(getApplicationContext());
Resources resource = this.getResources();
String pkgName = this.getPackageName();
setContentView(resource.getIdentifier("main", "layout", pkgName));
akBtnId = resource.getIdentifier("btn_initAK", "id", pkgName);
initBtnId = resource.getIdentifier("btn_init", "id", pkgName);
richBtnId = resource.getIdentifier("btn_rich", "id", pkgName);
setTagBtnId = resource.getIdentifier("btn_setTags", "id", pkgName);
delTagBtnId = resource.getIdentifier("btn_delTags", "id", pkgName);
clearLogBtnId = resource.getIdentifier("btn_clear_log", "id", pkgName);
showTagBtnId = resource.getIdentifier("btn_showTags", "id", pkgName);
unbindBtnId = resource.getIdentifier("btn_unbindTags", "id", pkgName);
setunDisturbBtnId = resource.getIdentifier("btn_setunDisturb", "id",
pkgName);
initWithApiKey = (Button) findViewById(akBtnId);
initButton = (Button) findViewById(initBtnId);
displayRichMedia = (Button) findViewById(richBtnId);
setTags = (Button) findViewById(setTagBtnId);
delTags = (Button) findViewById(delTagBtnId);
clearLog = (Button) findViewById(clearLogBtnId);
showTags = (Button) findViewById(showTagBtnId);
unbind = (Button) findViewById(unbindBtnId);
setunDisturb = (Button) findViewById(setunDisturbBtnId);
logText = (TextView) findViewById(resource.getIdentifier("text_log",
"id", pkgName));
scrollView = (ScrollView) findViewById(resource.getIdentifier(
"stroll_text", "id", pkgName));
initWithApiKey.setOnClickListener(this);
initButton.setOnClickListener(this);
setTags.setOnClickListener(this);
delTags.setOnClickListener(this);
displayRichMedia.setOnClickListener(this);
clearLog.setOnClickListener(this);
showTags.setOnClickListener(this);
unbind.setOnClickListener(this);
setunDisturb.setOnClickListener(this);
// Push: 以apikey的方式登录,一般放在主Activity的onCreate中。
// 这里把apikey存放于manifest文件中,只是一种存放方式,
// 您可以用自定义常量等其它方式实现,来替换参数中的Utils.getMetaValue(PushDemoActivity.this,
// "api_key")
// !! 请将AndroidManifest.xml 122行 api_key 字段值修改为自己的 api_key 方可使用 !!
// !! ATTENTION:You need to modify the value of api_key to your own at row 122 in AndroidManifest.xml to use this Demo !!
//
PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY,
Utils.getMetaValue(PushDemoActivity.this, "api_key"));
// Push: 如果想基于地理位置推送,可以打开支持地理位置的推送的开关
// PushManager.enableLbs(getApplicationContext());
// Push: 设置自定义的通知样式,具体API介绍见用户手册,如果想使用系统默认的可以不加这段代码
// 请在通知推送界面中,高级设置->通知栏样式->自定义样式,选中并且填写值:1,
// 与下方代码中 PushManager.setNotificationBuilder(this, 1, cBuilder)中的第二个参数对应
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_VIBRATE);
cBuilder.setStatusbarIcon(this.getApplicationInfo().icon);
cBuilder.setLayoutDrawable(resource.getIdentifier(
"simple_notification_icon", "drawable", pkgName));
cBuilder.setNotificationSound(Uri.withAppendedPath(
Audio.Media.INTERNAL_CONTENT_URI, "6").toString());
// 推送高级设置,通知栏样式设置为下面的ID
PushManager.setNotificationBuilder(this, 1, cBuilder);
}
@Override
public void onClick(View v) {
if (v.getId() == akBtnId) {
initWithApiKey();
} else if (v.getId() == initBtnId) {
initWithBaiduAccount();
} else if (v.getId() == richBtnId) {
openRichMediaList();
} else if (v.getId() == setTagBtnId) {
setTags();
} else if (v.getId() == delTagBtnId) {
deleteTags();
} else if (v.getId() == clearLogBtnId) {
Utils.logStringCache = "";
Utils.setLogText(getApplicationContext(), Utils.logStringCache);
updateDisplay();
} else if (v.getId() == showTagBtnId) {
showTags();
} else if (v.getId() == unbindBtnId) {
unBindForApp();
} else if (v.getId() == setunDisturbBtnId) {
setunDistur();
}
}
// 打开富媒体列表界面
private void openRichMediaList() {
// Push: 打开富媒体消息列表
Intent sendIntent = new Intent();
sendIntent.setClassName(getBaseContext(),
"com.baidu.android.pushservice.richmedia.MediaListActivity");
sendIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PushDemoActivity.this.startActivity(sendIntent);
}
// 删除tag操作
private void deleteTags() {
LinearLayout layout = new LinearLayout(PushDemoActivity.this);
layout.setOrientation(LinearLayout.VERTICAL);
final EditText textviewGid = new EditText(PushDemoActivity.this);
textviewGid.setHint("请输入多个标签,以英文逗号隔开");
layout.addView(textviewGid);
AlertDialog.Builder builder = new AlertDialog.Builder(
PushDemoActivity.this);
builder.setView(layout);
builder.setPositiveButton("删除标签",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Push: 删除tag调用方式
List<String> tags = Utils.getTagsList(textviewGid
.getText().toString());
PushManager.delTags(getApplicationContext(), tags);
}
});
builder.show();
}
// 设置标签,以英文逗号隔开
private void setTags() {
LinearLayout layout = new LinearLayout(PushDemoActivity.this);
layout.setOrientation(LinearLayout.VERTICAL);
final EditText textviewGid = new EditText(PushDemoActivity.this);
textviewGid.setHint("请输入多个标签,以英文逗号隔开");
layout.addView(textviewGid);
AlertDialog.Builder builder = new AlertDialog.Builder(
PushDemoActivity.this);
builder.setView(layout);
builder.setPositiveButton("设置标签",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Push: 设置tag调用方式
List<String> tags = Utils.getTagsList(textviewGid
.getText().toString());
PushManager.setTags(getApplicationContext(), tags);
}
});
builder.show();
}
// 以apikey的方式绑定
private void initWithApiKey() {
// Push: 无账号初始化,用api key绑定
// checkApikey();
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_API_KEY,
Utils.getMetaValue(PushDemoActivity.this, "api_key"));
}
// 以百度账号登陆,获取access token来绑定
private void initWithBaiduAccount() {
if (isLogin) {
// 已登录则清除Cookie, access token, 设置登录按钮
CookieSyncManager.createInstance(getApplicationContext());
CookieManager.getInstance().removeAllCookie();
CookieSyncManager.getInstance().sync();
isLogin = false;
// initButton.setText("百度账号绑定");
}
// 跳转到百度账号登录的activity
Intent intent = new Intent(PushDemoActivity.this, LoginActivity.class);
startActivity(intent);
}
// 解绑
private void unBindForApp() {
// Push: 解绑
PushManager.stopWork(getApplicationContext());
}
// 列举tag操作
private void showTags() {
PushManager.listTags(getApplicationContext());
}
// 设置免打扰时段
private void setunDistur() {
final AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.show();
Window window = alertDialog.getWindow();
window.setContentView(R.layout.bpush_setundistur_time);
final TimePicker startPicker = (TimePicker) window
.findViewById(R.id.start_time_picker);
final TimePicker endPicker = (TimePicker) window
.findViewById(R.id.end_time_picker);
startPicker.setIs24HourView(true);
endPicker.setIs24HourView(true);
startPicker
.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
endPicker
.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
Button set = (Button) window.findViewById(R.id.btn_set);
set.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int startHour = startPicker.getCurrentHour();
int startMinute = startPicker.getCurrentMinute();
int endHour = endPicker.getCurrentHour();
int endMinute = endPicker.getCurrentMinute();
if (startHour == 0 && startMinute == 0 && endHour == 0
&& endMinute == 0) {
Toast.makeText(getApplicationContext(), "已取消 免打扰时段功能",
Toast.LENGTH_SHORT).show();
} else if (startHour > endHour
|| (startHour == endHour && startMinute > endMinute)) {
setToastText("第一天的" + startHour + ":" + startMinute, "第二天的"
+ endHour + ":" + endMinute);
} else {
setToastText(startHour + ":" + startMinute, endHour + ":"
+ endMinute);
}
// Push: 设置免打扰时段
// startHour startMinute:开始 时间 ,24小时制,取值范围 0~23 0~59
// endHour endMinute:结束 时间 ,24小时制,取值范围 0~23 0~59
PushManager.setNoDisturbMode(getApplicationContext(),
startHour, startMinute, endHour, endMinute);
alertDialog.cancel();
}
});
Button guide = (Button) window.findViewById(R.id.btn_guide);
guide.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String str =
"设置免打扰时段,在免打扰时段内,当用户收到通知时,会去除通知的提示音、"
+ "振动以及提示灯闪烁.\n\n注意事项:\n1.如果开始时间小于结束时间,"
+ "免打扰时段为当天的起始时间到结束时间.\n2.如果开始时间大于结束时间,"
+ "免打扰时段为第一天起始时间到第二天结束时间.\n3.如果开始时间和结束时间"
+ "的设置均为00:00时,取消免打扰时段功能.\n";
new AlertDialog.Builder(PushDemoActivity.this)
.setTitle("免打扰时段功能使用说明").setMessage(str)
.setPositiveButton("确定", null).show();
}
});
Button cancel = (Button) window.findViewById(R.id.btn_cancel);
cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
alertDialog.cancel();
}
});
}
private void setToastText(String start, String end) {
String text = getString(R.string.text_toast, start, end);
Log.i("tangshi", text);
int indexTotal = 13 + start.length();
int indexPosition = indexTotal + 3 + end.length();
SpannableString s = new SpannableString(text);
s.setSpan(
new ForegroundColorSpan(getResources().getColor(R.color.red)),
13, indexTotal, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
s.setSpan(
new ForegroundColorSpan(getResources().getColor(R.color.red)),
indexTotal + 3, indexPosition,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
Toast.makeText(getApplicationContext(), s, Toast.LENGTH_LONG).show();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(Menu.NONE, Menu.FIRST + 1, 1, "关于").setIcon(
android.R.drawable.ic_menu_info_details);
menu.add(Menu.NONE, Menu.FIRST + 2, 2, "帮助").setIcon(
android.R.drawable.ic_menu_help);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (Menu.FIRST + 1 == item.getItemId()) {
showAbout();
return true;
}
if (Menu.FIRST + 2 == item.getItemId()) {
showHelp();
return true;
}
return false;
}
@Override
public void onOptionsMenuClosed(Menu menu) {
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
return true;
}
// 关于
private void showAbout() {
Dialog alertDialog = new AlertDialog.Builder(PushDemoActivity.this)
.setTitle("关于").setMessage(R.string.text_about)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Log.i(TAG, "onclick...");
}
}).create();
alertDialog.show();
}
// 帮助
private void showHelp() {
Dialog alertDialog = new AlertDialog.Builder(PushDemoActivity.this)
.setTitle("帮助").setMessage(R.string.text_help)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
Log.i(TAG, "onclick...");
}
}).create();
alertDialog.show();
}
@Override
public void onStart() {
super.onStart();
}
@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume");
updateDisplay();
}
@Override
protected void onNewIntent(Intent intent) {
String action = intent.getAction();
if (Utils.ACTION_LOGIN.equals(action)) {
// Push: 百度账号初始化,用access token绑定
String accessToken = intent
.getStringExtra(Utils.EXTRA_ACCESS_TOKEN);
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_ACCESS_TOKEN, accessToken);
isLogin = true;
initButton.setText("更换百度账号");
}
updateDisplay();
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onDestroy() {
Utils.setLogText(getApplicationContext(), Utils.logStringCache);
super.onDestroy();
}
// 更新界面显示内容
private void updateDisplay() {
Log.d(TAG, "updateDisplay, logText:" + logText + " cache: "
+ Utils.logStringCache);
if (logText != null) {
logText.setText(Utils.logStringCache);
}
if (scrollView != null) {
scrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
}
}
=======================================================================
Utils.java
package com.baidu.push.example;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
public class Utils {
public static final String TAG = "PushDemoActivity";
public static final String RESPONSE_METHOD = "method";
public static final String RESPONSE_CONTENT = "content";
public static final String RESPONSE_ERRCODE = "errcode";
protected static final String ACTION_LOGIN = "com.baidu.pushdemo.action.LOGIN";
public static final String ACTION_MESSAGE = "com.baiud.pushdemo.action.MESSAGE";
public static final String ACTION_RESPONSE = "bccsclient.action.RESPONSE";
public static final String ACTION_SHOW_MESSAGE = "bccsclient.action.SHOW_MESSAGE";
protected static final String EXTRA_ACCESS_TOKEN = "access_token";
public static final String EXTRA_MESSAGE = "message";
public static String logStringCache = "";
// 获取ApiKey
public static String getMetaValue(Context context, String metaKey) {
Bundle metaData = null;
String apiKey = null;
if (context == null || metaKey == null) {
return null;
}
try {
ApplicationInfo ai = context.getPackageManager()
.getApplicationInfo(context.getPackageName(),
PackageManager.GET_META_DATA);
if (null != ai) {
metaData = ai.metaData;
}
if (null != metaData) {
apiKey = metaData.getString(metaKey);
}
} catch (NameNotFoundException e) {
Log.e(TAG, "error " + e.getMessage());
}
return apiKey;
}
public static List<String> getTagsList(String originalText) {
if (originalText == null || originalText.equals("")) {
return null;
}
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;
}
public static String getLogText(Context context) {
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(context);
return sp.getString("log_text", "");
}
public static void setLogText(Context context, String text) {
SharedPreferences sp = PreferenceManager
.getDefaultSharedPreferences(context);
Editor editor = sp.edit();
editor.putString("log_text", text);
editor.commit();
}
}
====================================================================================
权限
<!-- Push service 运行需要的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<!-- 富媒体需要声明的权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
注册
<activity
android:name="com.baidu.push.example.LoginActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/login" >
</activity>
<activity
android:name="com.baidu.push.example.CustomActivity"
android:configChanges="orientation|keyboardHidden"
android:launchMode="singleTask" >
</activity>
<!-- push富媒体,使用富媒体推送必须声明 -->
<activity
android:name="com.baidu.android.pushservice.richmedia.MediaViewActivity"
android:configChanges="orientation|keyboardHidden"
android:label="MediaViewActivity" >
</activity>
<activity
android:name="com.baidu.android.pushservice.richmedia.MediaListActivity"
android:configChanges="orientation|keyboardHidden"
android:label="MediaListActivity"
android:launchMode="singleTask" >
</activity>
<!-- push富媒体结束 -->
<!-- push应用定义消息receiver声明 -->
<receiver android:name="com.baidu.push.example.MyPushMessageReceiver" >
<intent-filter>
<!-- 接收push消息 -->
<action android:name="com.baidu.android.pushservice.action.MESSAGE" />
<!-- 接收bind,unbind,fetch,delete等反馈消息 -->
<action android:name="com.baidu.android.pushservice.action.RECEIVE" />
<action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
</intent-filter>
</receiver>
<!-- push必须的receviver和service声明 -->
<receiver
android:name="com.baidu.android.pushservice.PushServiceReceiver"
android:process=":bdservice_v1" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
<action android:name="com.baidu.android.pushservice.action.media.CLICK" />
<!-- 以下四项为可选的action声明,可大大提高service存活率和消息到达速度 -->
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
<receiver
android:name="com.baidu.android.pushservice.RegistrationReceiver"
android:process=":bdservice_v1" >
<intent-filter>
<action android:name="com.baidu.android.pushservice.action.METHOD" />
<action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<service
android:name="com.baidu.android.pushservice.PushService"
android:exported="true"
android:process=":bdservice_v1" >
<intent-filter>
<action android:name="com.baidu.android.pushservice.action.PUSH_SERVICE" />
</intent-filter>
</service>
<service
android:name="com.baidu.android.pushservice.CommandService"
android:exported="true" />
<!-- 在百度开发者中心查询应用的API Key -->
<meta-data
android:name="api_key"
android:value="P0SpvL8e3IGFeQfCh9I5CfsP" />
==========颜色xml文件================
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="white">#ffffffff</color>
<color name="black">#ff000000</color>
<color name="blue">#ff75a6ff</color>
<color name="red">#E1423C</color>
<color name="translucence">#506050</color>
<color name="bg_gray">#e2e2e2</color>
<color name="green">#65e17b</color>
</resources>
=================String 字段=============================
<string name="login">登录</string>
<string name="text_btn_init">百度账号绑定</string>
<string name="text_btn_init1">更换百度账号</string>
<string name="text_btn_on_push">打开Push</string>
<string name="text_btn_off_push">关闭Push</string>
<string name="log_tip">日志:</string>
<string name="clear_log">清除日志</string>
<string name="text_btn_rich">富媒体消息</string>
<string name="text_btn_initAK">无账号绑定</string>
<string name="text_btn_setTags">设置标签</string>
<string name="text_btn_delTags">删除标签</string>
<string name="text_btn_senior">高级功能</string>
<string name="text_btn_set">设置</string>
<string name="text_media_title">富媒体消息列表</string>
<string name="media">Rich Media</string>
<string name="custom_text_hint">用户自定义行为打开的Activity</string>
<string name="tags_hint">请输入多个标签,以英文逗号隔开</string>
<string name="text_btn_aidl">轻应用AIDL</string>
<string name="text_btn_off_lightapp">关闭所有轻消息</string>
<string name="text_btn_off_app_msg">加入黑名单</string>
<string name="text_btn_unread_only_msg">只获取未读消息</string>
<string name="text_btn_on_shortcut">生成快捷图标</string>
<string name="app_name">PushDemo</string>
<string name="text_btn_showTags">列举标签</string>
<string name="text_btn_unbind">解绑</string>
<string name="text_btn_setunDisturb">免打扰时段</string>
<string name="text_toast">设置成功,免打扰时段为:\n%1$s - %2$s</string>
<string name="text_about">百度Push Android SDK 4.6.3\n\n更新时间:2016年5月11日\nChange Log:\n修复低端机器上WebView加载时可能的安全隐患。\n修复特殊场景下Push无法后台自启动的bug。\n暂停PushKeepAlive机制,防止小米部分机器上异常情况下的焦点丢失。</string>
<string name="text_help">百度hi官方技术讨论群:1405944\nQQ群:324533810(可加)\n云推送微信公众账号:云推送(微信号:baidu-push)\n</string>
============================xml布局============================