从今天开始写日志啦!!!
刚接触asmack不久,因为看着其他人的代码写的,所以很多地方不了解原理就去实现了,结果碰到好多问题。
添加好友的时候因为需要向对方发起申请,之前是直接调用roster.createEntry(userName, remarkName, new String[]{ groupName});方法,结果是直接添加了好友,他们之间的关系还是none,基本是添加失败的意思。
后来经过尝试用下面的方法:
1、A向B发起添加好友请求
Presence subscription=new Presence(Presence.Type.subscribe); subscription.setTo(userName+"@"+XmppConnectionManager.getInstance().getConnection().getServiceName());
XmppConnectionManager.getInstance().getConnection().sendPacket(subscription);
2、B接受到请求后,需要采用下面的方法回复A,此时的Presence.Type.subscribed与上面是不同
//同意添加
Presence subscription=new Presence(Presence.Type.subscribed);
subscription.setTo(from);
XmppConnectionManager.getInstance().getConnection().sendPacket(subscription);
3、B同意之后还需要向A回复一个好友添加请求
//同意之后添加对方为好友
Presence reSubscription=new Presence(Presence.Type.subscribe);
reSubscription.setTo(from);
XmppConnectionManager.getInstance().getConnection().sendPacket(reSubscription);
4.A会接受到B发起的好友添加请求,同意后双方的关系变为both,即添加成功
5、好友添加的监听如下:
/**
* 添加一个监听,监听好友添加请求。
*/
private void addSubscriptionListener() {
PacketFilter filter = new PacketFilter() {
@Override
public boolean accept(Packet packet) {
if (packet instanceof Presence) {
Presence presence = (Presence) packet;
if (presence.getType().equals(Presence.Type.subscribe)) {
return true;
}
}
return false;
}
};
XmppConnectionManager.getInstance().getConnection().addPacketListener(subscriptionPacketListener, filter);
}
private PacketListener subscriptionPacketListener = new PacketListener() {
@Override
public void processPacket(Packet packet) {
String user = getSharedPreferences(Constant.LOGIN_SET, 0).getString(Constant.USERNAME, null);
if (packet.getFrom().contains(user))
return;
// 如果是自动接收所有请求,则回复一个添加信息
if (Roster.getDefaultSubscriptionMode().equals(SubscriptionMode.accept_all)) {
Presence subscription = new Presence(Presence.Type.subscribe);
subscription.setTo(packet.getFrom());
XmppConnectionManager.getInstance().getConnection().sendPacket(subscription);
} else {
NoticeManager noticeManager = NoticeManager.getInstance(context);
Notice notice = new Notice();
notice.setTitle("好友请求");
notice.setNoticeType(Notice.ADD_FRIEND);
notice.setContent(StringUtil.getUserNameByJid(packet.getFrom())+ "申请加您为好友");
notice.setFrom(packet.getFrom());
notice.setTo(packet.getTo());
notice.setNoticeTime(DateUtil.date2Str(Calendar.getInstance(),Constant.MS_FORMART));
notice.setStatus(Notice.UNREAD);
//long noticeId = noticeManager.saveNotice(notice);
long noticeId=2;
if (noticeId != -1) {
Intent intent = new Intent();
intent.setAction(Constant.ROSTER_SUBSCRIPTION);
notice.setId("" + noticeId);
intent.putExtra("notice", notice);
sendBroadcast(intent);
Log.i("addfriends",packet.getFrom().toString());
setNotiType(R.drawable.ic_launcher, "好友请求",StringUtil.getUserNameByJid(packet.getFrom())
+ "申请加您为好友", AddFriendsActivity.class,packet.getFrom());
}
}
}
};
文中的XmppConnectionManager.getInstance().getConnection()方法即XMPPConnection对象。