为啥不管了图片157hh也没有人来维护下,不是想象的wwW157hhcom那样了

民间谚语流传千年,蕴藏着传统智慧和养生哲学,尤其在饮食上,到现在依然“指导”着我们的日常生活。比如“夏日吃西瓜,药物不用抓”、“夏季食个荔,一夏都无弊”等都朗朗上口,流传甚广。…
推荐阅读HOT
5个小窍门帮你护理头发[03-23]
已婚女性应该做哪些“性运动”[04-12]
最新资讯NEW扫一扫关注官方微信
扫一扫下载APP
酒店酒店常旅客知识社区航空航空常旅客知识社区商城飞客里程-实用的航空里程
后使用快捷导航没有帐号?
发日志广播看帖比价报告优惠攻略IHG报告会籍匹配看帖报告优惠攻略会籍匹配飞客优选飞米商城淘好物
钻石会员, 积分 4009, 距离下一级还需 5991 积分
阅读权限90积分4009注册时间最后登录买家信用卖家信用在线时间154 小时精华0分享记录好友日志相册主题帖子UID42065
Ta的其他好帖:
钻石会员, 积分 4009, 距离下一级还需 5991 积分
一直混在丝版ihg,每次出行都是绞尽脑汁的不要不要的,怎么搞来个早餐,厚着脸要带鱼,送个蛋糕酒水欢呼小确幸。
这次重庆之行攥着D卡体验了两间希尔顿,完全回不去啊,升套带鱼果盘依云水,哦,大副接待,哦哦,还有回血
回去看看ra连个早饭都混不上,
& 洲际、喜达屋等五星酒店布草供货商生产;高支高密面料,透气亲肤 &
超细纤维填充,饱满蓬松,回弹性好,贴合颈椎曲线 &
两种尺寸可选,高矮随意
蓝钻会员, 积分 11450, 距离下一级还需 8550 积分
阅读权限92积分11450注册时间最后登录买家信用卖家信用在线时间120 小时精华3分享记录好友日志相册主题帖子UID114393
蓝钻会员, 积分 11450, 距离下一级还需 8550 积分
一入帕门深似海
银卡会员, 积分 388, 距离下一级还需 112 积分
阅读权限30积分388注册时间最后登录买家信用卖家信用在线时间0 小时精华0分享记录好友日志相册主题帖子UID130649
银卡会员, 积分 388, 距离下一级还需 112 积分
那就赶快住够30S吧
蓝钻会员, 积分 16745, 距离下一级还需 3255 积分
阅读权限92积分16745注册时间最后登录买家信用卖家信用在线时间4070 小时精华1分享记录好友日志相册主题帖子UID1368
蓝钻会员, 积分 16745, 距离下一级还需 3255 积分
钻石会员, 积分 3199, 距离下一级还需 6801 积分
阅读权限90积分3199注册时间最后登录买家信用卖家信用在线时间0 小时精华0分享记录好友日志相册主题帖子UID124048
钻石会员, 积分 3199, 距离下一级还需 6801 积分
我以前也是ihg,来了hh再也没付费住过ihg…
钻石会员, 积分 4190, 距离下一级还需 5810 积分
阅读权限90积分4190注册时间最后登录买家信用卖家信用在线时间11 小时精华1分享记录好友日志相册主题帖子UID121623
钻石会员, 积分 4190, 距离下一级还需 5810 积分
我还以为ihg住多了,人都会变傻呢。感情还有聪明人懂得跳出苦海。
鲜花 (2朵)
送了1朵鲜花:&&太给力了!
送了1朵鲜花:&&感谢前辈!
钻石会员, 积分 4009, 距离下一级还需 5991 积分
阅读权限90积分4009注册时间最后登录买家信用卖家信用在线时间154 小时精华0分享记录好友日志相册主题帖子UID42065
钻石会员, 积分 4009, 距离下一级还需 5991 积分
现在的状况D卡绝对是D,不知道大面积MD出现酒店后情况怎么样,ihg再扣扣索索也只剩下布局了
钻石会员, 积分 4009, 距离下一级还需 5991 积分
阅读权限90积分4009注册时间最后登录买家信用卖家信用在线时间154 小时精华0分享记录好友日志相册主题帖子UID42065
钻石会员, 积分 4009, 距离下一级还需 5991 积分
yysyd 发表于
我还以为ihg住多了,人都会变傻呢。感情还有聪明人懂得跳出苦海。
您这是夸我还是骂我
钻石会员, 积分 3530, 距离下一级还需 6470 积分
阅读权限90积分3530注册时间最后登录买家信用卖家信用在线时间1 小时精华0分享记录好友日志相册主题帖子UID53256
钻石会员, 积分 3530, 距离下一级还需 6470 积分
ihg的英迪格还是很爱的.
钻石会员, 积分 5837, 距离下一级还需 4163 积分
阅读权限90积分5837注册时间最后登录买家信用卖家信用在线时间155 小时精华0分享记录好友日志相册主题帖子UID120165
钻石会员, 积分 5837, 距离下一级还需 4163 积分
ihg价格还是可以的,如果自费来算
蓝钻会员, 积分 14137, 距离下一级还需 5863 积分
阅读权限92积分14137注册时间最后登录买家信用卖家信用在线时间157 小时精华1分享记录好友日志相册主题帖子UID97645
蓝钻会员, 积分 14137, 距离下一级还需 5863 积分
HHonor 发表于
ihg价格还是可以的,如果自费来算
钻石会员, 积分 8281, 距离下一级还需 1719 积分
阅读权限90积分8281注册时间最后登录买家信用卖家信用在线时间140 小时精华0分享记录好友日志相册主题帖子UID74466
钻石会员, 积分 8281, 距离下一级还需 1719 积分
跳不出来主要还是因为穷
蓝钻会员, 积分 14137, 距离下一级还需 5863 积分
阅读权限92积分14137注册时间最后登录买家信用卖家信用在线时间157 小时精华1分享记录好友日志相册主题帖子UID97645
蓝钻会员, 积分 14137, 距离下一级还需 5863 积分
iyeti 发表于
现在的状况D卡绝对是D,不知道大面积MD出现酒店后情况怎么样,ihg再扣扣索索也只剩下布局了
这还要看酒店吧……
现在不是版上有的贴发有的酒店m的D(o住)和住的D区别对待嘛……
钻石会员, 积分 4009, 距离下一级还需 5991 积分
阅读权限90积分4009注册时间最后登录买家信用卖家信用在线时间154 小时精华0分享记录好友日志相册主题帖子UID42065
钻石会员, 积分 4009, 距离下一级还需 5991 积分
yuri 发表于
跳不出来主要还是因为穷
感觉ihg的促销做的强,但真正的消费并不比H来的便宜,当然是同级别同档次情况下
白金会员, 积分 1021, 距离下一级还需 1979 积分
阅读权限70积分1021注册时间最后登录买家信用卖家信用在线时间9 小时精华0分享记录好友日志相册主题帖子UID105779
白金会员, 积分 1021, 距离下一级还需 1979 积分
HH大放水是一盘大棋。
钻石会员, 积分 8281, 距离下一级还需 1719 积分
阅读权限90积分8281注册时间最后登录买家信用卖家信用在线时间140 小时精华0分享记录好友日志相册主题帖子UID74466
钻石会员, 积分 8281, 距离下一级还需 1719 积分
iyeti 发表于
感觉ihg的促销做的强,但真正的消费并不比H来的便宜,当然是同级别同档次情况下
而且同样等级酒店体验也赶不上HH啊
钻石会员, 积分 9375, 距离下一级还需 625 积分
阅读权限90积分9375注册时间最后登录买家信用卖家信用在线时间540 小时精华1分享记录好友日志相册主题帖子UID45075
钻石会员, 积分 9375, 距离下一级还需 625 积分
ihg的精髓是刷ra让老婆开小号
没有利益相关、文风辛辣直接;若怕心酸梦碎,烦请自行拉黑
蓝钻会员, 积分 13377, 距离下一级还需 6623 积分
阅读权限92积分13377注册时间最后登录买家信用卖家信用在线时间151 小时精华3分享记录好友日志相册主题帖子UID54376
没有利益相关、文风辛辣直接;若怕心酸梦碎,烦请自行拉黑
蓝钻会员, 积分 13377, 距离下一级还需 6623 积分
iyeti 发表于
感觉ihg的促销做的强,但真正的消费并不比H来的便宜,当然是同级别同档次情况下
其实促销也不强……只是够忽悠
每年攒不到十万分就别折腾常旅客,删号放飞自我剪掉普卡奔向自由
“无条件维护企业利益自干五”和“不薅企业判三年谁挡我谁圣母”之间中立地带就是我了
本坛极品人士:
晨曦寒萧(某游版主爱阴阳怪气点评骚扰发大字报)
Alec/AlecJH(某装13App小编声称机上问cc要水要拖鞋的都是穷抠臭屌丝、经济舱农民都该闭上嘴别添乱
蓝钻会员, 积分 13668, 距离下一级还需 6332 积分
阅读权限92积分13668注册时间最后登录买家信用卖家信用在线时间99 小时精华0分享记录好友日志相册主题帖子UID99834
蓝钻会员, 积分 13668, 距离下一级还需 6332 积分
钻石会员, 积分 9277, 距离下一级还需 723 积分
阅读权限90积分9277注册时间最后登录买家信用卖家信用在线时间856 小时精华0分享记录好友日志相册主题帖子UID1826
钻石会员, 积分 9277, 距离下一级还需 723 积分
ihg积分房没待遇就很过分,好像积分是白来的似的
钻石会员, 积分 4190, 距离下一级还需 5810 积分
阅读权限90积分4190注册时间最后登录买家信用卖家信用在线时间11 小时精华1分享记录好友日志相册主题帖子UID121623
钻石会员, 积分 4190, 距离下一级还需 5810 积分
iyeti 发表于
您这是夸我还是骂我
非夸非骂,只是共勉。我也曾给ihg不少机会,贡献过不少,起初以为自己级别低,后来以为个别酒店抠儿。最终发现还是自己太**,为了免房和活动送的仨瓜俩枣,落入这么个糟心的计划。
鲜花 (1朵)
送了1朵鲜花:&&Life is better when shared!
白金会员, 积分 1432, 距离下一级还需 1568 积分
阅读权限70积分1432注册时间最后登录买家信用卖家信用在线时间0 小时精华0分享记录好友日志相册主题帖子UID127500
白金会员, 积分 1432, 距离下一级还需 1568 积分
金卡会员, 积分 584, 距离下一级还需 416 积分
阅读权限50积分584注册时间最后登录买家信用卖家信用在线时间0 小时精华0分享记录好友日志相册主题帖子UID134094
金卡会员, 积分 584, 距离下一级还需 416 积分
现在就指着一月份用D卡去试试了。。。
蓝钻会员, 积分 12081, 距离下一级还需 7919 积分
阅读权限92积分12081注册时间最后登录买家信用卖家信用在线时间422 小时精华0分享记录好友日志相册主题帖子UID29351
蓝钻会员, 积分 12081, 距离下一级还需 7919 积分
IHG 只适合刷活动 ,换PB 房,现在PB 也不给力了,完全没动力。
钻石会员, 积分 8281, 距离下一级还需 1719 积分
阅读权限90积分8281注册时间最后登录买家信用卖家信用在线时间140 小时精华0分享记录好友日志相册主题帖子UID74466
钻石会员, 积分 8281, 距离下一级还需 1719 积分
H在国内和IHG比还是分布太差,一般只要去的地方有H且预算够,是毫无悬念的。
旗帜鲜明的反对一切为了羊毛舍本求末创造消费的强
蓝钻会员, 积分 12604, 距离下一级还需 7396 积分
阅读权限92积分12604注册时间最后登录买家信用卖家信用在线时间340 小时精华0分享记录好友日志相册主题帖子UID94309
蓝钻会员, 积分 12604, 距离下一级还需 7396 积分
iyeti 发表于
感觉ihg的促销做的强,但真正的消费并不比H来的便宜,当然是同级别同档次情况下
最重要的是早饭什么卡都不给
hi,我的微信号yzjdfx,汇报一些及时的常客信息,聊聊天谈谈心…
钻石会员, 积分 3734, 距离下一级还需 6266 积分
阅读权限90积分3734注册时间最后登录买家信用卖家信用在线时间119 小时精华0分享记录好友日志相册主题帖子UID49359
钻石会员, 积分 3734, 距离下一级还需 6266 积分
leigh1913 发表于
最重要的是早饭什么卡都不给
赞同,对于我们早餐党来说这是硬伤
白金会员, 积分 2973, 距离下一级还需 27 积分
阅读权限70积分2973注册时间最后登录买家信用卖家信用在线时间100 小时精华0分享记录好友日志相册主题帖子UID90513
白金会员, 积分 2973, 距离下一级还需 27 积分
iyeti 发表于
一直混在丝版ihg,每次出行都是绞尽脑汁的不要不要的,怎么搞来个早餐,厚着脸要带鱼,送个蛋糕酒水欢呼小 ...
两路口没送依云吧,大波吹倒是送一个大瓶,或者气泡水。
蓝钻会员, 积分 10569, 距离下一级还需 9431 积分
阅读权限92积分10569注册时间最后登录买家信用卖家信用在线时间62 小时精华1分享记录好友日志相册主题帖子UID116986
蓝钻会员, 积分 10569, 距离下一级还需 9431 积分
我也回不去了,IC只是备选的备选
钻石会员, 积分 6632, 距离下一级还需 3368 积分
阅读权限90积分6632注册时间最后登录买家信用卖家信用在线时间447 小时精华0分享记录好友日志相册主题帖子UID49474
钻石会员, 积分 6632, 距离下一级还需 3368 积分
不过HH保级吊丝感觉好难,不如IHG或者雅高来得容易啊。。。IHG每年只要买鳝鱼就保P了,雅高参加几次活动,就算没有刚需,硬刷都是千来块钱就保P。。。
HH 30STAY对于自费吊丝难如登天啊。。。
飞客智囊团
飞客智囊团是飞客最忠实的会员,为广大飞客答疑解惑。
申请条件:
1)注册三个月以上
2)白金会员以上
3)每月求助问答回帖大于30
4)擅长酒店、航空、信用卡领域
通过认证的帅哥,特颁发此奖!
1、最近1年内酒店、航空版块帖子被转化为文章的数量大于1篇,可获得此勋章
2、获得勋章后,威望值+30、飞米数+500
飞客探索者
1、最近1年内酒店、航空版块帖子被转化为文章的数量大于5篇,可获得此勋章
2、获得勋章后,威望值+50、飞米数+5000
飞客旅行家
1、最近1年内酒店、航空版块帖子被转化为文章的数量大于15篇,可获得此勋章
2、获得勋章后,威望值+100、飞米数+30000
才华横溢勋章
1、最近1年内在酒店、航空、信用卡各版块下发帖并获得热帖标识的帖子数量超过1篇,可获得此勋章
2、获得勋章后,威望值+10
学富五车勋章
1、最近1年内在酒店、航空、信用卡各版块下发帖并获得热帖标识的帖子数量超过5篇,可获得此勋章
2、获得勋章后,威望值+30,飞米值+500
满腹经纶勋章
1、最近1年内在酒店、航空、信用卡各版块下发帖并获得热帖标识的帖子数量超过10篇,可获得此勋章
2、获得勋章后,威望值+50,飞米值+5000
妙笔生花勋章
1、注册至今,累计获得鲜花数不少于200朵,可获得此勋章
2、获得勋章后,威望值+50、鲜花数+10
繁花似锦勋章
1、注册至今,累计获得鲜花数不少于500朵,可获得此勋章
2、获得勋章后,威望值+100、鲜花数+30
热心会员勋章
1、我热心我光荣,为论坛繁荣做出贡献,特颁发此奖!
2、颁发标准:发帖数+精华数*10+威望*2+鲜花&10000
摄影师勋章
热衷摄影原创,摄影作品优质高产,特颁发此奖!
飞客元老勋章
1、注册至今超过2000天,可获得此勋章
2、获得勋章后,威望值+100
通过认证的美女,特颁发此奖!
雪中送炭勋章
1、最近30天内在社区求助问答分类下回帖达到20次,可获得此勋章
2、获得勋章后,威望值+10
谈古论今勋章
1、最近30天内在社区心得攻略、入住报告、飞行报告、机场报告、出行报告、申卡心得、用卡经验、活动优惠分类下回帖达到20次,可获得此勋章
2、获得勋章后,威望值+10
古道热肠勋章
1、最近30天内在社区求助问答分类下回帖达到50次,可获得此勋章
2、获得勋章后,威望值+20
百家争鸣勋章
1、最近30天内在社区心得攻略、入住报告、飞行报告、机场报告、出行报告、申卡心得、用卡经验、活动优惠分类下回帖达到50次,可获得此勋章
2、获得勋章后,威望值+20
助人为乐勋章
1、最近30天内在社区求助问答分类下回帖达到10次,可获得此勋章
2、获得勋章后,威望值+5
以文会友勋章
1、最近30天内在社区心得攻略、入住报告、飞行报告、机场报告、出行报告、申卡心得、用卡经验、活动优惠分类下回帖达到10次,可获得此勋章
2、获得勋章后,威望值+5
荣誉客会精英钻石会籍
申请条件:
1)希尔顿荣誉客会精英钻石会籍;
2)已通过实名认证;
3)申请时需上传证明材料
下笔成章勋章
1、最近30天内在社区心得攻略、入住报告、飞行报告、机场报告、出行报告、申卡心得、用卡经验、活动优惠分类下发帖达到5次,可获得此勋章
2、获得勋章后,威望值+5
前程万里Premier 1K
申请条件:
1)美国联合航空前程万里Premier 1K;
2)已通过实名认证;
3)申请时需上传证明材料
荣誉客会官方客服入驻飞客茶馆
希尔顿荣誉客会常用链接
本版最新优惠
本版热门话题
本版最新热门
(window.slotbydup=window.slotbydup || []).push({
id: '4540530',
container: s,
size: '950,90',
display: 'inlay-fix'
关注订阅号404 Not Found
404 Not Found
The requested URL was not found on this server.
您要找的内容已被删除其他差不多410hh的入口是什么,为啥wwW410hhcOm的入口点经常便换_百度知道
其他差不多410hh的入口是什么,为啥wwW410hhcOm的入口点经常便换
我有更好的答案
累斯的,a3sg.us这有个
采纳率:100%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。关于WIFI就不多介绍啦,直接来个段子吧。
问:“WiFi对人体有伤害么?”
答:“不清楚,反正没有WiFi我就浑身不舒服。
比较重要的一点就是WifiManager &wm=(WifiManager)Android_Wifi.this.getSystemService(Context.WIFI_SERVICE);
关闭打开搜索都可以通过调用wm的相关方法实现。可能要开发wifi万能钥匙那一类的程序才用到这个吧,普通应用程序主要就识别是wifi网络还是移动网络。不多讲
代码参考博客:http://blog.csdn.net/sbvfhp/article/details/7007090
重点蓝牙:
 一:什么是蓝牙
    1:Bluetooth是目前使用最广泛的无线通讯协议,近距离无线通讯的标准。传说瑞典有个国王特别爱吃蓝莓导致自己的牙齿天天都是蓝色的,在他执政期间这位国王非常善于交际,能说会到,和邻国的搞得关系非常好,这个Bluetooth的发明者觉得蓝牙它的作用就是在近距离沟通周围的设备,跟这个国王很类似,于是起名叫蓝牙。
    2:主要针对短距离设备通讯(10米)
    3:无线耳机,无线鼠标,无线键盘
 二:蓝牙工作流程图
    首先两个设备上都要有蓝牙设备或者专业一点叫蓝牙适配器,以手机和电脑为例我画了如下流程图。其次在手机上进行扫描,扫描周围蓝蓝牙设备,先找到手机附近的电脑,然后给它发出一个信号需要进行蓝牙的配对,再次返回一个信号说明手机和电脑已经配对成功了,最后配对成功后可以进行文件传输了。这是一个最基本的一个流程。
  三:蓝牙开发相关类
  在Android手机中开发蓝牙程序时,离不开几个类:
BluetoothSocket:close() &connect() &getInputStream()......
BluetoothServerSocket : accept()
BlutoothAdapter :代表本地的蓝牙适配器设备,通过此类可以让用户能执行基本的蓝牙任务。
BluetoothClass: 代表了一个描述设备通用特性和功能的蓝牙类。比如一个蓝牙类会指定如电话、计算机或耳机的通用设备类型。
BluetoothClass.Service:&
BluetoothClass.Device:
BluetoothClass.Device.Major: 定义了主要设备类的常量
其中与蓝牙相关的最重要的两个API
   1:BuletoothAdapter
  这个类的对象代表了本地的蓝牙适配器,相当于蓝牙工作流程图中的手机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那么手机上的蓝牙适配器就是本地蓝牙适配器。
   2:BuletoothDevice
   这个类的对象代表了远程的蓝牙设备,相当于蓝牙工作流程图中的计算机里的蓝牙适配器,也就是说比如这个应用程序是运行在手机上,那么BuletoothDevice代表了你要连接的远程的那个设备上面的蓝牙适配器。
&四:蓝牙开发步骤:
此部分转载于&http://zhouyunan2010.iteye.com/blog/1186021
从查找蓝牙设备到能够相互通信要经过几个基本步骤(本机做为服务器):&
1.设置权限&
在manifest中配置&
&uses-permission android:name=&android.permission.BLUETOOTH&/&
&uses-permission android:name=&android.permission.BLUETOOTH_ADMIN&/&
2.启动蓝牙&
首先要查看本机是否支持蓝牙,获取BluetoothAdapter蓝牙适配器对象&
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter == null){
//表明此手机不支持蓝牙
if(!mBluetoothAdapter.isEnabled()){
//蓝牙未开启,则开启蓝牙
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
public void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode == REQUEST_ENABLE_BT){
if(requestCode == RESULT_OK){
//蓝牙已经开启
3。发现蓝牙设备&
这里可以细分为几个方面&
(1)使本机蓝牙处于可见(即处于易被搜索到状态),便于其他设备发现本机蓝牙&
//使本机蓝牙在300秒内可被搜索
private void ensureDiscoverable() {
if (mBluetoothAdapter.getScanMode() !=
BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
(2)查找已经配对的蓝牙设备,即以前已经配对过的设备&
Set&BluetoothDevice& pairedDevices = mBluetoothAdapter.getBondedDevices();
if (pairedDevices.size() & 0) {
findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
for (BluetoothDevice device : pairedDevices) {
//device.getName() +& &+ device.getAddress());
mPairedDevicesArrayAdapter.add(&没有找到已匹对的设备&);
(3)通过mBluetoothAdapter.startDiscovery();搜索设备,要获得此搜索的结果需要注册&
一个BroadcastReceiver来获取。先注册再获取信息,然后处理&
//注册,当一个设备被发现时调用onReceive
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
this.registerReceiver(mReceiver, filter);
//当搜索结束后调用onReceive
filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
this.registerReceiver(mReceiver, filter);
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(BluetoothDevice.ACTION_FOUND.equals(action)){
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 已经配对的则跳过
if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
mNewDevicesArrayAdapter.add(device.getName() + &\n& + device.getAddress());
//保存设备地址与名字
}else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
//搜索结束
if (mNewDevicesArrayAdapter.getCount() == 0) {
mNewDevicesArrayAdapter.add(&没有搜索到设备&);
4.建立连接&
查找到设备 后,则需要建立本机与其他设备之间的连接。&
一般用本机搜索其他蓝牙设备时,本机可以作为一个服务端,接收其他设备的连接。&
启动一个服务器端的线程,死循环等待客户端的连接,这与ServerSocket极为相似。&
这个线程在准备连接之前启动&
5.交换数据
搜索到设备后可以获取设备的地址,通过此地址获取一个BluetoothDeviced对象,可以看做客户端,通过此对象device.createRfcommSocketToServiceRecord(MY_UUID);同一个UUID可与服务器建立连接获取另一个socket对象,由此服务端与客户端各有一个socket对象,此时&
他们可以互相交换数据了。&
创立客户端socket可建立线程&
6.建立数据通信线程,进行读取数据&
//建立连接后,进行数据通信的线程
private class ConnectedThread extends Thread{
private BluetoothS
private InputStream inS
private OutputStream outS
public ConnectedThread(BluetoothSocket socket){
this.socket =
//获得输入输出流
inStream = socket.getInputStream();
outStream = socket.getOutputStream();
} catch (IOException e) {
Log.e(&app&, &temp sockets not created&, e);
public void run(){
byte[] buff = new byte[1024];
int len=0;
//读数据需不断监听,写不需要
while(true){
len = inStream.read(buff);
//把读取到的数据发送给UI进行显示
Message msg = handler.obtainMessage(BluetoothChat.MESSAGE_READ,
len, -1, buff);
msg.sendToTarget();
} catch (IOException e) {
Log.e(&app&, &disconnected&, e);
connectionLost();
//失去连接
//重新启动服务器
public void write(byte[] buffer) {
outStream.write(buffer);
// Share the sent message back to the UI Activity
handler.obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, -1, buffer)
.sendToTarget();
} catch (IOException e) {
Log.e(&app&, &Exception during write&, e);
public void cancel() {
socket.close();
} catch (IOException e) {
Log.e(&app&, &close() of connect socket failed&, e);
到这里,蓝牙通信的基本操作已经全部完成。&
五:蓝牙聊天室开发
源码参考&http://download.csdn.net/detail/mr_raptor/8033951#comment &
此demo界面优美,实现基本功能,但不能保存聊天记录,黑屏自动断线,在此基础做出修改。
& & &相关知识:
&源码分析: &
Utils.java
1 package cn.com.farsgiht.bluetoothdemo.
3 import android.app.A
4 import android.app.N
5 import android.app.NotificationM
6 import android.app.PendingI
7 import android.content.C
8 import android.content.I
9 import cn.com.farsgiht.bluetoothdemo.R;
11 public class Utils {
public static final int NOTIFY_ID1 = 1001;
public static void notifyMessage(Context context, String msg, Activity activity){
PendingIntent contentIntent = null;
NotificationM
// 发送通知需要用到NotificationManager对象
nm = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
// 消息对象
Intent notificationIntent = new Intent(context, activity.getClass());
// PendingIntent.getActivity(Context context, int requestCode, Intent intent, int flags)
// 用来获得一个挂起的PendingIntent,让该Intent去启动新的Activity来处理通知
contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
//定义通知栏展现的内容信息
int icon = R.drawable.
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, msg, when);
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_SOUND; // 调用系统自带声音
notification.flags |= Notification.FLAG_AUTO_CANCEL; // 点击清除按钮或点击通知后会自动消失
notification.defaults |= Notification.DEFAULT_LIGHTS;
notification.vibrate = new long[]{300, 500};
notification.setLatestEventInfo(context, &BluetoothChat&, msg, contentIntent);
/* // 定制我们要在状态栏显示的通知样式
builder = new Notification(context);
builder.setContentIntent(contentIntent)
.setSmallIcon(R.drawable.ic_launcher)//设置状态栏里面的图标(小图标)                     .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.i5))//下拉下拉列表里面的图标(大图标)        .setTicker(&this is bitch!&) //设置状态栏的显示的信息
.setWhen(System.currentTimeMillis())//设置时间发生时间
.setAutoCancel(true)//设置可以清除
.setContentTitle(&This is ContentTitle&)//设置下拉列表里的标题
.setContentText(&this is ContentText&);//设置上下文内容
// 获得刚才创建的通知对象
// Notification notification = builder.getNotification();//获取一个Notification
// 通过NotificationManger来发送通知消息
// 参数1通知的ID,参数2发送哪个通知
nm.notify(NOTIFY_ID1, notification);
通知栏相关代码
& & &2. PageIndicatorView.java
1 package cn.com.farsgiht.bluetoothdemo.UI;
3 import cn.com.farsgiht.bluetoothdemo.R;
4 import android.content.C
5 import android.graphics.B
6 import android.graphics.BitmapF
7 import android.widget.ImageV
8 import android.widget.LinearL
10 public class PageIndicatorView extends ImageView {
private final String TAG = &PageIndicatorView&;
private LinearLayout mPageIndicL
public PageIndicatorView(Context context) {
super(context);
setSelectedView(false);
public void setSelectedView(boolean selected){
if(selected){
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.page_select);
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.page_item);
this.setImageBitmap(bitmap);
   & & &表情页页面指示器
  3. DrawerHScrollView.java
1 package cn.com.farsgiht.bluetoothdemo.UI;
3 import java.util.H
5 import android.content.C
6 import android.util.AttributeS
7 import android.util.L
8 import android.view.G
9 import android.view.ViewG
10 import android.view.ViewP
11 import android.widget.HorizontalScrollV
12 import android.widget.LinearL
14 public class DrawerHScrollView extends HorizontalScrollView {
private static final String TAG = &DrawerHScrollView&;
private int currentPage = 0;
private int totalPages = 1;
private static Hashtable&Integer, Integer& positionLeftTopOfPages = new Hashtable();
private LinearLayout mPageIndicL
private Context mC
public DrawerHScrollView(Context context) {
super(context);
this.mContext =
public DrawerHScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext =
public DrawerHScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.mContext =
public void cleanup(){
currentPage = 0;
totalPages = 1;
if(positionLeftTopOfPages != null){
positionLeftTopOfPages.clear();
public void setParameters(int totalPages, int currentPage, int scrollDisX, int space) {
Log.d(TAG, &~~~~~setParameters totalPages:&+totalPages +&,currentPage:&+ currentPage +&,scrollDisX:&+scrollDisX);
this.totalPages = totalP
this.currentPage = currentP
positionLeftTopOfPages.clear();
for (int i = 0;i & totalPi++){
int posx = (scrollDisX) * i -
positionLeftTopOfPages.put(i, posx);
Log.d(TAG, &~~~~~setParameters i:&+i +&,posx:&+posx);
smoothScrollTo(0, 0);
setPageIndicLayout();
if(mPageIndicLayout != null){
updateDrawerPageLayout(totalPages, currentPage);
public void setPageIndicLayout(){
// 添加表情多页图标布局
mPageIndicLayout = new LinearLayout(mContext);
mPageIndicLayout.setGravity(Gravity.CENTER);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
mPageIndicLayout.setLayoutParams(params);
ViewParent parent = this.getParent();
if(parent instanceof LinearLayout){
LinearLayout layout = (LinearLayout)
layout.addView(mPageIndicLayout, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
public void fling(int velocityX) {
Log.v(TAG, &--&fling velocityX:&+velocityX);
boolean change_flag = false;
if (velocityX & 0 && (currentPage & totalPages - 1)){
currentPage++;
change_flag = true;
} else if (velocityX & 0 && (currentPage & 0)){
currentPage--;
change_flag = true;
if (change_flag){
int postionTo = (Integer)positionLeftTopOfPages.get(new Integer(currentPage)).intValue();
Log.v(TAG, &------smoothScrollTo posx:&+postionTo);
smoothScrollTo(postionTo, 0);
updateDrawerPageLayout(totalPages, currentPage);
//super.fling(velocityX);
public void updateDrawerPageLayout(int total_pages, int sel_page) {
Log.e(TAG, &~~~updateBooksPageLayout total_pages:& + total_pages
+ &,sel_page:& + sel_page);
mPageIndicLayout.removeAllViews();
if (total_pages &= 0 || sel_page & 0 || sel_page &= total_pages) {
Log.e(TAG, &total_pages or sel_page is outofrange.&);
for (int i = 0; i & total_ i++) {
if (i != 0) {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.setMargins(5, 0, 0, 0);
mPageIndicLayout.addView(new PageIndicatorView(mContext), params);
mPageIndicLayout.addView(new PageIndicatorView(mContext));
PageIndicatorView selItem = (PageIndicatorView) mPageIndicLayout
.getChildAt(sel_page);
selItem.setSelectedView(true);
    定制的表情页面,继承HorizontalScrollView,支持水平滑动。需要说明的是页面指示器的布局是通过代码实现的,而不是在xml文件中
  4. ChatListViewAdapter.java
    消息适配器。发送的消息存放在mDatalist中
& & & & & &在activity_chat.xml设置android:listSelector=&#00FFFFFF&可以避免点击消息时出现的矩形框。
& & & & & &重写的getView中实现自己发送的消息显示在右边,别人发送的消息显示在左边。
    TouchListener实现触摸消息变成密码形态,并在onclick方法中再次调用。我想大概是因为触摸和点击本来就不好区分吧。同时在点击事件里不要忘了设置消息显示的形态,因为listview在重绘时需要考虑这一点。
    Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。&
优化的思路两种:&
1. View的重用&
&&& View的每次创建是比较耗时的,因此对于getview方法传入的convertView应充分利用 != null的判断&
2.ViewHolder的应用&
View的findViewById()方法也是比较耗时的,因此需要考虑只调用一次,ViewHolder就是一个持有者的类,他里面一般没有方法,只有属性,作用就是一个临时的储存器,把你getView方法中每次返回的View存起来,可以下次再用。这样做的好处就是不必每次都到布局文件中去拿到你的View,提高了效率。
&  5. Task.java定义了一些常量
  &6. TaskService.java &
     前面写到的蓝牙通信的几步走也是在这里面实现的
分为几个线程:
AcceptThread&等待客户端连接线程&
ConnectThread(BluetoothDevice device)&作为客户端连接指定的蓝牙设备线程
ConnectedThread(BluetoothSocket socket) &在客户端,使用一个单独的BluetoothSocket类去初始化一个外接连接和管理该连接,发送消息也在这个线程里面
TaskThread总线程和mTaskList一起协调上面三个线程的运行工作。
要搞清TaskServic的原理,理清两个变量很重要:mServiceHandler &mActivityHandler
mServiceHandler:监控着连接状态的变化,如断线,连接成功,连接中
mActivityHandler:监控着信息状态的变化,起到通知主Activity的作用。如:发消息,收消息。
7. SoundEffect.java&
& & 音效相关的类,实现了一个OnLoadCompleteListener接口,还有一个play() 方法,决定播放哪一首歌曲。
8. DataProtocol 和 Message
  DataProtocol&是对不同的消息类型进行打包和解包
  Message 定义了消息的几个参数
9. SelectDevice &DownloadActivity & ChatActivity 是应用程序里面的三个Activity
&自己修改说明:
&ChatActivity加入再按一次退出功能,更加人性化。加入消息记录功能。
消息记录实现概述:当在服务中开始收发发送消息时,就通过mActivityHandler通知ChatActivity,完成数据库读写操作。
ChatActivity.java:
1 package cn.com.farsgiht.
3 import java.text.SimpleDateF
4 import java.util.ArrayL
5 import java.util.HashM
6 import android.app.A
7 import android.app.AlertD
8 import android.bluetooth.BluetoothA
9 import android.bluetooth.BluetoothD
10 import android.content.ContentV
11 import android.content.C
12 import android.content.DialogI
13 import android.content.DialogInterface.OnClickL
14 import android.content.I
15 import android.database.sqlite.SQLiteD
16 import android.graphics.B
17 import android.graphics.BitmapF
18 import android.os.B
19 import android.os.H
20 import android.os.M
21 import android.text.S
22 import android.text.SpannableS
23 import android.text.style.ImageS
24 import android.util.DisplayM
25 import android.util.L
26 import android.view.D
27 import android.view.G
28 import android.view.KeyE
29 import android.view.LayoutI
30 import android.view.M
31 import android.view.MenuI
32 import android.view.MenuI
33 import android.view.V
34 import android.view.ViewG
35 import android.view.inputmethod.InputMethodM
36 import android.widget.AdapterV
37 import android.widget.AdapterView.OnItemClickL
38 import android.widget.B
39 import android.widget.EditT
40 import android.widget.GridV
41 import android.widget.ImageV
42 import android.widget.LinearL
43 import android.widget.LinearLayout.LayoutP
44 import android.widget.ListV
45 import android.widget.SimpleA
46 import android.widget.T
47 import cn.com.farsgiht.bluetoothdemo.UI.ChatListViewA
48 import cn.com.farsgiht.bluetoothdemo.UI.DrawerHScrollV
49 import cn.com.farsgiht.bluetoothdemo.sound.SoundE
50 import cn.com.farsgiht.bluetoothdemo.task.T
51 import cn.com.farsgiht.bluetoothdemo.task.TaskS
52 import cn.com.farsgiht.bluetoothdemo.utils.U
54 public class ChatActivity extends Activity implements View.OnClickListener{
private final String TAG = &ChatActivity&;
public static int sAliveCount = 0;
public static final String EXTRA_MESSAGER = &cn.com.farsgiht.bluetoothdemo.BUNDLE&;
public static final String DEVICE_NAME = &device_name&;
// 蓝牙状态变量
private static int sBTState = -1;
private final int REQUES_BT_ENABLE_CODE = 123;
private final int REQUES_SELECT_BT_CODE = 222;
private ListView mL
private EditText mI
private Button mSendB
private ImageView mEmoB
private GridView mGridV
private boolean isUpdate = false;
private BluetoothDevice mRemoteD
private LinearLayout mRootLayout, mChatL
private View mEmoV
private boolean isShowEmo = false;
private boolean isHaspressed = false;
private int mScrollH
private DrawerHScrollView mScrollV
private ChatListViewAdapter mAdapter2;
private ArrayList&HashMap&String, Object&& mChatContent2 = new ArrayList&HashMap&String, Object&&();
private BluetoothAdapter mBluetoothA
private ArrayList&HashMap&String, Object&& mEmoList = new ArrayList&HashMap&String, Object&&();
// 已连接设备的名字
private String mConnectedDeviceName = null;
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
//设置聊天信息的时间
SimpleDateFormat df0 = new SimpleDateFormat(&MM-dd HH:mm:ss&);
String pdate=df0.format(System.currentTimeMillis()).toString();
switch(msg.what){
showToast(&没有连接其它用户,点击\&Menu\&扫描并选择周国用户&);
SoundEffect.getInstance(ChatActivity.this).play(SoundEffect.SOUND_ERR);
case Task.TASK_SEND_MSG:
showToast(msg.obj.toString());
String writeMessage = msg.obj.toString();
if(writeMessage!=null && isHaspressed)
//将发送的信息插入到数据库
ContentValues values=new ContentValues();
values.put(&name&, &我&);
values.put(&pdate&,pdate);
values.put(&informations&, writeMessage);
//创建数据库
DatabaseHelper insertdbHelper=new DatabaseHelper(ChatActivity.this,&zhsf_db&);
SQLiteDatabase insertdb=insertdbHelper.getWritableDatabase();
insertdb.insert(&info&, null, values);
if(sAliveCount &= 0){
Utils.notifyMessage(ChatActivity.this, msg.obj.toString(), ChatActivity.this);
case Task.TASK_RECV_MSG:
String readMessage =((HashMap&String,Object&) msg.obj).get(ChatListViewAdapter.KEY_TEXT).toString();
mConnectedDeviceName = ((HashMap&String,Object&) msg.obj).get(ChatListViewAdapter.KEY_NAME).toString();
if(readMessage!=null)
//将接受的信息插入到数据库
ContentValues values2=new ContentValues();
values2.put(&name&, mConnectedDeviceName);
values2.put(&pdate&,pdate);
values2.put(&informations&, readMessage);
DatabaseHelper insertdbHelper2=new DatabaseHelper(ChatActivity.this,&zhsf_db&);
SQLiteDatabase insertdb2=insertdbHelper2.getWritableDatabase();
insertdb2.insert(&info&, null, values2);
if(msg.obj == null)
if(msg.obj instanceof HashMap&?, ?&){
showTargetMessage((HashMap&String, Object&) msg.obj);
if(sAliveCount &= 0){
Utils.notifyMessage(ChatActivity.this, &您有未读取消息&, ChatActivity.this);
case Task.TASK_GET_REMOTE_STATE:
setTitle((String)msg.obj);
if(sAliveCount &= 0){
if(isBTStateChanged(msg.arg1) && msg.arg1 != TaskService.BT_STAT_WAIT)
Utils.notifyMessage(ChatActivity.this, (String)msg.obj, ChatActivity.this);
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
// 获得蓝牙管理器
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Log.e(TAG, &Your device is not support Bluetooth!&);
Toast.makeText(this, &该设备没有蓝牙设备&, Toast.LENGTH_LONG).show();
mRootLayout = (LinearLayout) findViewById(R.id.root);
mChatLayout = (LinearLayout) findViewById(R.id.topPanel);
mList = (ListView) findViewById(R.id.listView1);
mAdapter2 = new ChatListViewAdapter(this, mChatContent2);
mList.setAdapter(mAdapter2);
// 初始化表情
mEmoView = initEmoView();
mInput = (EditText) findViewById(R.id.inputEdit);
mInput.setOnClickListener(new android.view.View.OnClickListener() {
public void onClick(View v) {
// 点击输入框后,隐藏表情,显示输入法
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mInput, 0);
showEmoPanel(false);
mSendBtn = (Button) findViewById(R.id.sendBtn);
mEmoButton = (ImageView) findViewById(R.id.emotionBtn);
mSendBtn.setOnClickListener(this);
mEmoButton.setOnClickListener(this);
//---------------------------------------------------------------------
// 打开蓝牙设备
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUES_BT_ENABLE_CODE);
// 默认设备作为服务端
startServiceAsServer();
//---------------------------------------------------------------------
private View initEmoView(){
if(mEmoView == null){
LayoutInflater inflater = getLayoutInflater();
mEmoView = inflater.inflate(R.layout.emo_layout, null);
mScrollView = (DrawerHScrollView) mEmoView.findViewById(R.id.scrollView);
mGridView = (GridView) mEmoView.findViewById(R.id.gridView);
mGridView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView&?& parent, View view,
int position, long id) {
// 在android中要显示图片信息,必须使用Bitmap位图的对象来装载
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), (Integer) mEmoList.get(position).get(&img&));
ImageSpan imageSpan = new ImageSpan(ChatActivity.this, bitmap);
SpannableString spannableString = new SpannableString((String) mEmoList.get(position).get(&text&));//face就是图片的前缀名
spannableString.setSpan(imageSpan, 0, 8,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mInput.append(spannableString);
System.out.println(&mInput:&+mInput.getText());
mScrollHeight = setScrollGridView(mScrollView, mGridView, 3);
System.out.println(&mScrollHeight:& + mScrollHeight);
return mEmoV
private void startServiceAsServer(){
TaskService.start(this, mHandler);
TaskService.newTask(new Task(mHandler, Task.TASK_START_ACCEPT, null));
SoundEffect.getInstance(this).play(SoundEffect.SOUND_PLAY);
protected void onResume() {
sAliveCount++;
super.onResume();
protected void onPause() {
sAliveCount--;
super.onPause();
protected void onDestroy() {
super.onDestroy();
// 关闭蓝牙
if(mBluetoothAdapter.isEnabled())
mBluetoothAdapter.disable();
// 停止服务
TaskService.stop(this);
public void onClick(View v) {
if(v == mSendBtn){
String msg = mInput.getText().toString().trim();
TaskService.newTask(new Task(mHandler, Task.TASK_GET_REMOTE_STATE, null));//通过点击按钮触发相应线程的启动,比较巧妙,值得学习
if(msg.length() == 0){
showToast(&聊天内容为空&);
SoundEffect.getInstance(ChatActivity.this).play(SoundEffect.SOUND_ERR);
//------ DEUBG ------
TaskService.newTask(new Task(mHandler, Task.TASK_SEND_MSG, new Object[]{msg}));
showOwnMessage(msg);//立马显示自己发送的消息,所以在handler里面就没有再做处理
isHaspressed = true;//数据库可以开始记录消息啦
mInput.setText(&&);
}else if(v == mEmoButton){
System.out.println(&Emo btn clicked&);
// 关闭输入法
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mInput.getWindowToken(),0);
if(isShowEmo){
showEmoPanel(false);
showEmoPanel(true);
private void showEmoPanel(boolean show){
if(show && !isShowEmo){
mEmoView.setVisibility(View.VISIBLE);
mEmoButton.setImageResource(R.drawable.emo_collapse);
ViewGroup.LayoutParams params = mChatLayout.getLayoutParams();
params.height = mChatLayout.getHeight() - mScrollH
mChatLayout.setLayoutParams(params);
isShowEmo = true;
}else if(!show && isShowEmo){
mEmoView.setVisibility(View.GONE);
mEmoButton.setImageResource(R.drawable.emo_bkg);
ViewGroup.LayoutParams params = mChatLayout.getLayoutParams();
params.height = mChatLayout.getHeight() + mScrollH
mChatLayout.setLayoutParams(params);
isShowEmo = false;
if(!isUpdate && show){
LinearLayout.LayoutParams para = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
mRootLayout.addView(mEmoView, para);
isUpdate = true;
private boolean isBTStateChanged(int now){
if(sBTState != now){
sBTState =
return true;
return false;
* 显示对方信息
* @param data
private void showTargetMessage(HashMap&String, Object& data){
SimpleDateFormat df1 = new SimpleDateFormat(&E MM月dd日
data.put(ChatListViewAdapter.KEY_DATE, df1.format(System.currentTimeMillis()).toString());
data.put(ChatListViewAdapter.KEY_SHOW_MSG, true);
mChatContent2.add(data);
mAdapter2.notifyDataSetChanged();
SoundEffect.getInstance(ChatActivity.this).play(SoundEffect.SOUND_RECV);
* 显示自己信息
* @param data
private void showOwnMessage(String msg){
HashMap&String, Object& map = new HashMap&String, Object&();
map.put(ChatListViewAdapter.KEY_ROLE, ChatListViewAdapter.ROLE_OWN);//哪个角色的消息
map.put(ChatListViewAdapter.KEY_NAME, mBluetoothAdapter.getName());
map.put(ChatListViewAdapter.KEY_TEXT, msg);
SimpleDateFormat df2 = new SimpleDateFormat(&E MM月dd日
map.put(ChatListViewAdapter.KEY_DATE, df2.format(System.currentTimeMillis()).toString());
map.put(ChatListViewAdapter.KEY_SHOW_MSG, true);
mChatContent2.add(map);
mAdapter2.notifyDataSetChanged();
SoundEffect.getInstance(ChatActivity.this).play(SoundEffect.SOUND_SEND);
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.option_menu, menu);
return true;
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.scan:
startActivityForResult(new Intent(this, SelectDevice.class), REQUES_SELECT_BT_CODE);
case R.id.discoverable:
// 调用设置用户名方法
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
final EditText devNameEdit = new EditText(this);
dlg.setView(devNameEdit);
dlg.setTitle(&请输入用户名&);
dlg.setPositiveButton(&设置&, new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if(devNameEdit.getText().toString().length() != 0)
mBluetoothAdapter.setName(devNameEdit.getText().toString());
dlg.create();
dlg.show();
return true;
case R.id.record:
Intent recordIntent = new Intent(ChatActivity.this, RecordListActivity.class);
startActivity(recordIntent);
return true;
case R.id.exit:
Intent aboutIntent = new Intent(ChatActivity.this, DownloadActivity.class);
startActivity(aboutIntent);
return true;
return false;
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == REQUES_BT_ENABLE_CODE && resultCode == RESULT_OK){
startServiceAsServer();
}else if(requestCode == REQUES_SELECT_BT_CODE && resultCode == RESULT_OK){
mRemoteDevice = data.getParcelableExtra(&DEVICE&);
if(mRemoteDevice == null)
TaskService.newTask(new Task(mHandler, Task.TASK_START_CONN_THREAD, new Object[]{mRemoteDevice}));
super.onActivityResult(requestCode, resultCode, data);
private void showToast(String msg){
Toast tst = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
tst.setGravity(Gravity.CENTER | Gravity.TOP, 0, 240);
tst.show();
// 设置表情的多页滚动显示控件
public int setScrollGridView(DrawerHScrollView scrollView, GridView gridView,
int lines) {
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
Display display = getWindowManager().getDefaultDisplay();
System.out.println(&Width:& + display.getWidth());
System.out.println(&Height:& + display.getHeight());
int scrollWid = display.getWidth();
int scrollH
System.out.println(&scrollWid:& + scrollWid);
if (scrollWid &= 0 ){
Log.d(TAG, &scrollWid or scrollHei is less than 0&);
float density
// 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
int readlViewWidht = 56;
// 图片都放在了Hdpi中,所以计算出图片的像素独立宽度
int viewWidth = (int) (readlViewWidht * density / 1.5);
int viewHeight = viewW
System.out.println(&viewWidth:& + viewWidth + & viewHeight:& + viewHeight);
int numColsPage = scrollWid / viewW
int spaceing = (scrollWid - viewWidth * numColsPage)/(numColsPage);
System.out.println(&Space:& + spaceing);
SimpleAdapter adapter = getEmoAdapter();
int pages = adapter.getCount() / (numColsPage * lines);
if (pages * numColsPage * lines & adapter.getCount()){
pages++;
System.out.println(&pages:& + pages);
scrollHei = lines * viewHeight + spaceing * (lines + 1);
LayoutParams params = new LayoutParams(pages * scrollWid, LayoutParams.WRAP_CONTENT);
gridView.setLayoutParams(params);
gridView.setColumnWidth(viewWidth);
gridView.setHorizontalSpacing(spaceing);
gridView.setVerticalSpacing(spaceing);
gridView.setStretchMode(GridView.NO_STRETCH);
gridView.setNumColumns(numColsPage * pages);
//adapter = new DrawerListAdapter(this, colWid, colHei);
//listener = new DrawerItemClickListener();
gridView.setAdapter(adapter);
//mGridView.setOnItemClickListener(listener);
scrollView.setParameters(pages, 0, scrollWid, spaceing);
//updateDrawerPageLayout(pageNum, 0);
// 表情区域还要加上分布显示区
int pageNumHei = (int) (18 * density);
return scrollHei + pageNumH
private SimpleAdapter getEmoAdapter(){
HashMap&String, Object& map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo001);
map.put(&text&, &&emo001&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo002);
map.put(&text&, &&emo002&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo003);
map.put(&text&, &&emo003&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo004);
map.put(&text&, &&emo004&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo005);
map.put(&text&, &&emo005&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo006);
map.put(&text&, &&emo006&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo007);
map.put(&text&, &&emo007&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo008);
map.put(&text&, &&emo008&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo009);
map.put(&text&, &&emo009&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo010);
map.put(&text&, &&emo010&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo011);
map.put(&text&, &&emo011&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo012);
map.put(&text&, &&emo012&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo013);
map.put(&text&, &&emo013&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo014);
map.put(&text&, &&emo014&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo015);
map.put(&text&, &&emo015&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo016);
map.put(&text&, &&emo016&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo017);
map.put(&text&, &&emo017&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo018);
map.put(&text&, &&emo018&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo019);
map.put(&text&, &&emo019&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo020);
map.put(&text&, &&emo020&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo021);
map.put(&text&, &&emo021&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo022);
map.put(&text&, &&emo022&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo023);
map.put(&text&, &&emo023&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo024);
map.put(&text&, &&emo024&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo025);
map.put(&text&, &&emo025&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo026);
map.put(&text&, &&emo026&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo027);
map.put(&text&, &&emo027&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo028);
map.put(&text&, &&emo028&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo029);
map.put(&text&, &&emo029&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo030);
map.put(&text&, &&emo030&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo031);
map.put(&text&, &&emo031&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo032);
map.put(&text&, &&emo032&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo033);
map.put(&text&, &&emo033&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo034);
map.put(&text&, &&emo034&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo035);
map.put(&text&, &&emo035&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo036);
map.put(&text&, &&emo036&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo037);
map.put(&text&, &&emo037&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo038);
map.put(&text&, &&emo038&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo039);
map.put(&text&, &&emo039&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo040);
map.put(&text&, &&emo040&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo041);
map.put(&text&, &&emo041&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo042);
map.put(&text&, &&emo042&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo043);
map.put(&text&, &&emo043&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo044);
map.put(&text&, &&emo044&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo045);
map.put(&text&, &&emo045&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo046);
map.put(&text&, &&emo046&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo047);
map.put(&text&, &&emo047&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo048);
map.put(&text&, &&emo048&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo049);
map.put(&text&, &&emo049&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo050);
map.put(&text&, &&emo050&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo051);
map.put(&text&, &&emo051&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo052);
map.put(&text&, &&emo052&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo053);
map.put(&text&, &&emo053&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo054);
map.put(&text&, &&emo054&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo055);
map.put(&text&, &&emo055&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo056);
map.put(&text&, &&emo056&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo057);
map.put(&text&, &&emo057&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo058);
map.put(&text&, &&emo058&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo059);
map.put(&text&, &&emo059&&);
mEmoList.add(map);
map = new HashMap&String, Object&();
map.put(&img&, R.drawable.emo060);
map.put(&text&, &&emo060&&);
mEmoList.add(map);
* 上述添加表情效率高,但是代码太冗余,下面的方式代码简单,但是效率较低
HashMap&String, Integer&
for(int i = 0; i & 100; i++){
map = new HashMap&String, Integer&();
Field field=R.drawable.class.getDeclaredField(&image&+i);
int resourceId=Integer.parseInt(field.get(null).toString());
map.put(&img&, resourceId);
mEmoList.add(map);
return new SimpleAdapter(this, mEmoList, R.layout.grid_view_item,
new String[]{&img&}, new int[]{R.id.imageView});
long waitTime = 2000;
long touchTime = 0;
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN && KeyEvent.KEYCODE_BACK == keyCode) {
long currentTime = System.currentTimeMillis();
if((currentTime-touchTime)&=waitTime) {
Toast.makeText(this, &再按一次退出&, Toast.LENGTH_SHORT).show();
touchTime = currentT
return true;
return super.onKeyDown(keyCode, event);
TaskService.java:
1 package cn.com.farsgiht.bluetoothdemo.
3 import java.io.BufferedInputS
4 import java.io.BufferedOutputS
5 import java.io.IOE
6 import java.io.InputS
7 import java.io.OutputS
8 import java.io.UnsupportedEncodingE
9 import java.util.ArrayL
10 import java.util.C
11 import java.util.HashM
12 import java.util.UUID;
13 import android.app.S
14 import android.bluetooth.BluetoothA
15 import android.bluetooth.BluetoothD
16 import android.bluetooth.BluetoothServerS
17 import android.bluetooth.BluetoothS
18 import android.content.ContentV
19 import android.content.C
20 import android.content.I
21 import android.database.sqlite.SQLiteD
22 import android.os.B
23 import android.os.H
24 import android.os.IB
25 import android.util.L
26 import android.widget.ArrayA
27 import android.widget.T
28 import cn.com.farsgiht.bluetoothdemo.ChatA
29 import cn.com.farsgiht.bluetoothdemo.UI.ChatListViewA
30 import cn.com.farsgiht.bluetoothdemo.protocol.DataP
31 import cn.com.farsgiht.bluetoothdemo.protocol.M
32 import cn.com.farsgiht.bluetoothdemo.sound.SoundE
* 任务处理服务
* @author Administrator
38 public class TaskService extends Service {
public static final int BT_STAT_WAIT = 0;
public static final int BT_STAT_CONN = 1;
public static final int BT_STAT_ONLINE = 2;
public static final int BT_STAT_UNKNOWN = 3;
public static final String DEVICE_NAME = &device_name&;
private final String TAG = &TaskService&;
private TaskThread mT
private BluetoothAdapter mBluetoothA
private AcceptThread mAcceptT
private ConnectThread mConnectT
private ConnectedThread mCommT
private boolean isServerMode = true;
private static Handler mActivityH
// 任务队列
private static ArrayList&Task& mTaskList = new ArrayList&Task&();
private Handler mServiceHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case Task.TASK_GET_REMOTE_STATE:
android.os.Message activityMsg = mActivityHandler.obtainMessage();
activityMsg.what = msg.
if (mAcceptThread != null && mAcceptThread.isAlive()) {
activityMsg.obj = &等待连接...&;
activityMsg.arg1 = BT_STAT_WAIT;
} else if (mCommThread != null && mCommThread.isAlive()) {
activityMsg.obj = mCommThread.getRemoteName() + &[在线]&;
activityMsg.arg1 = BT_STAT_ONLINE;
} else if (mConnectThread != null && mConnectThread.isAlive()) {
SoundEffect.getInstance(TaskService.this).play(3);
activityMsg.obj = &正在连接:&
+ mConnectThread.getDevice().getName();
activityMsg.arg1 = BT_STAT_CONN;
activityMsg.obj = &未知状态&;
activityMsg.arg1 = BT_STAT_UNKNOWN;
SoundEffect.getInstance(TaskService.this).play(2);
// 重新等待连接
mAcceptThread = new AcceptThread();
mAcceptThread.start();
isServerMode = true;
mActivityHandler.sendMessage(activityMsg);
super.handleMessage(msg);
public void onCreate() {
super.onCreate();
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Log.e(TAG, &Your device is not support Bluetooth!&);
mThread = new TaskThread();
mThread.start();
public static void start(Context c, Handler handler){
mActivityHandler =
Intent intent = new Intent(c, TaskService.class);
c.startService(intent);
public static void stop(Context c){
Intent intent = new Intent(c, TaskService.class);
c.stopService(intent);
public static void newTask(Task target) {
synchronized (mTaskList) {
mTaskList.add(target);
private class TaskThread extends Thread {
private boolean isRun = true;
private int mCount = 0;
public void cancel() {
isRun = false;
public void run() {
while (isRun) {
if (mTaskList.size() & 0) {
synchronized (mTaskList) {
// 获得任务
task = mTaskList.get(0);
doTask(task);
Thread.sleep(200);
mCount++;
} catch (InterruptedException e) {
// 每过10秒钟进行一次状态检查
if (mCount &= 50) {
mCount = 0;
// 检查远程设备状态
android.os.Message handlerMsg = mServiceHandler
.obtainMessage();
handlerMsg.what = Task.TASK_GET_REMOTE_STATE;
mServiceHandler.sendMessage(handlerMsg);
174 //对应三个线程,其中mCommThread是在mConnectThread的run()方法中new出来的
private void doTask(Task task) {
switch (task.getTaskID()) {
case Task.TASK_START_ACCEPT:
mAcceptThread = new AcceptThread();
mAcceptThread.start();
isServerMode = true;
case Task.TASK_START_CONN_THREAD:
if (task.mParams == null || task.mParams.length == 0) {
BluetoothDevice remote = (BluetoothDevice) task.mParams[0];
mConnectThread = new ConnectThread(remote);
mConnectThread.start();
isServerMode = false;
case Task.TASK_SEND_MSG:
boolean sucess = false;
if (mCommThread == null || !mCommThread.isAlive()
|| task.mParams == null || task.mParams.length == 0) {
Log.e(TAG, &mCommThread or task.mParams null&);
byte[] msg = null;
msg = DataProtocol.packMsg((String) task.mParams[0]);
sucess = mCommThread.write(msg);
} catch (UnsupportedEncodingException e) {
sucess = false;
if (!sucess) {
android.os.Message returnMsg = mActivityHandler.obtainMessage();
returnMsg.what = Task.TASK_SEND_MSG_FAIL;
returnMsg.obj = &消息发送失败&;
mActivityHandler.sendMessage(returnMsg);
// 移除任务
mTaskList.remove(task);//每次保证任务列表里面只有一个任务,task = mTaskList.get(0);
public void onDestroy() {
super.onDestroy();
mThread.cancel();
private final String UUID_STR = &0-805F9B34FB&;
* 等待客户端连接线程
* @author Administrator
private class AcceptThread extends Thread {
private final BluetoothServerSocket mmServerS
private boolean isCancel = false;
public AcceptThread() {
Log.d(TAG, &AcceptThread&);
BluetoothServerSocket tmp = null;
tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(
&MT_Chat_Room&, UUID.fromString(UUID_STR));
} catch (IOException e) {
mmServerSocket =
public void run() {
BluetoothSocket socket = null;
while (true) {
// 阻塞等待
socket = mmServerSocket.accept();
} catch (IOException e) {
if (!isCancel) {
mmServerSocket.close();
} catch (IOException e1) {
mAcceptThread = new AcceptThread();
mAcceptThread.start();
isServerMode = true;
if (socket != null) {
manageConnectedSocket(socket);
mmServerSocket.close();
} catch (IOException e) {
mAcceptThread = null;
public void cancel() {
Log.d(TAG, &AcceptThread canceled&);
isCancel = true;
isServerMode = false;
mmServerSocket.close();
mAcceptThread = null;
if (mCommThread != null && mCommThread.isAlive()) {
mCommThread.cancel();
} catch (IOException e) {
* 作为客户端连接指定的蓝牙设备线程
* @author Administrator
private class ConnectThread extends Thread {
private final BluetoothSocket mmS
private final BluetoothDevice mmD
public ConnectThread(BluetoothDevice device) {
Log.d(TAG, &ConnectThread&);
if (mAcceptThread != null && mAcceptThread.isAlive()) {
mAcceptThread.cancel();
if (mCommThread != null && mCommThread.isAlive()) {
mCommThread.cancel();
// Use a temporary object that is later assigned to mmSocket,
// because mmSocket is final
BluetoothSocket tmp = null;
mmDevice =
tmp = device.createRfcommSocketToServiceRecord(UUID
.fromString(UUID_STR));
} catch (IOException e) {
Log.d(TAG, &createRfcommSocketToServiceRecord error!&);
mmSocket =
public BluetoothDevice getDevice() {
return mmD
public void run() {
// Cancel discovery because it will slow down the connection
mBluetoothAdapter.cancelDiscovery();
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
} catch (IOException connectException) {
// U close the socket and get out
Log.e(TAG, &Connect server failed&);
mmSocket.close();
} catch (IOException closeException) {
mAcceptThread = new AcceptThread();
mAcceptThread.start();
isServerMode = true;
} // Do work to manage the connection (in a separate thread)
manageConnectedSocket(mmSocket);
public void cancel() {
mmSocket.close();
} catch (IOException e) {
mConnectThread = null;
private void manageConnectedSocket(BluetoothSocket socket) {
// 启动子线程来维持连接
mCommThread = new ConnectedThread(socket);
mCommThread.start();
private class ConnectedThread extends Thread {
private final BluetoothSocket mmS
private final InputStream mmInS
private final OutputStream mmOutS
private BufferedOutputStream mmB
private byte[]
public ConnectedThread(BluetoothSocket socket) {
Log.d(TAG, &ConnectedThread&);
mmSocket =
InputStream tmpIn = null;
OutputStream tmpOut = null;
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) {
mmInStream = tmpIn;
mmOutStream = tmpO
mmBos = new BufferedOutputStream(mmOutStream);
public OutputStream getOutputStream() {
return mmOutS
public boolean write(byte[] msg) {
if (msg == null)
return false;
mmBos.write(msg);
mmBos.flush();
mActivityHandler.obtainMessage(Task.TASK_SEND_MSG, -1, -1, new String(msg)).sendToTarget();
System.out.println(&Write:& + msg);
} catch (IOException e) {
return false;
return true;
public String getRemoteName() {
return mmSocket.getRemoteDevice().getName();
public void cancel() {
mmSocket.close();
} catch (IOException e) {
mCommThread = null;
public void run() {
write(DataProtocol.packMsg(mBluetoothAdapter.getName()
+ &已经上线\n&));//获取本地蓝牙适配器的蓝牙名称,这一条消息默认发送出去啦,
//但消息记录里面不应该有这条消息,消息记录里面记录按过发送键的消息
} catch (UnsupportedEncodingException e2) {
android.os.Message handlerM
buffer = new byte[1024];
BufferedInputStream bis = new BufferedInputStream(mmInStream);
// BufferedReader br = new BufferedReader(new
// InputStreamReader(mmInStream));
HashMap&String, Object&
while (true) {
size = bis.read(buffer);
msg = DataProtocol.unpackData(buffer);
if (msg == null)
if (mActivityHandler == null) {
msg.remoteDevName = mmSocket.getRemoteDevice().getName();//得到对方设备的名字
if (msg.type == DataProtocol.TYPE_FILE) {
// 文件接收处理忽略
} else if (msg.type == DataProtocol.TYPE_MSG) {
data = new HashMap&String, Object&();
System.out.println(&Read data.&);
data.put(ChatListViewAdapter.KEY_ROLE,
ChatListViewAdapter.ROLE_TARGET);
data.put(ChatListViewAdapter.KEY_NAME,
msg.remoteDevName);
data.put(ChatListViewAdapter.KEY_TEXT, msg.msg);
// 通过Activity更新到UI上
handlerMsg = mActivityHandler.obtainMessage();
handlerMsg.what = Task.TASK_RECV_MSG;
handlerMsg.obj =
mActivityHandler.sendMessage(handlerMsg);
} catch (IOException e) {
mmSocket.close();
} catch (IOException e1) {
mCommThread = null;
if (isServerMode) {
// 检查远程设备状态
handlerMsg = mServiceHandler.obtainMessage();
handlerMsg.what = Task.TASK_GET_REMOTE_STATE;
mServiceHandler.sendMessage(handlerMsg);
SoundEffect.getInstance(TaskService.this).play(2);
mAcceptThread = new AcceptThread();
mAcceptThread.start();
// ================================================================
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
实现效果:
& & & & & & &

我要回帖

更多关于 立案后警察就不管了 的文章

 

随机推荐