powerbuilde 怎么做一个苹果按键power,将dw

403 Forbidden
Request forbidden by administrative rules./ AndroidPlatform
项目语言:JAVA
权限:read-only(如需更高权限请先加入项目)
AndroidPlatform/
Index: szboanda/ydzf/business/YdzfApplication.java
===================================================================
--- szboanda/ydzf/business/YdzfApplication.java (revision 0)
+++ szboanda/ydzf/business/YdzfApplication.java (revision 7)
@@ -0,0 +1,215 @@
+package com.szboanda.ydzf.
+import org.apkplug.Bundle.InstallB
+import org.apkplug.Bundle.installC
+import org.apkplug.app.FrameworkF
+import org.apkplug.app.FrameworkI
+import org.json.JSONO
+import org.osgi.framework.BundleC
+import com.baidu.mapapi.SDKI
+import com.szboanda.android.platform.db.DbH
+import com.szboanda.android.platform.util.AppInfoH
+import com.szboanda.ydzf.business.util.AssistB
+import com.szboanda.ydzf.business.xmpp.S
+import com.umeng.analytics.AnalyticsC
+import com.umeng.analytics.MobclickA
+import com.umeng.analytics.onlineconfig.UmengOnlineConfigureL
+import android.app.A
+import android.app.A
+import android.app.Application.ActivityLifecycleC
+import android.os.B
+import android.preference.PreferenceM
+import android.support.v4.app.FragmentA
+import android.text.TextU
+import android.util.L
+import android.view.WindowM
+public class YdzfApplication extends Application implements
ActivityLifecycleCallbacks {
+ private static final String TAG = &YdzfApplication.java&;
+ /** 移动执法系统默认数据库名称 */
+ public static final String APP_DEFAULT_DB_NAME = &ydzf.db&;
+ private String launcherActivity =
+ private Activity currentA
+ private FrameworkInstance frame =
+ @Override
+ public void onCreate() {
super.onCreate();
Log.i(TAG, &YdzfApplication on create!&);
registerActivityLifecycleCallbacks(this);// 注册Activity生命周期监听回调
String[] appInfo = AppInfoHelper.getAppInfo(this,
getString(R.string.app_name));
if (appInfo != null && appInfo.length & 1
&& !TextUtils.isEmpty(appInfo[1]))
launcherActivity = appInfo[1];// 获取应用启动activity
// 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext
SDKInitializer.initialize(this);
// 系统设置初始化上下文
SystemConfig.getInstance().initWithContext(this);
// 数据库初始化上下文和数据库名字
DbHelper.initContext(this, APP_DEFAULT_DB_NAME);
// smack初始化,用于连接推送服务器
Smack.init(this, true);
//禁止默认的页面统计方式
MobclickAgent.openActivityDurationTrack(false);
MobclickAgent.setDebugMode(true);// 程序开发阶段,启动debug模式
// MobclickAgent.setCatchUncaughtExceptions(false);//关闭统计错误功能
// 后续扩展社交统计功能
// /analytics/android-doc/integration#4
// ApkPlus 模块化功能
installPlus();
// FrameworkInstance
// frame=FrameworkFactory.getInstance().start(List&BundleActivator&,this);
+ @Override
+ public void onTerminate() {
Smack.release();
super.onTerminate();
+ public Activity getCurrentActivity() {
return currentA
+ private void installPlus() {
frame = FrameworkFactory.getInstance().start(null, this);
System.out.println(&PdfGenerater.apk&);
BundleContext context = frame.getSystemBundleContext();
InstallBundler ib = new InstallBundler(context);
ib.installForAssets(&PdfGenerater.apk&, &1.0.0&, null,
new installCallback() {
public void callback(int stutas,
org.osgi.framework.Bundle b) {
if (stutas == installCallback.stutas5
|| stutas == installCallback.stutas7) {
Log.d(&&,String.format(&插件安装 %s : %d&,b.getName(), stutas));
Log.d(&&, &插件安装失败 :%d& + b);
} catch (Exception ex) {
System.err.println(&Could not create : & + ex);
ex.printStackTrace();
int nPid = android.os.Process.myPid();
android.os.Process.killProcess(nPid);
+ // //////////-----------以下是应用Activity启动生命周期回调方法实现-----------////////////
+ @Override
+ public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
String actName = activity.getClass().getName();
if (launcherActivity == null)
launcherActivity = actN// 第一个启动的一定是MainActivity,但代码允许定义多个启动Activity
if (actName.equals(launcherActivity)) {
// 在程序入口Activity调用同步在线配置,对于内网环境无效,无法同步配置,
MobclickAgent.updateOnlineConfig(activity);
MobclickAgent
.setOnlineConfigureListener(new UmengOnlineConfigureListener() {
public void onDataReceived(JSONObject data) {
/** 设置是否对日志信息进行加密, 默认false(不加密). */
AnalyticsConfig.enableEncrypt(true);
+ @Override
+ public void onActivityStarted(Activity activity) {
+ @Override
+ public void onActivityResumed(Activity activity) {
MobclickAgent.onResume(activity);
onPageStart(activity);
currentActivity =
showAssistBall();
+ WindowManager.LayoutP
+ public void showAssistBall(){
boolean isShowAssistant = PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(getString(R.string.sp_key_show_assistant), true);
if(isShowAssistant){
if(ball == null){
ball = new AssistBall(currentActivity);
if(!ball.isAttached()){
ball.showAssistBall(params);
+ public void hideAssistBall(){
if(ball != null && ball.isAttached()){
params = ball.getCurrentLayoutParams();
ball.removeAssistBall();
+ @Override
+ public void onActivityPaused(Activity activity) {
MobclickAgent.onPause(activity);
onPageEnd(activity);
hideAssistBall();
+ @Override
+ public void onActivityStopped(Activity activity) {
+ @Override
+ public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
+ @Override
+ public void onActivityDestroyed(Activity activity) {
+ private void onPageStart(Activity activity) {
if (activity instanceof FragmentActivity) {
// 当Activity是fragmentActivity时,需要在fragment的onResume调用onPageStart
CharSequence title = activity.getTitle();
if (TextUtils.isEmpty(title))
title = activity.getComponentName().getClassName();
MobclickAgent.onPageStart(title.toString());
+ private void onPageEnd(Activity activity) {
if (activity instanceof FragmentActivity) {
// 当Activity是fragmentActivity时,需要在fragment的onPause调用onPageEnd
CharSequence title = activity.getTitle();
if (TextUtils.isEmpty(title))
title = activity.getComponentName().getClassName();
MobclickAgent.onPageEnd(title.toString());
Index: szboanda/ydzf/business/xmpp/YdzfPacket.java
===================================================================
--- szboanda/ydzf/business/xmpp/YdzfPacket.java (revision 0)
+++ szboanda/ydzf/business/xmpp/YdzfPacket.java (revision 7)
@@ -0,0 +1,248 @@
+package com.szboanda.ydzf.business.
+import java.io.S
+import java.io.StringR
+import java.util.D
+import java.util.M
+import org.jivesoftware.smack.packet.P
+import org.jivesoftware.smack.provider.IQP
+import org.xmlpull.v1.XmlPullP
+import org.xmlpull.v1.XmlPullParserF
+import com.lidroid.xutils.db.annotation.Id;
+import com.lidroid.xutils.db.annotation.NotN
+import com.lidroid.xutils.db.annotation.T
+import com.lidroid.xutils.db.annotation.T
+import com.szboanda.android.platform.util.DateU
+import com.szboanda.ydzf.business.inf.IListI
+import com.szboanda.ydzf.business.user.OrganizationM
+import com.szboanda.ydzf.business.user.U
+import com.szboanda.ydzf.business.xmpp.smack.IPacketC
+ * @Title: YdzfPacket.java
+ * @Package com.szboanda.ydzf.business.xmpp
+ * @Description: {@link packet}对象实现{@link IPacketConvertor}
+ * @author 苏浩
+ * @date 日 下午7:04:12
+ * @version V1.0
+@Table(name = &T_YDZF_PACKET&)
+public class YdzfPacket implements IListItem,Serializable {
+ private static final long serialVersionUID = 8528561L;
+ protected S
+ protected String createT
+ protected String fromJ
+ protected String toJ
+ protected S
+ @NotNull
+ protected String packetX
+ @NotNull
+ protected String elementN
+ @NotNull
+ protected S
+ @Transient
+ protected P
+ public String getId() {
if (id == null) {
id = new Date().getTime() + &&;
+ public void setId(String id) {
+ public String getFromJid() {
if (fromJid == null) {
fromJid = getPacket().getFrom();
return fromJ
+ public void setFromJid(String fromJid) {
this.fromJid = fromJ
+ public String getToJid() {
if (toJid == null) {
toJid = getPacket().getTo();
return toJ
+ public void setToJid(String toJid) {
this.toJid = toJ
+ public String getJson() {
if (json == null && packet instanceof IPacketConvertor) {
json = ((IPacketConvertor)packet).toJSONObject(packet).toString();
+ public void setJson(String json) {
this.json =
+ public String getPacketXml() {
if (packetXml == null && packet != null) {
packetXml = packet.toXML();
return packetX
+ public void setPacketXml(String packetXml) {
this.packetXml = packetX
+ public int getStatus() {
+ public void setStatus(int status) {
this.status =
+ public void setCreateTime(String createTime) {
this.createTime = createT
+ public String getCreateTime() {
if(createTime == null){
createTime = DateUtils.formatDate(new Date(), DateUtils.FORMAT_DATE_TIME_S);
return createT
+ public String getElementName() {
return elementN
+ public void setElementName(String elementName) {
if(elementName == null)
throw new IllegalArgumentException(&元素名不能为空&);
this.elementName = elementN
+ public String getNamespace(String namespace){
+ public void setNamespace(String namespace){
if(namespace == null)
throw new IllegalArgumentException(&命名空间不能为空&);
this.namespace =
+ public Packet getPacket() {//
if(packet == null && packetXml != null
&& elementName != null && namespace != null ){
Object obj = Smack.getIQProvider(elementName, namespace);
if(obj instanceof IQProvider){
IQProvider pro = (IQProvider)
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new StringReader(packetXml));
packet = pro.parseIQ(parser);
} catch (Exception e) {
e.printStackTrace();
if(packet == null){
packet = new EmptyPacket();
+ public void setPacket(Packet packet) {
this.packet =
if(packet != null){
setPacketXml(packet.toXML());
if(fromJid == null){
fromJid = packet.getFrom();
if(toJid == null){
toJid = packet.getTo();
+ @Override
+ public String getTime() {
return getCreateTime();
+ @Override
+ public String getTag() {
return ((IPacketConvertor)getPacket()).getTag();
+ @Override
+ public String getDescription() {
return ((IPacketConvertor)getPacket()).getDescription();
+ @Override
+ public String getContent() {
return ((IPacketConvertor)getPacket()).getContent();
+ @Override
+ public String getRemark() {
return ((IPacketConvertor)getPacket()).getRemark();
+ @Override
+ public String getImage() {
return ((IPacketConvertor)getPacket()).getImage();
+ @Override
+ public Map&String, Object& getMapData() {
return ((IPacketConvertor)getPacket()).getMapData();
+ @Override
+ public String getTitle() {
String title = ((IPacketConvertor)getPacket()).getTitle();
if(title != null)
return getUserName(getFromJid());
+ /**根据jid查询本地已缓存表中的用户*/
+ public String getUserName(String jid){
if (jid != null && jid.contains(&@&)) {
User user = OrganizationManager.findUserInTable(jid.substring(0, jid.indexOf(&@&)));
if (user != null)
return user.getName();
Index: szboanda/ydzf/business/xmpp/PacketDetailActivity.java
===================================================================
--- szboanda/ydzf/business/xmpp/PacketDetailActivity.java (revision 0)
+++ szboanda/ydzf/business/xmpp/PacketDetailActivity.java (revision 7)
@@ -0,0 +1,130 @@
+package com.szboanda.ydzf.business.
+import org.json.JSONO
+import com.szboanda.android.platform.util.DimensionU
+import com.szboanda.android.platform.util.JsonU
+import com.szboanda.android.platform.view.SingleCharStampD
+import com.szboanda.ydzf.business.R;
+import com.szboanda.ydzf.business.xmpp.smack.NotificationIQ;
+import android.app.A
+import android.graphics.C
+import android.graphics.drawable.BitmapD
+import android.graphics.drawable.StateListD
+import android.os.B
+import android.os.B
+import android.text.TextU
+import android.view.V
+import android.view.View.OnClickL
+import android.widget.TextV
+* @Title: PacketDetailActivity.java
+* @Package com.szboanda.ydzf.business.xmpp
+* @Description: 消息详情页面,后续考虑使用RelativeLayout改写
+* @author 苏浩
+* @date 日 下午4:41:53
+* @version V1.0
+public class PacketDetailActivity extends Activity {
+ public static final String P_REQUIRE_YDZF_PACKET = &YDZF_PACKET&;
+ private YdzfP
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_packet_detail);
getIntentParams();
initViews();
+ private void getIntentParams(){
packet = (YdzfPacket) getIntent().getSerializableExtra(P_REQUIRE_YDZF_PACKET);
if(packet == null)
throw new IllegalArgumentException(&消息为空&);
+ private void initViews(){
setViewsText();
View viewClose = findViewById(R.id.viewClose);
viewClose.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
SingleCharStampDrawer drawer = new SingleCharStampDrawer(this);
drawer.setPadding(100);
drawer.setText(&X&);
drawer.setTextSize(DimensionUtils.dip2Px(this, 18));
drawer.setStampColor(Color.LTGRAY);
StateListDrawable list = new StateListDrawable();
list.addState(new int[]{android.R.attr.state_pressed}, new BitmapDrawable(getResources(), drawer.drawStamp()));
drawer.setStampColor(Color.WHITE);
list.addState(new int[]{android.R.attr.state_enabled}, new BitmapDrawable(getResources(), drawer.drawStamp()));
viewClose.setBackgroundDrawable(list);
+ private void setViewsText(){
String createTime = packet.getCreateTime() == null ? && : packet.getCreateTime();
((TextView)findViewById(R.id.textCreateTime)).setText(&接收时间:&+createTime);
String from = packet.getUserName(packet.getFromJid());
if(from == null){
from = packet.getFromJid() == null ? && : packet.getFromJid();
TextView textFrom = (TextView)findViewById(R.id.textFrom);
if(!TextUtils.isEmpty(from) && !&null&.equalsIgnoreCase(from) && !getString(R.string.xmpp_host).equals(from)){
textFrom.setText(&消息来自:&+from);
textFrom.setVisibility(View.GONE);
if(packet.getPacket() instanceof NotificationIQ){
NotificationIQ iq = (NotificationIQ)packet.getPacket();
String title = iq.getTitle() == null ? && : iq.getTitle();
((TextView)findViewById(R.id.textTitle)).setText(&标题:&+title);
String message = iq.getMessage() == null ? && : iq.getMessage();
((TextView)findViewById(R.id.textContent)).setText(&内容:&+message);
String uri = iq.getUri() == null ? && : iq.getUri();
TextView textUri = (TextView)findViewById(R.id.textUri);
if(TextUtils.isEmpty(uri)){
textUri.setVisibility(View.GONE);
textUri.setText(uri);
TextView textParams = (TextView)findViewById(R.id.textParams);
String params = iq.getParams() == null ? && : iq.getParams();
JSONObject obj = JsonUtils.parseJsonObject(params);
String address = obj.optString(&ADDRESS&);
if(TextUtils.isEmpty(address)){
textParams.setVisibility(View.GONE);
textParams.setText(&地址:&+address);
} catch (Exception e) {
// handle exception
Index: szboanda/ydzf/business/xmpp/MessageInterpreter.java
===================================================================
--- szboanda/ydzf/business/xmpp/MessageInterpreter.java (revision 0)
+++ szboanda/ydzf/business/xmpp/MessageInterpreter.java (revision 7)
@@ -0,0 +1,68 @@
+package com.szboanda.ydzf.business.
+import java.io.StringR
+import org.jivesoftware.smack.packet.M
+import org.xmlpull.v1.XmlPullP
+import org.xmlpull.v1.XmlPullParserE
+import org.xmlpull.v1.XmlPullParserF
+import android.text.TextU
+* @Title: MessageInterpreter.java
+* @Package com.szboanda.ydzf.business.xmpp
+* @Description: 消息解释器
+* @author 苏浩
+* @date 日 下午2:14:57
+* @version V1.0
+public class MessageInterpreter {
+ public static Message parseMessageXml(String msgXml){
Message msg =
if(!TextUtils.isEmpty(msgXml)){
XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new StringReader(msgXml));
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
if(eventType == XmlPullParser.START_TAG){
String elementName = parser.getName();
if(&message&.equalsIgnoreCase(elementName) && TextUtils.isEmpty(parser.getNamespace())){
msg = new Message();
for(int i=0; i&parser.getAttributeCount();i++){
String name = parser.getAttributeName(i);
String value = parser.getAttributeValue(i);
if(&id&.equals(name)){
msg.setPacketID(value);
}else if(&to&.equals(name)){
msg.setTo(value);
}else if(&from&.equals(name)){
msg.setFrom(value);
}else if(&type&.equals(name)){
((Message)msg).setType(Message.Type.valueOf(value));
}else if(&subject&.equalsIgnoreCase(elementName)){
((Message)msg).setSubject(parser.nextText());
}else if(&body&.equalsIgnoreCase(elementName)){
((Message)msg).setBody(parser.nextText());
}else if(&thread&.equalsIgnoreCase(elementName)){
((Message)msg).setThread(parser.nextText());
eventType = parser.next();
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
+ }//end parsePacketXml
Index: szboanda/ydzf/business/xmpp/Constants.java
===================================================================
--- szboanda/ydzf/business/xmpp/Constants.java (revision 0)
+++ szboanda/ydzf/business/xmpp/Constants.java (revision 7)
@@ -0,0 +1,41 @@
+ * Copyright (C) 2010 Moduad Co., Ltd.
+ * Licensed under the Apache License, Version 2.0 (the &License&);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an &AS IS& BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+package com.szboanda.ydzf.business.
+ * &p&静态变量声明(public static final) &/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public class Constants {
+ public static final String MESSAGE_OBJECT = &MESSAGE_OBJECT&;
+ //PARAMS
+ public static final String PACKET_ID = &PACKET_ID&;
+ public static final String TO_JID = &TO_JID&;
+ public static final String FROM_JID = &FROM_JID&;
// INTENT ACTIONS
public static final String ACTION_MESSAGE_RECEIPT = &com.szboanda.mobile.android.emop.ACTION_MESSAGE_RECEIPT&;
Index: szboanda/ydzf/business/xmpp/smack/OverStandardIQProvider.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/OverStandardIQProvider.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/OverStandardIQProvider.java (revision 7)
@@ -0,0 +1,46 @@
+package com.szboanda.ydzf.business.xmpp.
+import org.jivesoftware.smack.packet.IQ;
+import org.jivesoftware.smack.provider.IQP
+import org.xmlpull.v1.XmlPullP
+ * 把接收到的IQ解析成WorkflowTaskIQ
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public class OverStandardIQProvider implements IQProvider {
+ @Override
+ public IQ parseIQ(XmlPullParser parser) throws Exception {
OverStandardIQ os = new OverStandardIQ();
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
if (eventType == XmlPullParser.START_TAG) {// START_TAG
if (&title&.equals(parser.getName())) {
os.setTitle(parser.nextText());
if (&startTime&.equals(parser.getName())) {
os.setStartTime(parser.nextText());
if (&endTime&.equals(parser.getName())) {
os.setEndTime(parser.nextText());
if (&params&.equals(parser.getName())) {
os.setParams(parser.nextText());
} else if (eventType == XmlPullParser.END_TAG
&& OverStandardIQ.ELEMENT_NAME.equals(parser.getName())) {
eventType = parser.next();
Index: szboanda/ydzf/business/xmpp/smack/WorkflowTaskIQProvider.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/WorkflowTaskIQProvider.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/WorkflowTaskIQProvider.java (revision 7)
@@ -0,0 +1,61 @@
+package com.szboanda.ydzf.business.xmpp.
+import org.jivesoftware.smack.packet.IQ;
+import org.jivesoftware.smack.provider.IQP
+import org.xmlpull.v1.XmlPullP
+ * 把接收到的IQ解析成WorkflowTaskIQ
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public class WorkflowTaskIQProvider implements IQProvider {
+ @Override
+ public IQ parseIQ(XmlPullParser parser) throws Exception {
WorkflowTaskIQ workflowTask = new WorkflowTaskIQ();
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
if (eventType == XmlPullParser.START_TAG) {// START_TAG
if (&lightType&.equals(parser.getName())) {
workflowTask.setLightType(parser.nextText());
if (&taskType&.equals(parser.getName())) {
workflowTask.setTaskType(parser.nextText());
if (&title&.equals(parser.getName())) {
workflowTask.setTitle(parser.nextText());
if (&stepTime&.equals(parser.getName())) {
workflowTask.setStepTime(parser.nextText());
if (&address&.equals(parser.getName())) {
workflowTask.setAddress(parser.nextText());
if (&startTime&.equals(parser.getName())) {
workflowTask.setStartTime(parser.nextText());
if (&deadLine&.equals(parser.getName())) {
workflowTask.setDeadLine(parser.nextText());
if (&description&.equals(parser.getName())) {
workflowTask.setDescription(parser.nextText());
if (&params&.equals(parser.getName())) {
workflowTask.setParams(parser.nextText());
} else if (eventType == XmlPullParser.END_TAG
&& WorkflowTaskIQ.ELEMENT_NAME.equals(parser.getName())) {
eventType = parser.next();
return workflowT
Index: szboanda/ydzf/business/xmpp/smack/SmackRosterListener.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/SmackRosterListener.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/SmackRosterListener.java (revision 7)
@@ -0,0 +1,45 @@
+package com.szboanda.ydzf.business.xmpp.
+import java.util.C
+import org.jivesoftware.smack.RosterL
+import org.jivesoftware.smack.packet.P
+ * &p&用户花名册变化监听 &/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+@Deprecated
+public class SmackRosterListener implements RosterListener {
+ public SmackRosterListener(SmackImpl smackable) {
this.smackable =
+ @Override
+ public void entriesAdded(Collection&String& arg0) {
smackable.sendUpdateRosterBroadcast();
+ @Override
+ public void entriesDeleted(Collection&String& arg0) {
smackable.sendUpdateRosterBroadcast();
+ @Override
+ public void entriesUpdated(Collection&String& arg0) {
smackable.sendUpdateRosterBroadcast();
+ @Override
+ public void presenceChanged(Presence arg0) {
// TODO 可在此处弹出提醒,告诉用户,花名册中好友状态
Index: szboanda/ydzf/business/xmpp/smack/ISmack.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/ISmack.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/ISmack.java (revision 7)
@@ -0,0 +1,114 @@
+package com.szboanda.ydzf.business.xmpp.
+ * &p&xmpp服务接口 &/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public interface ISmack {
* 登录验证
* @throws SmackException
+ public boolean login() throws SmackE
* 注销登录,销毁一下监听器,改变连接状态等
+ public boolean logout();
* 是否已经连上服务器,且验证通过
+ public boolean isAuthenticated();
* 获取离线消息
+ public void getOfflineMessages() throws SmackE
* 添加用户(指定备注)到分组
* @param jid like zhangsan@192.168.1.1
* @param alias like 张三
* @param group 不可为空
* @throws SmackException
+ public void addRosterItem(String jid,String alias,String group) throws SmackE
* 移除好友
* @param jid
* @throws SmackException
+ public void removeRosterItem(String jid) throws SmackE
* 给好友重置备注
* @param jid
* @param newAlias
* @throws SmackException
+ public void renameRosterItem(String jid,String newAlias) throws SmackE
* 移动好友到分组
* @param jid
* @param group
* @throws SmackException
+ public void moveRosterItemToGroup(String jid,String group) throws SmackE
* 重命名分组
* @param group
* @param newGroup
+ public void renameRosterGroup(String group,String newGroup);
* 添加分组
* @param group
+ public void addRosterGroup(String group);
* 设置当前状态描述
* @param type {@link Presence.Type}
* @param mode {@link Presence.Mode}
* @param status
+ public void setStatus(String type,String mode,String status);
* 给用户发送消息
* @param toJID
* @param message
+ public void sendMessage(String toJID,String message);
* 发送消息包
* @param packet
+ public void sendPacket(Object packet);
* 向服务器发送心跳包,保持长连接 通过一个闹钟控制,定时发送,
+ public void sendServerPing();
Index: szboanda/ydzf/business/xmpp/smack/SmackMessageListener.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/SmackMessageListener.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/SmackMessageListener.java (revision 7)
@@ -0,0 +1,57 @@
+package com.szboanda.ydzf.business.xmpp.
+import org.jivesoftware.smack.PacketL
+import org.jivesoftware.smack.packet.M
+import org.jivesoftware.smack.packet.P
+import com.lidroid.xutils.util.LogU
+ * &p&Message类型消息监听类 &/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+@Deprecated
+public class SmackMessageListener implements PacketListener {
+ public SmackMessageListener(SmackImpl smackable) {
this.smackable =
+ @Override
+ public void processPacket(Packet packet) {
LogUtils.d(&packet.toXML()=& + packet.toXML());
if (packet instanceof Message) {
Message message = (Message)
YdzfPacket obj = new YdzfPacket();
obj.setPacket(iq);
obj.setConvertor(iq);
Smack.onPacketReceived(obj);
switch (message.getType()) {
case chat:
case normal:
//TODO 正常消息,一般消息
case headline:
//TODO 广播消息
case error:
//TODO 错误,警告
case groupchat:
//TODO 群聊
Index: szboanda/ydzf/business/xmpp/smack/SmackException.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/SmackException.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/SmackException.java (revision 7)
@@ -0,0 +1,24 @@
+package com.szboanda.ydzf.business.xmpp.
+ * &p&自定义异常类 &/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public class SmackException extends Exception {
+ private static final long serialVersionUID = -3780391L;
+ public SmackException(String message){
super(message);
+ public SmackException(String message,Throwable ex){
super(message, ex);
Index: szboanda/ydzf/business/xmpp/smack/SmackPacketSendFailureListener.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/SmackPacketSendFailureListener.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/SmackPacketSendFailureListener.java (revision 7)
@@ -0,0 +1,32 @@
+package com.szboanda.ydzf.business.xmpp.
+import org.jivesoftware.smack.PacketL
+import org.jivesoftware.smack.packet.M
+import org.jivesoftware.smack.packet.P
+import com.lidroid.xutils.util.LogU
+ * &p&消息发送失败监听类 &/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+@Deprecated
+public class SmackPacketSendFailureListener implements PacketListener {
+ @Override
+ public void processPacket(Packet packet) {
if(packet instanceof Message){
Message message = (Message)
if(Message.Type.chat.equals(message.getType())){
//TODO 保存到离线消息中去
LogUtils.d(&消息发送失败:&+packet.toXML());
Index: szboanda/ydzf/business/xmpp/smack/MessageTimeProvider.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/MessageTimeProvider.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/MessageTimeProvider.java (revision 7)
@@ -0,0 +1,37 @@
+package com.szboanda.ydzf.business.xmpp.
+import org.jivesoftware.smack.packet.PacketE
+import org.jivesoftware.smack.provider.PacketExtensionP
+import org.xmlpull.v1.XmlPullP
+import com.szboanda.ydzf.business.xmpp.TimePacketE
+ * &p&从消息包中解析出来消息时间扩展&/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public class MessageTimeProvider implements PacketExtensionProvider {
+ @Override
+ public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
if(eventType == XmlPullParser.START_TAG){
String elementName = parser.getName();
if(TimePacketExtention.ELEMENT_NAME.equals(elementName)
&& TimePacketExtention.ELEMENT_NAMESPACE.equals(parser.getNamespace())){
for(int i=0;i&parser.getAttributeCount();i++){
if(&createTime&.equals(parser.getAttributeName(i))){
return new TimePacketExtention(parser.getAttributeValue(i));
eventType = parser.next();
Index: szboanda/ydzf/business/xmpp/smack/SmackImpl.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/SmackImpl.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/SmackImpl.java (revision 7)
@@ -0,0 +1,668 @@
+package com.szboanda.ydzf.business.xmpp.
+import java.util.ArrayL
+import java.util.C
+import java.util.I
+import java.util.L
+import org.jivesoftware.smack.ConnectionC
+import org.jivesoftware.smack.R
+import org.jivesoftware.smack.RosterE
+import org.jivesoftware.smack.RosterG
+import org.jivesoftware.smack.SmackC
+import org.jivesoftware.smack.XMPPC
+import org.jivesoftware.smack.XMPPE
+import org.jivesoftware.smack.filter.AndF
+import org.jivesoftware.smack.filter.OrF
+import org.jivesoftware.smack.filter.PacketTypeF
+import org.jivesoftware.smack.packet.IQ;
+import org.jivesoftware.smack.packet.M
+import org.jivesoftware.smack.packet.P
+import org.jivesoftware.smack.packet.P
+import org.jivesoftware.smack.provider.ProviderM
+import org.jivesoftware.smackx.ConfigureProviderM
+import org.jivesoftware.smackx.OfflineMessageM
+import org.jivesoftware.smackx.ServiceDiscoveryM
+import org.jivesoftware.smackx.ping.PingM
+import org.jivesoftware.smackx.ping.packet.P
+import org.jivesoftware.smackx.receipts.DeliveryR
+import org.jivesoftware.smackx.receipts.DeliveryReceiptM
+import org.jivesoftware.smackx.receipts.DeliveryReceiptR
+import com.lidroid.xutils.DbU
+import com.lidroid.xutils.db.sqlite.S
+import com.lidroid.xutils.util.LogU
+import com.szboanda.android.platform.db.DbH
+import com.szboanda.ydzf.business.xmpp.C
+import com.szboanda.ydzf.business.xmpp.OfflineM
+import com.szboanda.ydzf.business.xmpp.S
+import com.szboanda.ydzf.business.xmpp.TimePacketE
+import com.szboanda.ydzf.business.xmpp.service.SmackS
+import android.content.C
+import android.content.I
+import android.net.ConnectivityM
+import android.net.NetworkI
+import android.text.TextU
+ * &p&xmpp服务实现类 &/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public class SmackImpl implements ISmack{
+ /**客户端标识,指定那种客户端,比如桌面客户端,手机客户端*/
+ public static String identityName = &Smack&;
+ /**客户端类型标识,例如QQ中的iPhone在线、小米Note在线*/
+ public static String identityType = &Android&;
+ /**回复消息包超时时间*/
+ private static final int PACKET_TIMEOUT = 10000;
+ /**设置解析器,定义标识*/
ConfigureProviderManager.configureProviderManager();
initProvider();
ServiceDiscoveryManager.setIdentityName(identityName);
ServiceDiscoveryManager.setIdentityType(identityType);
+ static void initProvider(){
ProviderManager pm = ProviderManager.getInstance();
// add delivery receipts
pm.addExtensionProvider(DeliveryReceipt.ELEMENT,
DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());
pm.addExtensionProvider(DeliveryReceiptRequest.ELEMENT,
DeliveryReceipt.NAMESPACE,
new DeliveryReceiptRequest.Provider());
pm.addIQProvider(NotificationIQ.ELEMENT_NAME, NotificationIQ.ELEMENT_NAMESPACE,
new NotificationIQProvider());//消息通知
pm.addIQProvider(WorkflowTaskIQ.ELEMENT_NAME, WorkflowTaskIQ.ELEMENT_NAMESPACE,
new WorkflowTaskIQProvider());//任务预警
pm.addIQProvider(OverStandardIQ.ELEMENT_NAME, OverStandardIQ.ELEMENT_NAMESPACE,
new OverStandardIQProvider());//超标预警
// Message Exchange
pm.addExtensionProvider(TimePacketExtention.ELEMENT_NAME, TimePacketExtention.ELEMENT_NAMESPACE,
new MessageTimeProvider());
+ SmackS//提供context
+ //SmackRosterListener rosterL//用户花名册变化监听
+ //SmackMessageListener messageL//message类型packet监听器
+ SmackIQListener iqL//iq类型packet监听器
+ //SmackPresenceListener presenceL//presence类型packet监听器
+ //SmackPacketSendFailureListener packetSendFailureL//消息发送失败监听器
+ ReconnectionListener reconnectionL//重连监听
+ ConnectionC
+ OfflineMessageManager offlineM
+ /**成功登陆后赋值true,注销时设置false,用于连接断开时判断是否重连*/
+ boolean logon =
+ String username,
+ ArrayList&Message& offlineMsgs = new ArrayList&Message&();
+ private Roster mR
* @param service
* @param host 服务器IP
* @param port 推送端口
+ public SmackImpl(SmackService service, String host, int port){
this.service =
//this.rosterListener = new SmackRosterListener(this);
//this.messageListener = new SmackMessageListener(this);
this.iqListener = new SmackIQListener(this);
//this.presenceListener = new SmackPresenceListener(this);
//this.packetSendFailureListener = new SmackPacketSendFailureListener();
this.reconnectionListener = new ReconnectionListener(this);
host = TextUtils.isEmpty(host) ? &127.0.0.1& :
port = port == 0 ? 5222 :
config = new ConnectionConfiguration(host, port);
config.setCompressionEnabled(false);
config.setReconnectionAllowed(true);//调用ReconnectionManager
config.setSendPresence(false);
config.setSASLAuthenticationEnabled(false);//为true连接不了
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
config.setDebuggerEnabled(false);
this.conn = new XMPPConnection(config);
+ public void setProfile(String username, String password){
this.username =
this.password =
+ /**如果登陆验证成功,那么断线后重连。如果是注销则不重连*/
+ public boolean isReconnectionAllowed(){
return !isAuthenticated() &&
+ public String getUsername(){
if(isAuthenticated()){
return conn.getUser();
+ public String getPassword(){
+ public XMPPConnection getConn(){
+ public SmackService getService(){
+ public ArrayList&Message& getOfflineMsgs(){
return offlineM
+ public OfflineMessageManager getOfflineManager(){
if(offlineManager == null && conn != null){
offlineManager = new OfflineMessageManager(conn);
return offlineM
+ private void doConnect() throws SmackException{
if(conn != null && conn.isConnected() ){
if(conn.isAuthenticated()
&& !conn.getUser().contains(username)){
logout(); //其他已登陆,则先注销,再重置连接
connect();
connect();
+ /**只做连接操作,包括设置config,根据config创建connection,调用connect*/
+ private boolean connect() throws SmackException{
boolean result =
SmackConfiguration.setPacketReplyTimeout(PACKET_TIMEOUT);// 设置超时时间
SmackConfiguration.setKeepAliveInterval(-1);
SmackConfiguration.setDefaultPingInterval(0);
//监听花名册变化
//conn.getRoster().addRosterListener(rosterListener);
conn.connect();
if(!conn.isConnected()){
throw new SmackException(&由于不明原因造成连接失败&);
conn.addConnectionListener(reconnectionListener);
initServiceDiscovery();//服务器交互信息监听
} catch (Exception e) {
throw new SmackException(e.getLocalizedMessage(), e);
+ /**disconnect里面有断开socket操作,所以放到单独的Thread里面执行*/
+ public void disconnect(){
if(conn != null && conn.isConnected()){
new Thread(){
public void run() {
conn.disconnect(new Presence(Presence.Type.unavailable));
}.start();
+ @Override
+ public boolean login() throws SmackException{
if(conn.isAuthenticated()){
String loginId = conn.getUser().substring(0,conn.getUser().indexOf(&@&));
if(!loginId.equalsIgnoreCase(username)){
doConnect();
//这个判断是多余的,在某些情况下出现同时调用多个login,
//而connect时间较长,出现其他的已经登陆成功,则不需要再次登陆
if (!conn.isAuthenticated()) {
conn.login(username, password, identityName);
//登陆成功后发送在线状态
setStatus(Presence.Type.available.name(),Presence.Mode.available.name(),&在线&);
} catch (Exception e) {
e.printStackTrace();
throw new SmackException(e.getLocalizedMessage(), e.getCause());
registerAllListener();
sendOfflineMessages();
return conn.isAuthenticated();
+ @Override
+ public boolean logout() {
LogUtils.d(&logout()&);
// remove callbacks _before_ tossing old connection
//conn.getRoster().removeRosterListener(rosterListener);
conn.removePacketListener(iqListener);
//conn.removePacketListener(messageListener);
//conn.removePacketListener(presenceListener);
//conn.removePacketSendFailureListener(packetSendFailureListener);
} catch (Exception e) {
// ignore it!
if (conn.isConnected()) {
conn.sendPacket(new Presence(Presence.Type.unavailable));
// work around SMACK's #%&%# blocking disconnect()
conn.disconnect();//new Presence(Presence.Type.unavailable)
+ @Override
+ public boolean isAuthenticated() {
//如果有网络并且已创建连接
if(isNetwrokOpened(-1) && conn != null){
return conn.isConnected() && conn.isAuthenticated() &&
+ @Override
+ public void getOfflineMessages() throws SmackException {
OfflineMessageManager offlineManager =
offlineMsgs.clear();
offlineManager = new OfflineMessageManager(conn);
SmackConfiguration.setPacketReplyTimeout(5000);
Iterator&Message& messages = offlineManager.getMessages();
while(messages.hasNext()){
Message msg = messages.next();
if(!offlineMsgs.contains(msg)){
offlineMsgs.add(msg);
/*if(offlineMsgs.size()&0){
offlineManager.deleteMessages();
}catch (XMPPException xe){
throw new SmackException(xe.getLocalizedMessage(), xe);
}catch (Exception e) {
throw new SmackException(e.getLocalizedMessage(), e);
+ @Override
+ public void addRosterItem(String jid, String alias, String group)
throws SmackException {
addRosterEntry(jid, alias, group);
+ @Override
+ public void removeRosterItem(String jid) throws SmackException {
removeRosterEntry(jid);
+ @Override
+ public void renameRosterItem(String jid, String newAlias)
throws SmackException {
if(TextUtils.isEmpty(newAlias)){
throw new SmackException(&JabberID to rename is invalid!&);
mRoster = conn.getRoster();
RosterEntry rosterEntry = mRoster.getEntry(jid);
for(RosterEntry entry : mRoster.getEntries()){
if(entry.getUser().equals(jid)){
entry.setName(newAlias);
+ @Override
+ public void moveRosterItemToGroup(String jid, String group)
throws SmackException {
tryToMoveRosterEntryToGroup(jid, group);
+ @Override
+ public void renameRosterGroup(String group, String newGroup) {
mRoster = conn.getRoster();
RosterGroup groupToRename = mRoster.getGroup(group);
if (groupToRename == null) {
groupToRename.setName(newGroup);
+ @Override
+ public void addRosterGroup(String group) {
mRoster = conn.getRoster();
mRoster.createGroup(group);
* @param type 默认 available
* @param mode 默认 available
+ @Override
+ public void setStatus(String type,String mode,String status) {
Presence.Type pType =
if(type != null){
pType = Presence.Type.valueOf(type);
if(pType == null){
pType = Presence.Type.
Presence.Mode pMode =
if(mode != null){
pMode = Presence.Mode.valueOf(mode);
if(pMode == null){
pMode = Presence.Mode.
Presence presence = new Presence(pType,status,0,pMode);
conn.sendPacket(presence);
+ @Override
+ public void sendMessage(String toJID, String message) {
final Message newMessage = new Message(toJID, Message.Type.chat);
newMessage.setBody(message);
newMessage.addExtension(new DeliveryReceiptRequest());
if (isAuthenticated()) {
DeliveryReceiptManager.addDeliveryReceiptRequest(newMessage);
conn.sendPacket(newMessage);
// 保存到本地离线消息缓存表
saveAsOfflineMessage(newMessage);
+ @Override
+ public void sendPacket(Object packet) {
if(packet instanceof Packet){
conn.sendPacket((Packet)packet);
+ @Override
+ public void sendServerPing() {
Ping ping = new Ping();
ping.setType(IQ.Type.SET);
ping.setTo(conn.getHost());
conn.sendPacket(ping);
//TODO 该方法暂未启用
+ /*----------------自定义方法----------------*/
+ /**判断是否已经连接*/
+ public boolean isConnected(){
if(isNetwrokOpened(-1) && conn != null && conn.isConnected()){
* 发生更新花名册广播
+ public void sendUpdateRosterBroadcast(){
//TODO service.sendBroadcast(new Intent(Constants.ACTION_UPDATE_ROSTER));
* 组合成JabberID
* @param username
+ public static String getJabberID(String username, String host){
String jid = username+&&;
if(jid.contains(&@&) && !jid.contains(&/&)){
jid += &/&+identityN
}else if(!jid.contains(&@&)){
jid += &@&+ host+&/&+identityN
* 获取花名册
+ public Roster getRoster(){
Roster roster =
roster = conn.getRoster();
} catch (Exception e) {
e.printStackTrace();
* 与服务器交互消息监听,发送消息需要回执,判断对方是否已读此消息
+ private void initServiceDiscovery() {
// register connection features
ServiceDiscoveryManager sdm = ServiceDiscoveryManager
.getInstanceFor(conn);
if (sdm == null)
sdm = new ServiceDiscoveryManager(conn);
sdm.addFeature(&http://jabber.org/protocol/disco#info&);
// reference PingManager, set ping flood protection to 10s
PingManager.getInstanceFor(conn).setPingMinimumInterval(
10 * 1000);
// reference DeliveryReceiptManager, add listener
DeliveryReceiptManager dm = DeliveryReceiptManager
.getInstanceFor(conn);
dm.enableAutoReceipts();
dm.registerReceiptReceivedListener(new DeliveryReceiptManager.ReceiptReceivedListener() {
public void onReceiptReceived(String fromJid, String toJid,
String receiptId) {
LogUtils.d(&收到消息回执 id=& + receiptId+&,来自&+fromJid+&,发给&+toJid);
Intent intent = new Intent(Constants.ACTION_MESSAGE_RECEIPT);
intent.putExtra(Constants.PACKET_ID, receiptId);
intent.putExtra(Constants.TO_JID, toJid);
intent.putExtra(Constants.FROM_JID, fromJid);
service.sendBroadcast(intent);
+ private void registerAllListener(){
if(isAuthenticated()){
//TODO 重写监听器
if(messageListener != null){
conn.removePacketListener(messageListener);
if(iqListener != null){
conn.removePacketListener(iqListener);
if(presenceListener != null){
conn.removePacketListener(presenceListener);
if(packetSendFailureListener != null){
conn.removePacketSendFailureListener(packetSendFailureListener);
conn.addPacketListener(messageListener, new PacketTypeFilter(Message.class));
//TODO 添加其他自定义IQ
OrFilter or = new OrFilter();
or.addFilter(new PacketTypeFilter(NotificationIQ.class));
or.addFilter(new PacketTypeFilter(WorkflowTaskIQ.class));
or.addFilter(new PacketTypeFilter(OverStandardIQ.class));
conn.addPacketListener(iqListener, or);
conn.addPacketListener(presenceListener, new PacketTypeFilter(Presence.class));
conn.addPacketSendFailureListener(packetSendFailureListener, new PacketTypeFilter(Message.class));
+ /** 发送缓存在本地的离线消息 */
+ private void sendOfflineMessages(){
if(isAuthenticated()){
DbUtils db = DbHelper.getDbUtils(Smack.XMPP_DB_NAME);
Selector selector = Selector.from(OfflineMessage.class);
selector.orderBy(&createTime&);
selector.where(&status&, &=&, &offline&);
List&OfflineMessage& localOffline = db.findAll(selector);
if(localOffline != null){
for(OfflineMessage lm : localOffline){
Packet msg = lm.getMessage();
msg.addExtension(new DeliveryReceiptRequest());
conn.sendPacket(msg);
db.deleteAll(localOffline);
} catch (Exception e) {
e.printStackTrace();
} finally {
db.close();
+ /** 保存到本地离线消息缓存表 */
+ public void saveAsOfflineMessage(Message msg){
// 保存到本地离线消息缓存表
Smack.saveObject(new OfflineMessage(msg));
+ private void addRosterEntry(String jid, String alias, String group)
throws SmackException {
mRoster = conn.getRoster();
mRoster.createEntry(jid, alias, new String[] { group });
} catch (Exception e) {
throw new SmackException(e.getLocalizedMessage());
+ private void removeRosterEntry(String jid) throws SmackException {
mRoster = conn.getRoster();
RosterEntry rosterEntry = mRoster.getEntry(jid);
if (rosterEntry != null) {
mRoster.removeEntry(rosterEntry);
} catch (XMPPException e) {
throw new SmackException(e.getLocalizedMessage());
+ private void tryToMoveRosterEntryToGroup(String jid, String group)
throws SmackException {
mRoster = conn.getRoster();
RosterGroup rosterGroup = getRosterGroup(jid);
RosterEntry rosterEntry = mRoster.getEntry(group);
removeRosterEntryFromGroups(rosterEntry);
if (group.length() == 0)
rosterGroup.addEntry(rosterEntry);
} catch (XMPPException e) {
throw new SmackException(e.getLocalizedMessage());
+ private RosterGroup getRosterGroup(String groupName) {// 获取联系人分组
RosterGroup rosterGroup = mRoster.getGroup(groupName);
// create group if unknown
if ((groupName.length() & 0) && rosterGroup == null) {
rosterGroup = mRoster.createGroup(groupName);
return rosterG
+ private void removeRosterEntryFromGroups(RosterEntry rosterEntry)
throws SmackException {// 从对应组中删除联系人,供外部服务调用
Collection&RosterGroup& oldGroups = rosterEntry.getGroups();
for (RosterGroup group : oldGroups) {
tryToRemoveUserFromGroup(group, rosterEntry);
+ private void tryToRemoveUserFromGroup(RosterGroup group,
RosterEntry rosterEntry) throws SmackException {
group.removeEntry(rosterEntry);
} catch (XMPPException e) {
throw new SmackException(e.getLocalizedMessage());
+ /**如果已经登陆,发送消息,并请求回执。否则保存到本地,下一次登陆成功后发送*/
+ public Message sendMessage(Message msg){
if(isAuthenticated()){
DeliveryReceiptManager.addDeliveryReceiptRequest(msg);
conn.sendPacket(msg);
saveAsOfflineMessage(msg);
* 判断网络是否打开
* @param explicitType
指定网络类型, 参见ConnectivityManager.TYPE_ 静态变量
boolean isNetwrokOpened(int explicitType) {
boolean isconnect =
List&Integer& types = new ArrayList&Integer&();
// 未指定网络类型,判断手机网络或WIFI连接都可以
types.add(ConnectivityManager.TYPE_MOBILE);
types.add(ConnectivityManager.TYPE_WIFI);
if (explicitType != -1) {
// 指定网络类型,清除默认添加的,添加指定的
types.clear();
types.add(explicitType);
ConnectivityManager conManager = (ConnectivityManager) service
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo network = conManager.getActiveNetworkInfo();
if (network != null && network.isConnected()) {
int type = network.getType();
if (types.contains(type))
isconnect =
Index: szboanda/ydzf/business/xmpp/smack/NotificationIQ.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/NotificationIQ.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/NotificationIQ.java (revision 7)
@@ -0,0 +1,202 @@
+package com.szboanda.ydzf.business.xmpp.
+import java.io.S
+import java.util.D
+import java.util.M
+import org.jivesoftware.smack.packet.IQ;
+import org.jivesoftware.smack.packet.P
+import org.json.JSONO
+import com.szboanda.ydzf.business.xmpp.XmppMessageT
+import android.text.TextU
+ * 通知消息类,自定义IQ均可采用这种方式构建
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public class NotificationIQ extends IQ implements Serializable, IPacketConvertor {
+ public static final String ELEMENT_NAME = &notification&;
+ /** 约定, androidpn:iq: 作为前缀 */
+ public static final String ELEMENT_NAMESPACE = &androidpn:iq:notification&;
+ private static final long serialVersionUID = 3144402L;
+ private S
+ /** 自定义字段消息应用key */
+ private String apiK
+ /** 自定义字段消息标题 */
+ private S
+ /** 自定义字段消息内容 */
+ private S
* 自定义字段消息附带uri,例如 tel:10086 geo:22..025974 等
+ private S
+ /** 自定义字段消息附带参数json格式 */
+ private S
+ /**消息类型 {@link XmppMessageType}*/
+ private String msgT
+ @Override
+ public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append(&&&).append(ELEMENT_NAME)
.append(& xmlns=\&&).append(ELEMENT_NAMESPACE).append(&\&&)
.append(& type=\&&).append(msgType).append(&\& &&);
buf.append(&&id&&).append(id).append(&&/id&&);
buf.append(&&apiKey&&).append(apiKey).append(&&/apiKey&&);
buf.append(&&title&&).append(title).append(&&/title&&);
buf.append(&&message&&).append(message).append(&&/message&&);
buf.append(&&uri&&).append(uri).append(&&/uri&&);
buf.append(&&params&&).append(params).append(&&/params&&);
buf.append(&&/&).append(ELEMENT_NAME).append(&& &);
return buf.toString();
+ public String getId() {
if (id == null) {
id = new Date().getTime() + &&;
+ public void setId(String id) {
+ public String getApiKey() {
return apiK
+ public void setApiKey(String apiKey) {
this.apiKey = apiK
+ public String getTitle() {
+ public void setTitle(String title) {
this.title =
+ public String getMessage() {
+ public void setMessage(String message) {
this.message =
+ public String getUri() {
+ public void setUri(String url) {
this.uri =
+ public String getParams() {
+ public void setParams(String params) {
this.params =
+ public String getMsgType() {
return msgT
+ public void setMsgType(String msgType) {
this.msgType = msgT
+ @Override
+ public NotificationIQ fromJSONObject(JSONObject json) {
NotificationIQ iq =
iq = new NotificationIQ();
iq.setId(json.optString(&id&));
iq.setApiKey(json.optString(&apiKey&));
iq.setTitle(json.optString(&title&));
iq.setMessage(json.optString(&message&));
iq.setParams(json.optString(&params&));
iq.setUri(json.optString(&uri&));
} catch (Exception e) {
e.printStackTrace();
+ @Override
+ public JSONObject toJSONObject(Packet packet) {
JSONObject json = new JSONObject();
if (packet instanceof NotificationIQ) {
NotificationIQ obj = (NotificationIQ)
json.put(&id&, obj.getId());
json.put(&apiKey&, obj.getApiKey());
json.put(&title&, obj.getTitle());
json.put(&message&, obj.getMessage());
json.put(&params&, obj.getParams());
json.put(&uri&, obj.getUri());
} catch (Exception e) {
e.printStackTrace();
+ @Override
+ public String getTag() {
XmppMessageType mt = XmppMessageType.valueOf(msgType);
return mt.getDesc();
} catch (Exception e) {
// do nothing
return msgT
+ @Override
+ public String getDescription() {
+ @Override
+ public String getContent() {
+ @Override
+ public String getRemark() {
+ @Override
+ public String getTime() {
+ @Override
+ public String getImage() {
+ @Override
+ public Map&String, Object& getMapData() {
Index: szboanda/ydzf/business/xmpp/smack/IPacketConvertor.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/IPacketConvertor.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/IPacketConvertor.java (revision 7)
@@ -0,0 +1,22 @@
+package com.szboanda.ydzf.business.xmpp.
+import org.jivesoftware.smack.packet.P
+import org.json.JSONO
+import com.szboanda.ydzf.business.inf.IListI
+* @Title: IPacketConvertor.java
+* @Package com.szboanda.ydzf.business.xmpp.smack
+* @Description: TODO(用一句话描述该文件做什么)
+* @author 苏浩
+* @date 日 下午5:39:49
+* @version V1.0
+public interface IPacketConvertor extends IListItem{
+ Packet fromJSONObject(JSONObject json);
+ JSONObject toJSONObject(Packet obj);
Index: szboanda/ydzf/business/xmpp/smack/OverStandardIQ.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/OverStandardIQ.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/OverStandardIQ.java (revision 7)
@@ -0,0 +1,137 @@
+package com.szboanda.ydzf.business.xmpp.
+import java.io.S
+import java.util.M
+import org.jivesoftware.smack.packet.IQ;
+import org.jivesoftware.smack.packet.P
+import org.json.JSONO
+* @Title: TaskIQ.java
+* @Package com.szboanda.ydzf.business.xmpp.smack
+* @Description: TODO(用一句话描述该文件做什么)
+* @author 苏浩
+* @date 日 下午5:31:46
+* @version V1.0
+public class OverStandardIQ extends IQ implements Serializable, IPacketConvertor {
+ public static final String ELEMENT_NAME = &overstandard&;
+ public static final String ELEMENT_NAMESPACE = &androidpn:iq:overstandard&;
+ private static final long serialVersionUID = -4199565L;
+ private S//排口名称
+ private String startT//开始时间
+ private String endT//结束时间
+ private S//详细
+ public String getStartTime() {
return startT
+ public void setStartTime(String startTime) {
this.startTime = startT
+ public String getParams() {
+ public void setParams(String params) {
this.params =
+ public void setTitle(String title) {
this.title =
+ public String getEndTime() {
return endT
+ public void setEndTime(String endTime) {
this.endTime = endT
+ @Override
+ public String getId() {
+ @Override
+ public String getTitle() {
+ @Override
+ public String getTag() {
+ @Override
+ public String getDescription() {
+ @Override
+ public String getContent() {
String str = startTime == null ? && : startT
return &开始时间:&+
+ @Override
+ public String getRemark() {
String str = endTime == null ? && : endT
return &结束时间:&+
+ @Override
+ public String getTime() {
+ @Override
+ public String getImage() {
+ @Override
+ public Map&String, Object& getMapData() {
// TODO Auto-generated method stub
+ @Override
+ public Packet fromJSONObject(JSONObject json) {
// TODO Auto-generated method stub
+ @Override
+ public JSONObject toJSONObject(Packet obj) {
// TODO Auto-generated method stub
+ @Override
+ public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append(&&&).append(ELEMENT_NAME)
.append(& xmlns=\&&).append(ELEMENT_NAMESPACE).append(&\& &&);
buf.append(&&title&&).append(title).append(&&/title&&);
buf.append(&&startTime&&).append(startTime).append(&&/startTime&&);
buf.append(&&endTime&&).append(endTime).append(&&/endTime&&);
buf.append(&&params&&).append(params).append(&&/params&&);
buf.append(&&/&).append(ELEMENT_NAME).append(&& &);
return buf.toString();
Index: szboanda/ydzf/business/xmpp/smack/WorkflowTaskIQ.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/WorkflowTaskIQ.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/WorkflowTaskIQ.java (revision 7)
@@ -0,0 +1,191 @@
+package com.szboanda.ydzf.business.xmpp.
+import java.io.S
+import java.util.M
+import org.jivesoftware.smack.packet.IQ;
+import org.jivesoftware.smack.packet.P
+import org.json.JSONO
+import com.szboanda.android.platform.util.JsonU
+* @Title: TaskIQ.java
+* @Package com.szboanda.ydzf.business.xmpp.smack
+* @Description: TODO(用一句话描述该文件做什么)
+* @author 苏浩
+* @date 日 下午5:31:46
+* @version V1.0
+public class WorkflowTaskIQ extends IQ implements Serializable, IPacketConvertor {
+ public static final String ELEMENT_NAME = &workflowtask&;
+ public static final String ELEMENT_NAMESPACE = &androidpn:iq:workflowtask&;
+ private static final long serialVersionUID = -4199565L;
+ private String lightT//超时灯标志
+ private String taskT//任务类型
+ private S//任务标题
+ private String stepT//步骤开始时间
+ private S//地址
+ private String startT//开始时间
+ private String deadL//任务期限
+ private S//超期描述
+ private S//任务详细
+ public String getLightType() {
return lightT
+ public void setLightType(String lightType) {
this.lightType = lightT
+ public String getTaskType() {
return taskT
+ public void setTaskType(String taskType) {
this.taskType = taskT
+ public String getStepTime() {
return stepT
+ public void setStepTime(String stepTime) {
this.stepTime = stepT
+ public String getAddress() {
+ public void setAddress(String address) {
this.address =
+ public String getStartTime() {
return startT
+ public void setStartTime(String startTime) {
this.startTime = startT
+ public String getDeadLine() {
return deadL
+ public void setDeadLine(String deadLine) {
this.deadLine = deadL
+ public String getParams() {
+ public void setParams(String params) {
this.params =
+ public void setTitle(String title) {
this.title =
+ public void setDescription(String description) {
this.description =
+ @Override
+ public String getId() {
if(params != null){
return JsonUtils.parseJsonObject(params).optString(&LCSLBH&);
} catch (Exception e) {
// TODO: handle exception
+ @Override
+ public String getTitle() {
+ @Override
+ public String getTag() {
+ @Override
+ public String getDescription() {
+ @Override
+ public String getContent() {
String str = startTime == null ? && : startT
return &开始时间:&+
+ @Override
+ public String getRemark() {
String str = deadLine == null ? && : deadL
return &任务期限:&+
+ @Override
+ public String getTime() {
return stepT
+ @Override
+ public String getImage() {
+ @Override
+ public Map&String, Object& getMapData() {
// TODO Auto-generated method stub
+ @Override
+ public Packet fromJSONObject(JSONObject json) {
// TODO Auto-generated method stub
+ @Override
+ public JSONObject toJSONObject(Packet obj) {
// TODO Auto-generated method stub
+ @Override
+ public String getChildElementXML() {
StringBuilder buf = new StringBuilder();
buf.append(&&&).append(ELEMENT_NAME)
.append(& xmlns=\&&).append(ELEMENT_NAMESPACE).append(&\& &&);
buf.append(&&lightType&&).append(lightType).append(&&/lightType&&);
buf.append(&&taskType&&).append(taskType).append(&&/taskType&&);
buf.append(&&title&&).append(title).append(&&/title&&);
buf.append(&&stepTime&&).append(stepTime).append(&&/stepTime&&);
buf.append(&&address&&).append(address).append(&&/address&&);
buf.append(&&startTime&&).append(startTime).append(&&/startTime&&);
buf.append(&&deadLine&&).append(deadLine).append(&&/deadLine&&);
buf.append(&&description&&).append(description).append(&&/description&&);
buf.append(&&params&&).append(params).append(&&/params&&);
buf.append(&&/&).append(ELEMENT_NAME).append(&& &);
return buf.toString();
Index: szboanda/ydzf/business/xmpp/smack/SmackPresenceListener.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/SmackPresenceListener.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/SmackPresenceListener.java (revision 7)
@@ -0,0 +1,74 @@
+package com.szboanda.ydzf.business.xmpp.
+import org.jivesoftware.smack.PacketL
+import org.jivesoftware.smack.packet.P
+import org.jivesoftware.smack.packet.P
+import android.text.TextU
+import com.lidroid.xutils.util.LogU
+ * &p&Presence类型消息监听类 &/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+@Deprecated
+public class SmackPresenceListener implements PacketListener {
+ public SmackPresenceListener(SmackImpl smackable) {
this.smackable =
+ @Override
+ public void processPacket(Packet packet) {
LogUtils.d(&packet.toXML()=& + packet.toXML());
/*if (packet instanceof Presence) {
Presence presence = (Presence)
// Presence还有很多方法,可查看API
String from = presence.getFrom();// 发送方
String to = presence.getTo();// 接收方
String fromname = GlobalVariables.getRosterItemName(from);
if(TextUtils.isEmpty(fromname)){
fromname =
// Presence.Type有7中状态
if (presence.getType().equals(Presence.Type.subscribe)) {// 好友申请
presence.setFrom(to);
presence.setTo(from);
presence.setType(Presence.Type.subscribed);
smackable.sendPacket(presence);
} catch (Exception e) {
e.printStackTrace();
} else if (presence.getType().equals(
Presence.Type.subscribed)) {// 同意添加好友
showToast(fromname+&同意了添加好友&);
} else if (presence.getType().equals(
Presence.Type.unsubscribe)) {// 拒绝添加好友 和 删除好友
showToast(&删除好友&+fromname);
} else if (presence.getType().equals(Presence.Type.unsubscribed)) {
showToast(fromname+&删除了你的添加好友请求&);
} else if (presence.getType().equals(
Presence.Type.unavailable)) {// 好友下线
// 要更新好友列表,可以在这收到包后,发广播到指定页面
// 更新列表
showToast(fromname+&不在线&);
} else if (presence.getType().equals(
Presence.Type.available)) {// 好友上线
showToast(fromname+&上线了&);
+ private void showToast(String toast){
//do nothing
//参考SmackRosterListener.presenceChanged
Index: szboanda/ydzf/business/xmpp/smack/NotificationIQProvider.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/NotificationIQProvider.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/NotificationIQProvider.java (revision 7)
@@ -0,0 +1,59 @@
+package com.szboanda.ydzf.business.xmpp.
+import org.jivesoftware.smack.packet.IQ;
+import org.jivesoftware.smack.provider.IQP
+import org.xmlpull.v1.XmlPullP
+ * 把接收到的IQ解析成NotificationIQ
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public class NotificationIQProvider implements IQProvider {
+ @Override
+ public IQ parseIQ(XmlPullParser parser) throws Exception {
NotificationIQ notification = new NotificationIQ();
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
if (eventType == XmlPullParser.START_TAG) {// START_TAG
if(NotificationIQ.ELEMENT_NAME.equals(parser.getName())){
for(int i=0;i&parser.getAttributeCount();i++){
if(parser.getAttributeName(i).equals(&type&)){
notification.setMsgType(parser.getAttributeValue(i));
if (&id&.equals(parser.getName())) {
notification.setId(parser.nextText());
if (&apiKey&.equals(parser.getName())) {
notification.setApiKey(parser.nextText());
if (&title&.equals(parser.getName())) {
notification.setTitle(parser.nextText());
if (&message&.equals(parser.getName())) {
notification.setMessage(parser.nextText());
if (&uri&.equals(parser.getName())) {
notification.setUri(parser.nextText());
if (&params&.equals(parser.getName())) {
notification.setParams(parser.nextText());
} else if (eventType == XmlPullParser.END_TAG
&& NotificationIQ.ELEMENT_NAME.equals(parser.getName())) {
eventType = parser.next();
Index: szboanda/ydzf/business/xmpp/smack/ReconnectionListener.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/ReconnectionListener.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/ReconnectionListener.java (revision 7)
@@ -0,0 +1,136 @@
+package com.szboanda.ydzf.business.xmpp.
+import java.util.R
+import org.jivesoftware.smack.ConnectionL
+import org.jivesoftware.smack.XMPPE
+import org.jivesoftware.smack.packet.StreamE
+import android.util.L
+ * &p&重连监听器,当连接断开之后重新连接 &/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
修改isReconnectionAllowed()
+public class ReconnectionListener implements ConnectionListener {
+ private SmackI
+ private Thread reconnectionT
+ private int randomBase = new Random().nextInt(11) + 5;
+ boolean done =
+ public ReconnectionListener(SmackImpl smackable) {
this.smackable =
+ private boolean isReconnectionAllowed() {
if(smackable == null){
return (!this.done) && smackable.isReconnectionAllowed();
+ protected synchronized void reconnect() {
if (isReconnectionAllowed()) {
if ((this.reconnectionThread != null)
&& (this.reconnectionThread.isAlive()))
this.reconnectionThread = new Thread() {
private int attempts = 0;
private int timeDelay() {
this.attempts += 1;
if (this.attempts & 13) {
return ReconnectionListener.this.randomBase * 6 * 5;
if (this.attempts & 7) {
return ReconnectionListener.this.randomBase * 6;
return ReconnectionListener.this.randomB
public void run() {
while (ReconnectionListener.this.isReconnectionAllowed()) {
int i = timeDelay();
while ((ReconnectionListener.this
.isReconnectionAllowed()) && (i & 0)) {
Thread.sleep(500L);
reconnectingIn(i);
} catch (InterruptedException localInterruptedException) {
localInterruptedException.printStackTrace();
reconnectionFailed(localInterruptedException);
if (ReconnectionListener.this
.isReconnectionAllowed()) {
smackable.login();
} catch (Exception localXMPPException) {
reconnectionFailed(localXMPPException);
this.reconnectionThread.setName(&Smack Reconnection Listener&);
this.reconnectionThread.setDaemon(true);//
this.reconnectionThread.start();
+ @Override
+ public void connectionClosed() {
this.done =
Log.v(&ReconnectionListener&, &connectionClosed&);
if (isReconnectionAllowed())
reconnect();
+ @Override
+ public void connectionClosedOnError(Exception paramException) {
this.done =
if ((paramException instanceof XMPPException)) {
XMPPException localXMPPException = (XMPPException) paramE
StreamError localStreamError = localXMPPException.getStreamError();
if (localStreamError != null) {
String str = localStreamError.getCode();
if (&conflict&.equals(str)) {
this.done =
paramException.printStackTrace();
if (isReconnectionAllowed())
reconnect();
+ @Override
+ public void reconnectingIn(int paramInt) {
Log.v(&ReconnectionListener&, &reconnectingIn && 第 &+ paramInt+& 次&);
+ @Override
+ public void reconnectionFailed(Exception paramException) {
Log.v(&ReconnectionListener&, &reconnectionFailed&);
+ @Override
+ public void reconnectionSuccessful() {
Log.v(&ReconnectionListener&, &reconnectionSuccessful&);
Index: szboanda/ydzf/business/xmpp/smack/SmackIQListener.java
===================================================================
--- szboanda/ydzf/business/xmpp/smack/SmackIQListener.java (revision 0)
+++ szboanda/ydzf/business/xmpp/smack/SmackIQListener.java (revision 7)
@@ -0,0 +1,44 @@
+package com.szboanda.ydzf.business.xmpp.
+import org.jivesoftware.smack.PacketL
+import org.jivesoftware.smack.packet.P
+import com.lidroid.xutils.util.LogU
+import com.szboanda.ydzf.business.xmpp.S
+import com.szboanda.ydzf.business.xmpp.YdzfP
+ * &p&IQ类型消息(packet)监听类&/p&
+ * @Company 深圳市博安达信息技术股份有限公司
+ * @author 苏浩 Create Date:
+ * @modify 苏浩
+public class SmackIQListener implements PacketListener {
+ public SmackIQListener(SmackImpl smackable) {
this.smackable =
+ @Override
+ public void processPacket(Packet packet) {
LogUtils.d(&packet.toXML()=& + packet.toXML());
//添加其他自定义IQ
YdzfPacket obj = new YdzfPacket();
obj.setPacket(packet);
String[] el = Smack.getElementInfo(packet);
if(el != null){
obj.setElementName(el[0]);
obj.setNamespace(el[1]);
Smack.onPacketReceived(obj);
/*else if(packet instanceof Ping){
//服务器发过来的ping包,可以用来判断当前连接是否正常
LogUtils.d(&packet.getXmlns()=& + packet.getXmlns());
Index: szboanda/ydzf/business/xmpp/MessageObjectStatus.java
===================================================================
--- szboanda/ydzf/business/xmpp/MessageObjectStatus.java (revision 0)
+++ szboanda/ydz}

我要回帖

更多关于 dw按键加链接 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信