512 Commits

Author SHA1 Message Date
lzl
be4356f317 潘多拉魔盒再次抽奖判断空。 2026-01-30 19:14:23 +08:00
9c7567dfd1 1:修改爱豆计划名称,变更成潘多拉魔盒
2:修改搜索,只有点击确定才可以搜索
2026-01-30 16:10:08 +08:00
88ce3ac161 1:修改马迎新春的弹框提示,展示背景 2026-01-30 14:25:45 +08:00
48506a075e 1:修改马迎新春打开不关闭房间设置 2026-01-30 10:09:24 +08:00
lzl
cb79afaab6 注销许愿卡,爱豆计划记录闪退,默认主题内页黑色。 2026-01-30 09:47:22 +08:00
lzl
dfc64d7a14 注销许愿卡,爱豆计划记录闪退,默认主题内页黑色。 2026-01-30 09:47:15 +08:00
lzl
3977e3e158 删除错误资源 2026-01-29 19:28:51 +08:00
lzl
877862e507 爱豆计划。 2026-01-29 19:04:26 +08:00
5ce33aeeb1 1:修改马迎新春兑换
2:修改转盘抽盘展示规则的页面
2026-01-29 18:26:35 +08:00
0afb5dbbfd 1:修改马迎新春兑换 2026-01-29 17:38:21 +08:00
3530c10772 1:修改房间设置,
2:修改个人主页头像框展示
3:修改礼物墙数据错乱不让展示的问题
4:修改房间设置里面的活动,变成趣味活动,当有参数的并且是打开的情况下,是展示的
2026-01-29 17:25:23 +08:00
5b27d91278 1:添加炼仙传说功能
2:修改混淆,
2026-01-28 18:43:36 +08:00
lzl
513cc23d9c 春节主题:礼物飘屏。 2026-01-28 16:43:29 +08:00
lzl
7aa294c3a9 春节主题:首页弹窗、礼物、部分按钮。 2026-01-28 16:17:06 +08:00
lzl
88ce0205fb 春节主题:登录、主页面。 2026-01-28 09:29:03 +08:00
3d0fb12565 1:还原接收文本消息 2026-01-27 17:20:04 +08:00
lzl
cb16dbb9e1 任务幸运币UI。 2026-01-27 14:37:32 +08:00
8ce7a9e5de 1:修改进入房间后,先获取在线列表
2:修改图片展示,展示圆形图片
3:添加后台禁用后,页面弹起禁用弹框
4:修改日志,不在展示返回结果,不展示域名
2026-01-27 14:36:05 +08:00
8db507718c 1:修改所有和礼物有关系的接口,分别是打赏接口、房间礼物,这个进行修改
2:修改排麦插队礼物,id传0
3:歌单礼物传递的id是100
2026-01-26 14:18:07 +08:00
lzl
e23578838c 密码房完善:小时榜显示密码锁 3。 2026-01-26 11:49:53 +08:00
lzl
973fac58a4 密码房完善:创建房间设置密码 2。 2026-01-26 11:29:03 +08:00
lzl
8a587210cf 密码房完善1。 2026-01-26 11:20:05 +08:00
lzl
8d7de418bb 1。 2026-01-26 10:29:18 +08:00
lzl
24c4af95b4 密码房部分,幸运抽奖部分。 2026-01-26 10:27:29 +08:00
9450a351c5 1:添加热度卡,在背包显示
2:修改道具商城和个性装扮,分别显示热身卡和不显示
3:完成热度卡在房间中使用,一键全使用和单个使用,完成
2026-01-26 09:40:23 +08:00
9f8f8137d1 1:修改网络初始化的时候,放在点击了弹框后在进行
2:添加礼物墙展示用户信息功能
2026-01-23 11:48:44 +08:00
lzl
d07ca522ab 跟随闪退,cp动画开始显示头像。 2026-01-23 09:40:08 +08:00
08c51e0273 1:修改营业时间,结束时间秒更改为00
2:修改在退出登录的时候,不在清除本地缓存数据
2026-01-22 16:48:16 +08:00
lzl
60b8e901b5 1。 2026-01-22 15:28:44 +08:00
lzl
885d6b1e7d 头像框清除上次资源 mIvFrame.release() 去除,用户首页头像框更新。 2026-01-22 14:52:51 +08:00
lzl
3f2989664c 头像框清除上次资源 mIvFrame.release()。 2026-01-22 10:29:49 +08:00
lzl
76f499f022 pk头像框小修改,cp动画不出来头像动画最多10次,pk切换房间刷新UI。 2026-01-22 10:18:41 +08:00
1048b8f46e 1:发布版本 2026-01-21 15:49:56 +08:00
78f290eef8 1:修改搜索房间历史,添加删除功能
2:修改图片展示添加日志记录
3:更改设置群管理员的提示语
2026-01-21 12:46:32 +08:00
lzl
3f49cf3790 cp挂件头像显示位置null判断,去除请求头打印。 2026-01-21 10:11:23 +08:00
9ab1f171f8 1:修改pk上麦的时候,进行换麦后,原还展示星光
2:修改设置房间营业时间,回显的问题
2026-01-21 09:24:58 +08:00
4e8058f200 1:在房间设置的时候,展示营业时间
2:修改选择时间展示选择的日期
3:修改了群组全成员展示接界面
2026-01-20 21:15:23 +08:00
4fdd5578a8 1:修改时间选择框,根据需要,展示时分秒和不显示时分秒
2:修改展示设备id,在头部信息中,使用第三方的获取设备唯一id
3:优化群聊成员列表展示
4:修改房间封面,上传图片的时候,需要裁剪
5:添加营业时间展示
6:pk修改开始的时候,选择时间去掉1分钟
7:修改声网,添加声卡开关
2026-01-20 19:21:56 +08:00
163340a691 1:修改时间选择框,根据需要,展示时分秒和不显示时分秒
2:修改展示设备id,在头部信息中,使用第三方的获取设备唯一id
3:优化群聊成员列表展示
4:修改房间封面,上传图片的时候,需要裁剪
5:添加营业时间展示
6:pk修改开始的时候,选择时间去掉1分钟
7:修改声网,添加声卡开关
2026-01-20 19:20:06 +08:00
lzl
bf609a3964 从消息页面跟随过去房间,最小化失败。 2026-01-19 17:58:42 +08:00
lzl
e6232f5aa2 网络请求头添加版本信息 1。 2026-01-17 16:47:19 +08:00
0ae0cff87a 1:修改巡乐会榜单展示 2026-01-17 16:46:19 +08:00
lzl
ac7a3b1325 酒吧房小黑屋麦标显示,网络请求头添加版本信息。 2026-01-17 16:29:39 +08:00
16bd6d7e1a 1:修改送盲盒的时候,接口修改,需要传递gift_bag_id
2:装扮详情修改优化
2026-01-17 16:28:20 +08:00
lzl
838a2ec64a Merge remote-tracking branch 'origin/branch_new' into branch_new 2026-01-17 01:09:39 +08:00
lzl
87782e9caa fix bugs2. 2026-01-17 01:09:30 +08:00
0a0875fb88 1:修改巡乐会榜单展示 2026-01-17 01:09:27 +08:00
lzl
725add62ac fix bugs. 2026-01-17 01:08:24 +08:00
lzl
59b48e0b0f 测试 2026-01-17 00:32:39 +08:00
lzl
e5f77b626e 混淆log不打印。 2026-01-17 00:12:14 +08:00
99b3350329 1:修改酒吧房自动退出房间后,麦的状态没有更改 2026-01-16 23:33:21 +08:00
883a96f2c7 1:修改钻石收支出现来回切换出现数据重复的情况 2026-01-16 22:47:09 +08:00
lzl
8e86ba68d0 小黑屋主动退出逻辑。 2026-01-16 18:17:02 +08:00
bf507a6264 1:优化小黑屋退出房间后加入大房间 -2 2026-01-16 18:06:06 +08:00
716cafc62b 1:优化小黑屋退出房间后加入大房间 2026-01-16 17:55:18 +08:00
267b8a0aea 1:修改房间清空消息,只清空大房间消息,不清除小黑屋的消息 2026-01-16 16:31:02 +08:00
lzl
60fff84aaf Merge remote-tracking branch 'origin/branch_new' into branch_new 2026-01-16 16:05:17 +08:00
lzl
0a968babef 房间公平消息收不到。 2026-01-16 16:05:10 +08:00
b3c1ae647d 1:购买装扮的时候,默认选择的对应的天数,(后台也修改了,是可以使用的)
2:修改当在小黑屋收到大房间清空消息的推送的时候,不进行清除小黑屋的消息
2026-01-16 16:04:34 +08:00
lzl
fcc690db64 子爵公屏聊天名字颜色。 2026-01-16 09:21:09 +08:00
lzl
476de595da bg闪退问题修改. 2026-01-15 05:34:06 +08:00
lzl
a4c21485a2 闪退问题修改. 2026-01-15 05:16:06 +08:00
e24f217ab4 1:添加一键登录 2026-01-15 05:06:16 +08:00
a07ee5cfe9 1:修改酒吧房小黑屋展示的金币余额视图 2026-01-14 20:52:55 +08:00
lzl
60c97447dd Merge remote-tracking branch 'origin/branch_new' into branch_new 2026-01-14 20:28:58 +08:00
lzl
b201787513 酒吧房小黑屋禁止播放cp and jia_jia. 2026-01-14 20:28:54 +08:00
064338e838 1:给酒吧房小黑屋添加充值和显示金币的控件 2026-01-14 20:25:54 +08:00
lzl
0a0771d5a3 酒吧交友房送礼物。 2026-01-14 19:46:45 +08:00
f82e5c8348 1:修改在帮助中,使用平台的客服功能,如果对方是客服,自己不用充值可以聊天 2026-01-14 19:14:30 +08:00
d7a27baf5c 1:修改pk中,设置的pk按钮 is_pk=1:是接受pk。2:是不接受pk 2026-01-14 16:34:52 +08:00
lzl
a3551e2e33 用戶房間個人主頁跟隨bug. 2026-01-14 16:04:56 +08:00
a1fcc56551 1:修改巡乐会出现当服务端返回失败的时候,页面不能再点击的情况 2026-01-14 15:31:58 +08:00
cdb5f9b794 1:修改房间送礼弹框,设置了展示的高度是自适应
2:修改一键赠送背包礼物多次点击的时候出现的错误
2026-01-14 15:17:12 +08:00
lzl
e9ab535b2d 优化switchMic 2026-01-14 15:09:18 +08:00
lzl
f5b4dde3c6 优化roomBtnShowIsHide 2026-01-14 14:52:35 +08:00
f4f27c2c94 1:在充值的地方,添加充值协议提示 2026-01-14 10:34:54 +08:00
268c3cdd98 1:在酒吧房小黑屋中,点击送礼添加二次弹窗,并且在点击退出房间的时候,添加二次弹框确认 2026-01-14 10:09:45 +08:00
dde6ccd578 1:还原消息展示, 2026-01-13 20:12:39 +08:00
f01d903d2f 1:还原消息展示 2026-01-13 20:09:34 +08:00
e3bad8ddab 1:修改红包声音和转盘声音,变成0.04
2:修改消息列表展示的时候,展示的事200条,清除的时候,清除前100条
2026-01-13 19:59:17 +08:00
lzl
2b29b0de18 小黑屋退出上麦显示图标不对。 2026-01-13 19:39:33 +08:00
6e5e8abc0b 1:特效图片 2026-01-13 19:14:26 +08:00
38d1c266d6 1:修改进入小黑屋添加了和外部的特效一个功能
2:给用户主页添加私信按钮,常显示
3:优化退出酒吧房小黑屋,
2026-01-13 19:13:19 +08:00
lzl
6a22259c16 除Main跳转Room,其他全部finish。 2026-01-13 18:41:12 +08:00
lzl
b1523c2f2a 交友小黑屋礼物价格1,酒吧房性别,vap mp4播放声音设置0.04f。 2026-01-13 16:07:28 +08:00
8f4c2d1b83 1:优化服务地址
2:修改盲盒转盘声音,修改成0.2
3:修改红包声音,0.2
4:修改巡乐会,最后出现的空白
5:优化一键赠送背包礼物的时候,连续点击后,出现的错误
7:修改打包的应用图标
2026-01-13 16:04:21 +08:00
lzl
0fd8ecd73d 交友小黑屋礼物价格。 2026-01-13 14:32:24 +08:00
6b87252a51 1:优化服务地址 2026-01-13 10:02:09 +08:00
64ced88287 1:修改转盘去掉了特效还又声音
2:修改巡乐会去掉跳过动画,
3:修改巡乐会结果页面,进行展示,不在关联抽奖
2026-01-13 09:39:28 +08:00
lzl
716f292fa5 拍卖房麦位只有前六个能说话。 2026-01-12 17:40:32 +08:00
lzl
39b9ea73a1 优化麦圈显示延迟,拍卖房麦位丢失。 2026-01-12 17:06:07 +08:00
c67b07e3b9 1:添加练歌房,已点歌曲搜索(只能搜索用户id)、删除功能 2026-01-12 15:40:51 +08:00
lzl
5a1edb6c4a 酒吧交友房 进出房间不接受Im消息,用户详情 标签显示优化。 2026-01-12 09:55:37 +08:00
a034e5e954 1:修改使用Glide,原设置了尺寸,出现页面显示缓慢的情况,现在禁止了设置图片的大小,使用RGB_565,减少内存占用 2026-01-12 09:47:06 +08:00
15ed708853 1:修改道具商城展示用户头像
2:修改房间用户展示的靓号图标展示
2026-01-09 20:15:46 +08:00
ca4d9ea20a 1:修改趣味展示的时候,出现的换行和里面展示的时候,出现挤压了
2:修改昵称在输入的时候,不能输入空或者制表符等
2026-01-09 16:46:34 +08:00
84fa4ed1f3 1:修改酒吧房小黑屋不显示头条、任务和巡乐会
2:修改连点送盲盒报错
2026-01-09 15:45:59 +08:00
lzl
4c7a2ae3b7 酒吧交友房 getGiftList 防止越界 2。 2026-01-09 15:27:24 +08:00
34f4d980ad 1:修改酒吧房小黑屋礼物 2026-01-09 14:38:00 +08:00
lzl
2589b97f29 酒吧交友房 getGiftList 防止越界。 2026-01-09 14:35:44 +08:00
5946cf97b9 1:修改酒吧房主动调用下麦的操作
2:修改房间明细,只有自己创建的,添加了时间对应的收益和流水,我主持的知悉那是时间
2026-01-09 14:18:43 +08:00
lzl
0be33ec918 酒吧交友房 消息显示 4。 2026-01-09 14:12:39 +08:00
lzl
8264974d85 酒吧交友房 消息显示 3。 2026-01-09 12:48:44 +08:00
lzl
54b3312eac 酒吧交友房 消息接收重置 2。 2026-01-09 11:57:43 +08:00
lzl
0ff889d72a 酒吧交友房 消息接受重置。 2026-01-09 11:42:42 +08:00
lzl
7436649f71 酒吧外部送礼物拦截1。 2026-01-09 11:36:00 +08:00
lzl
ea85b71e2f 酒吧外部送礼物拦截。 2026-01-09 11:21:58 +08:00
lzl
58c39962fa 酒吧交友房 数据更新2。 2026-01-09 11:10:17 +08:00
lzl
36fbc88f21 酒吧交友房 数据更新。 2026-01-09 11:03:12 +08:00
97f30ce233 1:修改酒吧房不显示清除魅力按钮 2026-01-09 09:45:14 +08:00
lzl
c355fd66d6 酒吧交友房 定时器。 2026-01-09 09:44:31 +08:00
lzl
2e61fa5e4d 酒吧交友房 消息显示。 2026-01-09 09:38:42 +08:00
lzl
b5fcf232fe 酒吧交友房 消息接收多条。 2026-01-08 19:41:30 +08:00
lzl
9627a476f7 酒吧交友房 消息高亮显示。 2026-01-08 19:30:21 +08:00
lzl
d5cbb5008c 酒吧交友房 聊天消息。 2026-01-08 19:10:48 +08:00
lzl
1b560a3806 酒吧交友房聊天。 2026-01-08 18:59:20 +08:00
34552f45ec 1:修改换麦带着自定义礼物 2026-01-08 18:41:07 +08:00
lzl
ab228eb05d 定时器 2026-01-08 18:39:31 +08:00
lzl
a8328ac8b9 消息 2026-01-08 18:29:45 +08:00
lzl
d2f2829ca2 UI 1039 endtime 2 2026-01-08 17:31:06 +08:00
lzl
43600c60c0 UI 1039 endtime 2026-01-08 17:27:19 +08:00
lzl
e12bb36fe5 UI 优化。 2026-01-08 17:24:52 +08:00
lzl
e74bfde545 退出房间 2026-01-08 17:02:29 +08:00
0b37364a11 1:添加酒吧房抱麦推送,在推送过来后,需要选择礼物
2:添加酒吧房设置了自定义礼物推送
3:修改自定义礼物设置的接口,传递了roomId,用于推送消息
2026-01-08 15:36:17 +08:00
lzl
ac09992b01 messageEx 2026-01-08 14:09:20 +08:00
26a40f8ffb 1:添加实名认证的时候,身份证号前后输入空格,出现的不能实名的情况
2:修改一键全撩的时候,麦上只有自己的时候,就给提示
3:添加酒吧房进入交友房,双方下麦,在麦上的下麦,
2026-01-08 11:43:30 +08:00
lzl
a8ae4a61c2 小黑屋 填充数据。 2026-01-08 11:18:42 +08:00
fe78c968f2 1:添加交友小屋接口
2:修改上下麦展示设置时长的问题
3:修改上主持麦出现选择礼物的弹框
4:添加上嘉宾麦的判断
2026-01-07 20:35:23 +08:00
lzl
9fbb12819f 酒吧 撩她动画播放 and setTime 显示。 2026-01-07 19:25:34 +08:00
6338728ddf 1:修改酒吧房展示的,
2:修改约她接口
2026-01-07 19:19:28 +08:00
50d509dc12 1:添加单个撩ta数据
2:添加约她获取数据
2026-01-07 18:14:05 +08:00
lzl
1c4384f5d5 酒吧 定时器。 2026-01-07 18:03:16 +08:00
5f7bac8a12 1:添加酒吧房上麦 2026-01-07 17:13:33 +08:00
3dcdd1e599 1:修改金币钻石收支接口
2:修改进入房间添加字段
3:修改所有的图片展示,使用url作为key
2026-01-07 17:05:48 +08:00
lzl
d1cd2aeef7 优化头像框加载、麦圈加载,二卡八放到对应fragment加载。 2026-01-07 16:53:36 +08:00
b76136b604 1:修改酒吧房弹框接口调用
2:修改直播间送礼接口
2026-01-07 09:01:59 +08:00
2f0f5ae5e8 1:修改酒吧房弹框接口调用 2026-01-06 15:08:39 +08:00
lzl
d48f13f266 酒吧房 交友小屋 UI 2026-01-06 14:43:12 +08:00
5cc393fe06 1:添加酒吧房的弹框获取数据 2026-01-06 09:37:44 +08:00
44ebb14fb3 1:添加酒吧房各个弹框,只有界面 2026-01-05 16:17:04 +08:00
lzl
9ef4f27ed9 酒吧房 1 2026-01-05 15:43:25 +08:00
43ea35d3a2 1:修改道具商城,当没有banner的时候,出现报错的问题 2026-01-04 18:38:48 +08:00
3efe9c9146 1:将道具商城做成原生的,添加点击的时候展示动效 2026-01-04 17:59:52 +08:00
lzl
b473751913 切换账号登录MQTT未连接修改。 2026-01-04 16:44:49 +08:00
lzl
0e830e411a 多次最小化无法返回问题修改,MainActivity 竖屏显示。互娱房高度340->370 2026-01-04 11:16:31 +08:00
5d17bf8de0 1:修改重复strings 2026-01-04 10:46:55 +08:00
f77b5ba4d7 1:修改系统和官方公告展示html出现标签展示的问题
2:添加群全员禁言和单个禁言的功能
3:将道具商城做成原生的
4:添加应用更新的时候,添加版本判断和重新刷新手机文本,预防出现安装缓存(自己测试十几次,未在出现问题,还需要大量测试)
2026-01-04 08:58:09 +08:00
aa96aa4a3b 1:修改超时时间30秒
2:练歌房已点歌曲,添加展示用户code,
3:修改练歌房已点歌曲展示视图
4:练歌房已点歌曲添加删除功能(接口已经接入,但是隐藏了)
5:修改辅服务器
2025-12-31 16:35:13 +08:00
lzl
8bd22ae41a 小黑屋闪退没有房主信息。 2025-12-31 16:33:09 +08:00
lzl
510aa804ab 82 练歌bean混淆问题。 2025-12-31 10:44:22 +08:00
c2fd1df529 1:添加备用服务器,在请求themeData的时候,返回的不对的时候,就切换服务器 2025-12-31 03:31:31 +08:00
lzl
479e039e56 82 youhua. 2025-12-30 20:02:39 +08:00
9126676599 1:修改获取发送红包的时机,并且添加了当接口返回code=0的时候,也能发送红包 2025-12-30 19:57:29 +08:00
7f881260aa 1:添加签到弹框,当没有签到的时候,进入应用60秒弹出,当已经签到,不在弹框,添加结束清除定时器 2025-12-30 19:22:39 +08:00
lzl
3f1b8ee2fa 82 添加签到延迟1分钟弹出。 2025-12-30 19:05:23 +08:00
7b6be82c54 1:修改红包提示语添加括号 2025-12-30 18:47:13 +08:00
aab29ea784 1:修改点唱房歌手头像转圈
2:修改主题展示
3:修改动态详情
2025-12-30 18:43:00 +08:00
ab556d2519 1:添加元旦主题,添加新的接口 2025-12-30 14:16:03 +08:00
lzl
4f48c55cf6 82 消息背景透明色 1 2025-12-30 14:13:16 +08:00
lzl
359f93aac7 82 fix bugs,消息背景透明色,混淆mapping详细规则。 2025-12-30 14:10:35 +08:00
lzl
e6892d533c 82 fix bugs,网络请求timeout=30。隐藏init chat failed 弹窗。 2025-12-29 22:29:01 +08:00
lzl
67c56b2d4f 82 入场特效播放容错,网络请求timeout=10。 2025-12-29 09:51:27 +08:00
lzl
fa6f40c369 82 2025-12-26 19:41:52 +08:00
lzl
9476655ba3 房间内按钮礼物显示异常优化 2025-12-25 21:30:14 +08:00
lzl
27485de14f 最小化进入房间and拍卖房得到主持权限 添加log. 2025-12-25 19:41:49 +08:00
d6efdefc99 1:修改最小化进入房间后,麦克风状态变化 2025-12-25 18:40:41 +08:00
8b24d3ace5 1:修改红包文字错误 2025-12-25 16:45:53 +08:00
730b94cff5 1:修改礼物展示幸运币的简介 2025-12-25 16:00:30 +08:00
lzl
e3751528ad 一键登录 loading hide 2 2025-12-25 15:31:49 +08:00
lzl
ff9677fa6d 一键登录 loading hide 1 2025-12-25 15:28:20 +08:00
lzl
be2306b50c 一键登录 loading hide,fix bug 2025-12-25 15:27:17 +08:00
2adc4948c7 1:修改启动页播放视频 2025-12-25 15:05:46 +08:00
6b1614d768 1:修改启动页播放视频 2025-12-25 14:54:34 +08:00
8fec498dba 1:还原代码 2025-12-25 14:48:31 +08:00
e26101c35f 1:修改登录出现来回跳 2025-12-25 11:48:11 +08:00
bb31bafa55 1:修改练歌房点歌后,某些歌曲返回的类型错误,
2:修改启动页播放视频,黑屏后直接跳过播放
3:修改退出关闭mqtt
4:修改进入应用,会在登录页面和编辑页面弹起弹框和推荐的问题
5:修改房间,在推送了礼物后,多次判断是否布局打开
2025-12-25 10:31:47 +08:00
826469178e 1:修改互娱房,麦上用户发生变化后,出现点击礼物的时候,没有在麦上的展示出来了
2:修改互娱房换麦不显示离线问题
2025-12-24 19:48:17 +08:00
addd97a434 修改互娱房,麦上用户发生变化后,出现点击礼物的时候,没有在麦上的展示出来了 2025-12-24 18:50:02 +08:00
lzl
84fb05044a 优化麦圈,泄漏处理 2025-12-24 18:33:06 +08:00
342cfd347c 1:修改所有接口返回提示,只是添加了返回错误的提示,不涉及功能
2:给所有网络请求添加网络判断,添加拦截器
3:启动页添加启动视频,添加跳过功能
4:去掉抱麦弹框,直接跳转到用户列表
5:修改拍卖房,当抱人上麦后,没有选择关系,然后退出房间再次进来后,显示立即竞拍的按钮
6:修改我的歌单,添加和修改的时候,选择了不能使用的礼物,让dialog不关闭
7:修改点唱房,点一个人同一首歌,右侧下一首歌的作者不显示的问题
8:修改互娱房,选择关系的时候,会出现两次选择关系的问题
9:修改在送背包礼物的时候,最后一个送出,页面没有刷新
10:修改房间设置里面,点击了抽盘,设置页面不关闭的问题
11:修改个性装扮中,购买的装扮展示的时候,出现图片裁剪
2025-12-24 17:52:26 +08:00
lzl
214c339e93 强更替换为appUpdate库。 2025-12-23 18:20:25 +08:00
bb54407c62 1:修改点唱房切歌 2025-12-23 05:51:57 +08:00
lzl
c22e88eebb fix bugs 2. 2025-12-23 04:18:24 +08:00
lzl
0444a906ba fix bugs 1. 2025-12-23 03:48:19 +08:00
lzl
e4ed3eb9a1 fix bugs. 2025-12-23 03:14:01 +08:00
eee16d3a4a 修改进入房间提示 2025-12-23 01:39:32 +08:00
lzl
e3d4240a82 爵位显示拉伸。 2025-12-23 01:15:54 +08:00
b7320cb51a 1:修改清除魅力报错
2:修改进入房间请求接口出现错误,login没有消失
2025-12-23 00:44:52 +08:00
4a83bbda2d 1:修改已点歌曲,这里如果服务端发送的值存在重复,就重复了 2025-12-23 00:13:40 +08:00
f0451bfeea 1:修改进场特效展示
2:修改已点歌曲展示列表刷新
2025-12-23 00:09:33 +08:00
lzl
7e6d174297 77 fix bugs. 2025-12-22 23:19:16 +08:00
8b24ac310e 1:只是启动页动画
2:修改房间消息,插入动画
2025-12-22 23:06:17 +08:00
9bf2de01d4 1:修改礼物飘屏判断送的人和接收的人
2:修改所有盘在次点击的时候,初始化选中状态
3:修改礼物飘屏的文字大小
4:修改首页去围观展示的文字
2025-12-22 22:30:34 +08:00
lzl
c7018cce42 Merge remote-tracking branch 'origin/branch_new' into branch_new 2025-12-22 19:19:09 +08:00
lzl
320f742b87 77 拍卖房闪退。 2025-12-22 19:18:58 +08:00
ec2e754806 1:修改房间设置功能 2025-12-22 18:40:57 +08:00
lzl
daba3d9872 77 红包 bug修改。 2025-12-22 18:32:11 +08:00
lzl
435d2084d1 77 红包 bug修改。 2025-12-22 16:46:54 +08:00
e3744843d9 1:修改幸运值总流水展示 2025-12-22 15:30:47 +08:00
9774b0bb2c 1:修改暴币展示飘屏换行 2025-12-22 15:24:26 +08:00
lzl
ed7632c142 77 每日任务根据id判断是师傅还是cp 2025-12-22 14:30:32 +08:00
f5287becee 1:添加更换设置服务器地址
2:添加关闭红包声音图标
2025-12-22 14:04:19 +08:00
lzl
e21345ba61 77 3秒 2025-12-22 11:25:31 +08:00
lzl
ca3580ad28 77 加入房间前判断上一个房间是否游戏中,日志上传后删除之前的日志数据。 2025-12-22 11:04:53 +08:00
837231f4f0 1:修改送礼中趣味的岁月之城和时空之巅,不需要选择人员就可以打开
2:优化用在房间点击用户,点击抱麦出现的错误
3: 在岁月之城和时空之巅中查看记录的时候,进行判断,当返回的nickname是null的时候,就直接不展示赠与
4:修改任务UI,
5:添加房间暴币功能
6:修改房间暴币飘屏
7:添加启动页动画
8:修改房间的设置
2025-12-22 09:02:42 +08:00
53b9f0f034 1:修改送礼中趣味的岁月之城和时空之巅,不需要选择人员就可以打开
2:优化用在房间点击用户,点击抱麦出现的错误
3: 在岁月之城和时空之巅中查看记录的时候,进行判断,当返回的nickname是null的时候,就直接不展示赠与
4:修改任务UI,
5:添加房间暴币功能
6:修改房间暴币飘屏
7:添加启动页动画
8:修改房间的设置
2025-12-22 09:02:22 +08:00
f34a67c2e8 Merge remote-tracking branch 'origin/branch_new' into branch_new 2025-12-19 18:42:30 +08:00
6bd210217a 1:修改手机换绑倒计时添加管理类 2025-12-19 18:41:29 +08:00
lzl
6c8065711d 77 红包闪退,红包可以1=1, 2025-12-19 18:41:16 +08:00
lzl
5c607c58ae 77 签约房内切换初始化数据,红包闪退 2025-12-19 15:54:08 +08:00
f2363dad01 1:修改巡乐会抽奖次数,更改为1-5-8
2:修改手机换绑和手机绑定
3:修改系统消息展示背景
2025-12-19 15:52:22 +08:00
07dbffaa5a 1:修改巡乐会抽奖次数,更改为1-5-8
2:修改手机换绑和手机绑定
3:修改系统消息展示背景
2025-12-19 15:51:24 +08:00
lzl
b028ec883b 77 签约房开始webp动画根据屏幕尺寸走 2025-12-19 11:45:35 +08:00
lzl
552e238254 77 签约房开始webp动画,练歌房右侧麦上用户刷新。 2025-12-19 11:27:42 +08:00
3fde4df00f 1:修改去上一个房间出现的im未连接的问题
2:修改房间点击用户主页更改pitnumber判断问题
2025-12-19 09:23:05 +08:00
lzl
471a0453fa 77 pk隐藏 2025-12-18 19:06:17 +08:00
lzl
420afc7a1e 77 练歌房 演唱者麦 2025-12-18 17:10:38 +08:00
6130accb48 1:修改房间排行榜头像图、小时榜背景图 2025-12-18 17:02:54 +08:00
e2b0c9ce8c 1:修改获取验证码,当返回后才会更新页面(两个地方没有修改:1:提现的二次确认和注销的二次确认) 2025-12-18 15:53:48 +08:00
lzl
894b397537 77 优化签约房按钮 2025-12-18 14:24:09 +08:00
lzl
6207705d2a 77 fix bugs. 2025-12-18 11:17:51 +08:00
lzl
f5fea27595 Merge remote-tracking branch 'origin/branch_new' into branch_new 2025-12-18 10:33:17 +08:00
lzl
c388d765d4 77 交友房上麦 2025-12-18 10:33:00 +08:00
952621baaa 1:添加cos的混淆规则 2025-12-18 10:28:46 +08:00
lzl
df499aaa6c 77 优化任务领取,log存储data/data/ 2025-12-17 19:22:14 +08:00
3d8e152cd8 1:修改mqtt链接适用域名链接
2:修改粉丝列表展示按钮错误的问题
2025-12-17 19:00:37 +08:00
lzl
727e343d1f 77 优化底部按钮显示。 2025-12-17 18:59:25 +08:00
ef27636564 1:更新实名认证添加toast 2025-12-17 11:44:45 +08:00
aa778ca1de 1:修改排行榜适配
2:添加踢出房间成功toast
3:删除多余重复的图标
2025-12-17 10:55:00 +08:00
lzl
90077d24f6 77 红包非当前房间的不添加。 2025-12-17 09:31:54 +08:00
lzl
81b41ef392 77 广场列表内容显示不全and注销用户跳转个人主页 2025-12-16 18:32:46 +08:00
lzl
c2714ff68a 77 7 跳转创建房间 判断是否实名认证 2025-12-16 17:52:57 +08:00
lzl
1fbece3e62 77 7 跳转创建房间 2025-12-16 17:40:38 +08:00
lzl
7f4843b023 77 任务显示item复用修改 2025-12-16 17:32:58 +08:00
lzl
ec3f3d6233 77 任务显示优化。 2025-12-16 17:21:45 +08:00
1b06d5725f 1:修改练歌房修改调音台成0的时候,更换演唱者没有声音了 2025-12-16 17:10:04 +08:00
0874998249 1:修改家族中滑动展示问题 2025-12-16 16:15:41 +08:00
lzl
b611147176 77 2025-12-16 15:43:44 +08:00
ac9d9b19fd 1:修改歌单列表每一次获取20条 2025-12-16 15:42:29 +08:00
lzl
ea2b45c1be 切歌接口添加新参数isAutoNext 0:被动,1:自动。 2025-12-16 15:06:26 +08:00
19bc9dbad8 1:修改全部任务显示添加角标 2025-12-16 14:51:57 +08:00
lzl
4b356a6ce4 任务修改。 2025-12-16 14:44:48 +08:00
lzl
72a7eecbcd cp空间刷新加载,roomA删除无用代码。 2025-12-16 09:53:39 +08:00
9b7c586d6b 1:修该话题选择的时候的title,更改为在代码中进行设置 2025-12-16 09:51:19 +08:00
41e4dcf2fc 1:修改房间设置中房间类型的图标,交友和点唱互换 2025-12-15 19:35:25 +08:00
a512b50343 1:修改房间明细下拉刷新和上拉加载展示问题 2025-12-15 19:06:28 +08:00
a9af37489e 1:修改房间明细展示头像出现拉伸的情况 2025-12-15 18:59:00 +08:00
lzl
e16878b0cf 用户列表首次显示优化。 2025-12-15 18:52:13 +08:00
8dcafa37ba 1:优化充值页面,展示金额recyclerview自适应高度 2025-12-15 18:42:10 +08:00
a7a24b52f9 1:修改背包上拉加载不显示的问题
2:修改礼盒记录标题显示
2025-12-15 18:20:05 +08:00
c2f5376ec8 1:修改歌单列表出现删除完成后,页面没有刷新的问题 2025-12-15 17:55:18 +08:00
39098757fd 1:修改点唱房中查看历史点歌记录出现数据错乱的情况 2025-12-15 17:41:01 +08:00
7768a8f70b 1:修改礼物取消选择后,还能送出的问题
2:修改背包礼物取消选择后还能送出的问题
3:修改打赏礼物取消选择后还能送出的问题
2025-12-15 17:02:09 +08:00
lzl
42f786f9ef 76 1.0.8.6 apk download 2025-12-15 15:39:15 +08:00
lzl
0c8163277a 76 1.0.8.6 apk down 路径qipao/apk/xxx 2025-12-15 14:48:02 +08:00
lzl
c2096a8274 76 1.0.8.6 2025-12-15 14:27:57 +08:00
lzl
5fb367e321 app内下载apk修改。 2025-12-15 14:22:09 +08:00
lzl
14782341f9 测试app内下载安装 2025-12-15 10:23:22 +08:00
lzl
724046c9c6 添加log. 2025-12-13 01:26:07 +08:00
b915e9d044 1:还原礼物选择问题 2025-12-13 00:44:30 +08:00
lzl
f80582a189 hh 2025-12-12 23:39:13 +08:00
lzl
c200c6c307 fix bugs. 2025-12-12 23:15:30 +08:00
dce92eb61a 1:添加修改房间信息更新 2025-12-12 23:09:29 +08:00
56d5d40214 1:修改跳转房间出现roomId丢失的问题
2:修改红包列表上拉加载和下拉刷新
3:给签约房添加倒计时展示
2025-12-12 22:25:04 +08:00
lzl
98f8928bc8 fix bugs. 2025-12-12 21:46:35 +08:00
bc4e9b4bfa 1:修改点歌中的历史点歌中昨日列表 2025-12-12 20:53:26 +08:00
fda29801b3 1:我的歌单下拉刷新修改 2025-12-12 20:38:11 +08:00
lzl
13d8e94083 fix bugs. 2025-12-12 20:20:50 +08:00
lzl
be09d0e792 84 跳转房间 taskid=null,fix bugs. 2025-12-12 19:23:35 +08:00
ec535432e7 1:修改挚友中出现查看别人的时候,展示的删除和置顶按钮 2025-12-12 19:13:30 +08:00
c563354117 1:爵位支付不选支付方式,容错 2025-12-12 19:05:29 +08:00
71fce13074 1:修改排行榜中心动榜榜三不显示头像的问题 2025-12-12 18:51:43 +08:00
1746e7a89b 1:添加了师徒的礼物标签 2025-12-12 18:41:03 +08:00
d63fd43ad2 1:添加了师徒的礼物标签 2025-12-12 18:30:20 +08:00
8faac0f526 1:修改每日任务的容错
2:修改签到弹框布局变更
2025-12-12 18:13:26 +08:00
dfefaae153 1:修改音效中的音量按键图标 2025-12-12 17:23:22 +08:00
lzl
23de7e5bf6 84 任务跳转 2025-12-12 16:02:42 +08:00
37395ccff3 1:修改签到布局 2025-12-12 15:57:11 +08:00
ebf29b2aa2 1:修改签到展示布局页面 2025-12-12 15:52:06 +08:00
f646493800 1:添加签到功能,在首页展示,跟在青少年模式下,
2:在任务页面展示签到功能
2025-12-12 15:28:15 +08:00
6825009aba 1:添加签到功能,在首页展示,跟在青少年模式下,
2:在任务页面展示签到功能
2025-12-12 15:27:32 +08:00
lzl
17b562f194 84 师徒任务添加容错 2025-12-12 11:40:44 +08:00
lzl
89374e536d 84 房间跳转优化。 2025-12-12 10:32:35 +08:00
lzl
0d8b0134d9 84 任务优化。 2025-12-12 10:13:45 +08:00
lzl
feb922624f 84 2025-12-12 09:22:05 +08:00
lzl
6bae825d0f 邀请进入房间dialog 弹出优化。 2025-12-12 09:17:05 +08:00
lzl
d470b2fdb1 任务1 2025-12-11 21:05:04 +08:00
ed0eccd0ee 1:修改注冊的时候,年龄必选,并且更改默认年龄是18年前
2:修改创建房间,本地进行判断改为服务端进行判断
3:修改歌手认证bug
4:修改和用户相关的出现为空的错误
5:修改挚友在用户主页的位置,不丝滑的滑动问题
6:修改搜索页面展示全部房间,用户展示性别
2025-12-11 21:04:25 +08:00
lzl
ecdd2fc063 房间列表上拉加载 2025-12-11 09:19:54 +08:00
b6bc353db1 1:每日任务展示列表 2025-12-11 09:07:21 +08:00
e386b072f5 1:修改挚友展示不正确
2:修改歌单显示重复展示
3:修改家族收益上拉刷新展示不全
2025-12-10 19:43:43 +08:00
lzl
3263fbd7f6 83 fix bugs. 2025-12-10 18:42:52 +08:00
lzl
b5b443e188 83 room_details_list 2025-12-10 18:10:46 +08:00
lzl
9d546717db 83 优化 2025-12-10 18:06:10 +08:00
dab7e1e83a 1:添加注释
2:修改钻石支出和金币支出最后不显示的问题
2025-12-10 16:21:27 +08:00
lzl
8232415cbf 83 2025-12-10 16:16:10 +08:00
lzl
611c4829ce fix bugs.1 72 2025-12-10 15:30:34 +08:00
2b137643f2 1:修改文字错误 2025-12-10 15:00:05 +08:00
lzl
913e92644c fix bugs.72 2025-12-10 14:54:47 +08:00
lzl
531d62ae3a fix bugs.71 2025-12-10 14:54:06 +08:00
lzl
19ce1dbe94 fix bugs. 2025-12-10 14:35:03 +08:00
lzl
91e222554a 判断隐藏显示 2025-12-10 14:07:55 +08:00
lzl
a9c2bd9878 首页弹窗推荐接口数据类型不对添加判断。 2025-12-10 11:15:32 +08:00
75f11fdb06 1:修改二次验证的文字大小 2025-12-10 09:59:09 +08:00
lzl
a9af0efdc9 弹窗推荐打开 2025-12-10 09:50:18 +08:00
0e2386ca5f 1:去掉点击关闭的时候,清空倒计时 2025-12-10 09:44:00 +08:00
lzl
aa568d73ee 管理不可以设置主持。 2025-12-09 19:33:42 +08:00
lzl
fdd7de3473 Merge branch 'branch_new_69' into branch_new 2025-12-09 19:07:52 +08:00
lzl
1dbdb9cabf 1 2025-12-09 19:06:06 +08:00
lzl
314ce6007d fix bugs. 1 2025-12-09 19:04:19 +08:00
lzl
829636f594 Merge branch 'branch_new' into branch_new_69 2025-12-09 18:24:15 +08:00
lzl
b3bc8ebdcb 合并1 2025-12-09 18:23:54 +08:00
0d188736b2 1:修改在线用户展示
2:修改最小化进入房间更新数据
2025-12-09 18:14:52 +08:00
lzl
8b9fd2ba08 fix bugs. 2025-12-09 15:07:27 +08:00
lzl
26a8188fcb roomfragmet 加载fragment 切换为FragmentContainerView。 更换动画 2025-12-09 10:43:36 +08:00
lzl
aed51479a4 roomfragmet 加载fragment 切换为FragmentContainerView。 2025-12-09 10:38:26 +08:00
338d704904 1:修改头像截取设置默认宽高
2:修改首页默认展示房间列表tab
3:修改创建房间,提示需要签约10个徒弟的功能
4:修改注销用户的时候,当有手机号的时候,进行二次验证码确认
5:首页推荐房间弹框
2025-12-08 19:08:07 +08:00
lzl
1af373846f gift 测试背景 去除。 2025-12-08 19:01:09 +08:00
lzl
079d9ab1b1 1.签约抱麦添加拒绝逻辑。
2.爵位不返回userInfo 逻辑容错。
3.礼物动画优化。
2025-12-08 19:00:15 +08:00
61106bc5eb 1:修改首页展示tab,添加最小宽度 2025-12-07 17:19:59 +08:00
lzl
0e20a463e7 Merge remote-tracking branch 'origin/branch_new' into branch_new 2025-12-07 16:39:47 +08:00
0aa5d93571 1:修改礼物墙获取数据位置 2025-12-07 16:39:23 +08:00
lzl
233c6926ad 69 1 2025-12-07 16:08:13 +08:00
aeac7a9735 Merge remote-tracking branch 'origin/branch_new' into branch_new 2025-12-07 11:50:28 +08:00
905f85abd8 1:修改礼物不显示金币的问题 2025-12-07 11:50:17 +08:00
lzl
9bea2b4e24 68 1 2025-12-07 11:36:04 +08:00
786295def1 1:修改KTV出现没有歌的时候,就还显示所有对应的按钮 2025-12-07 10:22:27 +08:00
d6915a6305 1:修改KTV无歌曲后清空原有歌词 2025-12-06 19:10:57 +08:00
83b4097fa2 1:修改KTV布局 2025-12-06 18:37:41 +08:00
lzl
8a32effeab 66 2 2025-12-06 18:04:52 +08:00
lzl
b90d1c0c98 66 1 2025-12-06 16:49:23 +08:00
lzl
1c9452d1fa 66 2025-12-06 15:19:54 +08:00
b5fab23e56 1:修改音域我的,底部更多的布局
2:修改歌手认证展示
2025-12-06 15:17:41 +08:00
c44ae5bc48 1:修改排行榜展示心动榜 2025-12-06 15:00:14 +08:00
lzl
e4122ef8e6 fix bugs.11 2025-12-06 14:47:28 +08:00
lzl
831537f057 fix bugs. 2025-12-06 14:01:20 +08:00
lzl
0edbb23cf8 高度写死 2025-12-06 11:54:58 +08:00
lzl
335147f962 fix bugs.11 2025-12-06 11:20:19 +08:00
lzl
87b73e7ca2 fix bugs.10 2025-12-06 10:32:31 +08:00
lzl
97dd450074 fix bugs.9 2025-12-06 10:16:25 +08:00
lzl
cb9951dd66 fix bugs.8 2025-12-06 09:56:16 +08:00
lzl
ad29cce6a5 fix bugs.7 2025-12-06 09:30:18 +08:00
lzl
5ee3c19afb fix bugs.6 2025-12-06 09:04:43 +08:00
lzl
ed1d376bf2 fix bugs.5 2025-12-05 23:47:33 +08:00
lzl
7bcc347561 fix bugs.4 2025-12-05 23:20:40 +08:00
cd80d03c7b 1:修改房间内在线用户布局偏上的问题 2025-12-05 22:39:34 +08:00
0d9a283142 1:修改离线图 2025-12-05 21:45:04 +08:00
6721e8e376 1:修改红包跳转和小时榜跳转,头条跳转 2025-12-05 21:22:31 +08:00
lzl
60b910c38f fix bugs.3 2025-12-05 21:05:01 +08:00
b4ffa086fb 1:修改趣味不播放动画的问题 2025-12-05 20:26:05 +08:00
3fea806732 1:修改点唱房问题
2:修改我的家族展示问题
2025-12-05 19:40:05 +08:00
lzl
582adedd55 64 2025-12-05 18:43:34 +08:00
lzl
efadb819b9 fix bugs.3 2025-12-05 18:42:55 +08:00
6e9ba920d1 1:修改BUG 2025-12-05 18:29:20 +08:00
lzl
8965243e0a fix bugs.2 2025-12-05 16:41:32 +08:00
8640c7366a 1:修改BUG 2025-12-05 14:35:34 +08:00
lzl
3a193da90d fix bugs.1 2025-12-05 14:26:38 +08:00
lzl
4136077e98 fix bugs. 2025-12-05 10:48:31 +08:00
fbc2a57593 1:修改点唱房头像框显示 2025-12-05 00:25:51 +08:00
lzl
016e1329da 刷新 2025-12-05 00:23:22 +08:00
lzl
7f200fbafc 点唱修改。 2025-12-05 00:04:12 +08:00
fac83d7c23 1:修改点唱房已点歌曲展示置顶的问题 2025-12-04 23:56:19 +08:00
lzl
f985ea9aeb 点唱修改。 2025-12-04 23:47:51 +08:00
lzl
a808da0df5 1001 速度过快null 2025-12-04 23:20:40 +08:00
lzl
dc42ad9049 cpview CircularImage 2025-12-04 23:13:52 +08:00
lzl
741063f239 Merge remote-tracking branch 'origin/branch_new' into branch_new 2025-12-04 23:11:17 +08:00
lzl
99dbd3d321 cpview 播放添加延迟2秒 2025-12-04 23:11:11 +08:00
f5c00c640d 1:修改点唱房展示错误 2025-12-04 23:09:16 +08:00
lzl
532f85e9e2 cpview 回退 2025-12-04 23:07:36 +08:00
lzl
b46913b920 拍卖房 fix bugs. 2025-12-04 22:51:36 +08:00
lzl
2756fdb4b7 签约视图高度and闪退修改 62 2025-12-04 21:13:12 +08:00
babd07e592 1:修改bug 2025-12-04 21:12:00 +08:00
c632692982 1:修改bug 2025-12-04 20:56:30 +08:00
lzl
56bb994377 点唱无唱者闪退修改 2025-12-04 18:48:43 +08:00
defb31a217 1:打赏去掉趣味展示 2025-12-04 17:58:04 +08:00
lzl
f8460f0239 房间类型切换隐藏延时and关闭 2025-12-04 17:41:40 +08:00
5b22ebd218 1:修改家族展示续签按钮位置
2:修改购买爵位前,先请求一次接口
3:修改所有CP更改为心动
4:修改挚友,初始获取数据变更成40条
5:未实名认证不能进行歌手认证
6: 点唱房换麦出现页面展示不对
2025-12-04 17:38:13 +08:00
lzl
ff2b5aa668 小黑屋跳转逻辑修改。 2025-12-04 16:29:26 +08:00
lzl
057f623eec 小黑屋退出闪退 2025-12-04 15:59:57 +08:00
46b0a856fe 1:修改家族展示续签按钮位置
2:修改购买爵位前,先请求一次接口
3:修改所有CP更改为心动
4:修改挚友,初始获取数据变更成40条
5:未实名认证不能进行歌手认证
2025-12-04 15:20:05 +08:00
lzl
0f0c2d97cc 1035 bug修改,拍卖房心动礼物无法选择添加toast 2025-12-04 15:18:30 +08:00
lzl
64f538f04d 个人信息显示,签约1035添加 2025-12-04 14:25:09 +08:00
885f981b6f 1:修改拍卖房和互娱房展示离线状态
2:修改在线列表为用户列表
3:修改扩列展示用户性别
2025-12-04 14:06:12 +08:00
lzl
f9e9811c4b 心动空间 时间显示。 2025-12-04 11:09:39 +08:00
lzl
ea188cde92 签约 充值 2025-12-04 10:19:57 +08:00
23a07562b7 1:修改CP特效出现头像不规则的问题 2025-12-04 10:18:51 +08:00
lzl
22a1f420ea 添加震动 2025-12-03 20:16:07 +08:00
0d5e64e31a 1:修改点歌房出现的错误
2:修改进入家族详情页面
2025-12-03 20:02:14 +08:00
lzl
8e9f6fa23c fix bugs.2 2025-12-03 17:33:30 +08:00
9a4b9b973b 1:修改房间离线展示 2025-12-03 17:08:01 +08:00
lzl
50ef12ee3b fix bugs. 2025-12-03 14:58:21 +08:00
lzl
0f054e1b69 fix bugs. 2025-12-03 13:59:47 +08:00
e0f6dff1d6 1:修改群聊可以不充值发送消息
2:修改群聊设置不用退出多次
2025-12-03 11:44:20 +08:00
a4c2fdb859 1:修改爵位进场很慢的情况 2025-12-03 10:33:15 +08:00
lzl
8d35790413 if ((message.getMsgType() == 1001 || message.getMsgType() == 1080) && publicScreenListeners.isEmpty()) {
cacheMessage(message.getRoomId(), message);
        }
2025-12-03 10:31:11 +08:00
lzl
dc9726d5b4 更换vap库 2025-12-03 09:09:57 +08:00
lzl
10e5504ce1 fix bugs. 2025-12-02 19:35:18 +08:00
d94d7a75df 1:修改测试出来的bug,关于:身价、我的家族、歌手认证、挚友、房间心跳、 2025-12-02 19:26:37 +08:00
lzl
8ce028379c fix bugs. 2025-12-02 15:37:29 +08:00
7bf2297750 1:我的页面展示身价 2025-12-02 14:41:21 +08:00
4d2c1a5ace 1:取消所有的切换后台、im重连给服务段发送接口
2:修改1058,所有房间添加展示离线
2025-12-02 14:11:40 +08:00
lzl
56489b3af7 Merge branch 'branch_new_dev' into branch_new 2025-12-02 11:42:12 +08:00
lzl
456a063bbf mqtt 连接 2025-12-02 11:41:32 +08:00
9135198b9d Merge remote-tracking branch 'origin/branch_new' into branch_new
# Conflicts:
#	MainModule/src/main/java/com/xscm/modulemain/activity/room/activity/RoomActivity.kt
2025-12-02 10:57:32 +08:00
1ec1b12e6c 1:点唱房添加在离线
2:修改心跳时长
2025-12-02 10:56:37 +08:00
lzl
23751fd1fa 签约 1058 2025-12-02 10:49:51 +08:00
lzl
6e269d89ec log打印添加重定向 2025-12-02 10:11:44 +08:00
980ec43e6c 1:修改当在游戏房间的时候,不能点击其他房间进入,
2:在进入房间后,退出上一个房间的各种调用
2025-12-01 18:41:14 +08:00
lzl
6891805e36 礼物添加log 2025-12-01 18:20:34 +08:00
lzl
be60810221 签约 麦上用户拍卖更新麦上用户信息 2025-12-01 17:43:56 +08:00
lzl
85df01db3b 签约 显示 2025-12-01 17:28:24 +08:00
lzl
43138a56bc 签约规则 2025-12-01 16:59:58 +08:00
lzl
d42fb54aee 优化弹窗 2025-12-01 16:52:10 +08:00
lzl
5f93d184d2 签约 开始成功失败 2025-12-01 16:00:11 +08:00
e925a0c2a5 1:修改师父标签
2:修改签约房的清除魅力我更新魅力
2025-12-01 15:35:22 +08:00
lzl
49e345db2c 签约 刷新数据 2025-12-01 15:26:57 +08:00
lzl
15e5a5ae4b 公屏自动滚动 2025-12-01 15:10:52 +08:00
lzl
18c3f494a3 签约 完善 2 2025-12-01 14:07:14 +08:00
lzl
06ce98a3ab 签约 完善 1 2025-12-01 11:34:56 +08:00
9183342636 1:添加在房间点击用户头像,展示有师傅的头像,并且添加点击事件
2:点击用户头像,进入用户主页的时候,展示师傅的头像
2025-12-01 10:29:34 +08:00
lzl
fd9af6a253 Merge branch 'branch_new_dev' into branch_new 2025-12-01 09:06:39 +08:00
lzl
050c9dcb8b 更换域名 mqtt H5 2025-12-01 09:02:06 +08:00
lzl
94a55bafea 签约 A 2025-11-28 19:04:18 +08:00
847c768e4d 1:修改点唱房的页面展示问题
2:修改家族展示的问题
2025-11-28 19:01:37 +08:00
2b750c5f06 1:完成家族中续签请求接口和弹框展示的文案 2025-11-28 16:53:27 +08:00
lzl
995d7c1e90 添加接口 2025-11-28 14:39:57 +08:00
784a67214d 1:完成才艺展示功能 2025-11-28 14:38:03 +08:00
lzl
cb0b4f34f9 删除provider 2025-11-28 11:10:30 +08:00
lzl
b089f4a56f 签约 1.1 2025-11-28 10:53:50 +08:00
lzl
a22cade574 签约 1 2025-11-28 10:43:16 +08:00
c216099173 1:完成我的家族功能 2025-11-28 09:13:08 +08:00
lzl
7821ef304d 合并 2025-11-28 09:09:37 +08:00
lzl
3ed79a24bb 页面销毁网络请求还存在。 2025-11-28 09:04:27 +08:00
lzl
dce8b08a3f 签约上下麦 2025-11-28 09:00:38 +08:00
lzl
18559d0553 Merge branch 'branch_new_dev' into branch_new 2025-11-27 16:06:17 +08:00
lzl
9fdacb2fd5 顶部用户列表增大点击区域。 2025-11-27 16:05:10 +08:00
lzl
bcf6dd6849 fix bugs 55 4 2025-11-27 15:45:10 +08:00
lzl
fe9e192aea 合并 2025-11-27 11:59:19 +08:00
lzl
fe1ad2a732 Merge branch 'branch_new_dev' into branch_new 2025-11-27 11:53:16 +08:00
lzl
5ed3717acc fix bugs 55 3 2025-11-27 11:47:10 +08:00
lzl
2a0c3b6d7f 合并 new_dev 2025-11-26 17:27:56 +08:00
lzl
366478f547 关系列表。 2025-11-26 16:55:02 +08:00
603899ddef 1:给我的页面和设置页面添加点击日志 2025-11-26 16:32:46 +08:00
lzl
09984c59ff fix bugs 55 2 2025-11-26 16:27:14 +08:00
9887185133 1:添加签约房的按钮
2:我的家族和的身价页面完成
3:个性装扮降身卡完成
2025-11-26 15:52:46 +08:00
lzl
2221a11f0a fix bugs 55 2025-11-26 12:01:31 +08:00
lzl
1753d9a98d 签约房UI 2025-11-26 09:04:58 +08:00
cc42d0f90f 1:修改其他房间类型送礼出现的报错 2025-11-25 09:12:09 +08:00
0dd7c367cb 1:添加cp进场动画效果
2:修改cp礼物弹框
3:添加组成cp后进入心动空间跳转
2025-11-24 18:48:14 +08:00
lzl
a1e123f0bf 接口返回数据错乱容错。 2025-11-24 16:07:59 +08:00
lzl
6edd0ed339 心动空间 优化帮助。 2025-11-24 14:10:17 +08:00
c4c6072c16 1:添加Cp动画 2025-11-24 09:59:58 +08:00
lzl
83307295bb 心动空间规则 2025-11-22 18:58:54 +08:00
a125d8d9b4 1:添加Cp动画,需调试 2025-11-22 18:55:17 +08:00
lzl
2a6d2e4709 心动空间 2025-11-22 18:38:49 +08:00
5eac6d302c 1:修改点唱房的bug
2:添加公会消息类型
2025-11-22 16:06:32 +08:00
lzl
18b1235a80 解决冲突 2025-11-22 11:27:23 +08:00
lzl
95a1e21909 合并 fix bugs 2025-11-22 11:22:41 +08:00
lzl
3c344e1359 1 2025-11-22 11:09:15 +08:00
lzl
46b02ac407 互娱麦圈 and 聊天框问题。 2025-11-22 10:54:32 +08:00
af8b87dd47 1:挚友列表添加头像框展示,服务器返回就展示,不返回不展示 2025-11-22 09:23:32 +08:00
lzl
a79593238d Pk 2025-11-21 19:28:44 +08:00
lzl
a3e3e3cf30 A 2025-11-21 19:15:46 +08:00
lzl
7e33926a03 A 2025-11-21 19:04:54 +08:00
lzl
d2b9b385d9 fix bugs. 2025-11-21 18:55:12 +08:00
1dfcf4e98c 1:完成挚友功能
2:添加在送特定礼物展示弹框功能
3:修改部分图片格式变成wedp
4:用户主页添加礼物墙和挚友
2025-11-21 18:54:40 +08:00
lzl
3c83906870 user home 2025-11-21 10:23:36 +08:00
lzl
355141a2a8 userHomePage add cp. 2025-11-20 19:21:20 +08:00
lzl
117ee41ff2 优化房间用户信息弹窗cp动画头像显示。 2025-11-20 16:34:06 +08:00
lzl
db79bafdbc 房间用户信息。 2025-11-20 16:11:13 +08:00
lzl
cc2ed4f219 版本53/1.0.6.4 2025-11-20 10:34:34 +08:00
lzl
cf73819ad0 登录默认选中 2025-11-20 10:16:45 +08:00
be7c855283 1:修改我的页面点击事件 2025-11-20 10:06:17 +08:00
lzl
acec782e3a Merge branch 'branch_new_dev' into branch_new 2025-11-20 09:42:20 +08:00
57b8ded0eb 1:完成cp效果展示, 2025-11-20 09:40:53 +08:00
lzl
e9e50c1b65 修改删除重复xml. 2025-11-20 09:36:59 +08:00
lzl
68dc7574bc room user info 2025-11-19 18:55:14 +08:00
lzl
f7b46d7320 Merge branch 'branch_new_dev' into branch_new 2025-11-19 10:38:48 +08:00
lzl
1fdcab95f6 roomBean = null 2025-11-19 10:37:31 +08:00
b3f6d3a3fb 修改点唱房页面展示错误 2025-11-19 09:43:33 +08:00
88a94c7c10 点唱房功能 2025-11-18 19:39:16 +08:00
lzl
45923ae858 隐藏爵位 2025-11-18 19:15:34 +08:00
lzl
18bd2d3ba0 fix bugs. 2025-11-18 18:28:16 +08:00
lzl
3322cfeb22 fix bugs. add 字体流光 自定义view,cos上传报错信息。 2025-11-14 17:38:30 +08:00
lzl
68b4a66046 头像显示 and 爵位内页 优化 2025-11-12 19:09:21 +08:00
lzl
c41a9f13f3 礼物墙 2025-11-12 16:55:26 +08:00
lzl
d80222afef 合并2 2025-11-12 16:42:51 +08:00
lzl
8013268816 合并1 2025-11-12 16:40:26 +08:00
lzl
d4721faa42 eventbus and im 添加log打印。 2025-11-11 15:07:14 +08:00
lzl
8d983bfa99 添加log and crash 保存本地,分享。 2025-11-11 10:48:20 +08:00
lzl
0aca66ce84 在线用户列表标签显示优化。
礼物点击弹窗多次闪退修改。
2025-11-10 11:09:06 +08:00
lzl
a1901a130f 房间内部优化。 2025-11-08 17:45:45 +08:00
lzl
33c2bf2ffd 离线显示优化。 2025-11-07 10:03:18 +08:00
lzl
516bbf6a23 ~ 2025-11-07 09:23:32 +08:00
lzl
a8dcfbb6a7 修改名称。 2025-11-07 09:22:39 +08:00
lzl
d9cf55b053 loading 添加点击拦截。 2025-11-07 09:04:08 +08:00
lzl
8c23465af3 pk 2025-11-06 11:53:23 +08:00
lzl
ab86340a1b 代码合并 至 2025.11.3 20:29 2025-11-05 11:08:00 +08:00
lzl
2254a27dae 礼物墙 and tablayout 2025-11-05 09:51:00 +08:00
lzl
8d0c9e5415 声网声音管理类 2025-11-04 18:08:30 +08:00
lzl
fadd3294d9 广场 逻辑优化补全 2025-11-04 16:39:10 +08:00
lzl
10f24b4b69 我的房间 2025-11-03 15:30:57 +08:00
lzl
331b33fdd7 房间优化 1 2025-11-03 14:16:27 +08:00
lzl
7a81001f2a 交友房 2025-10-31 15:18:32 +08:00
lzl
6098927e73 合并PK 2025-10-30 11:56:41 +08:00
lzl
430816878d 删除部分不需要代码。 2025-10-30 09:19:46 +08:00
lzl
f1ef717e2b 添加跳转动画 2025-10-29 16:45:31 +08:00
lzl
8824498c2b eventbus调用销毁整合。 2025-10-29 11:03:42 +08:00
lzl
0e0c42d57d 统一继承BaseMapActivity 2025-10-29 09:10:03 +08:00
lzl
a5ed5e9b3a 合并module base 2025-10-28 19:13:52 +08:00
lzl
28bd8e9eb6 合并module 1 2025-10-28 16:56:13 +08:00
lzl
de05b70310 test 2025-10-28 12:10:39 +08:00
3753 changed files with 95188 additions and 37413 deletions

15
.gitignore vendored
View File

@@ -1,15 +0,0 @@
*.iml
.gradle
/local.properties
/.idea/caches
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/assetWizardSettings.xml
.DS_Store
/build
/captures
.externalNativeBuild
.cxx
local.properties

2
.idea/.name generated
View File

@@ -1 +1 @@
秘地
羽声语音

View File

@@ -1,45 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="app" type="AndroidRunConfigurationType" factoryName="Android App" activateToolWindowBeforeRun="false">
<module name="羽声.app" />
<option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" />
<option name="DEPLOY" value="true" />
<option name="DEPLOY_APK_FROM_BUNDLE" value="true" />
<option name="DEPLOY_AS_INSTANT" value="false" />
<option name="ARTIFACT_NAME" value="" />
<option name="PM_INSTALL_OPTIONS" value="" />
<option name="ALL_USERS" value="false" />
<option name="ALWAYS_INSTALL_WITH_PM" value="false" />
<option name="ALLOW_ASSUME_VERIFIED" value="false" />
<option name="CLEAR_APP_STORAGE" value="false" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="RESTORE_ENABLED" value="false" />
<option name="RESTORE_FILE" value="" />
<option name="RESTORE_FRESH_INSTALL_ONLY" value="true" />
<option name="CLEAR_LOGCAT" value="true" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="true" />
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
<option name="DEBUGGER_TYPE" value="Java" />
<Java>
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
<option name="DEBUG_SANDBOX_SDK" value="false" />
</Java>
<Profilers>
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Sample (legacy)" />
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
</Profilers>
<option name="DEEP_LINK" value="" />
<option name="ACTIVITY" value="" />
<option name="ACTIVITY_CLASS" value="" />
<option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
<option name="SKIP_ACTIVITY_VALIDATION" value="false" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -44,7 +44,6 @@ android {
kotlinOptions {
jvmTarget = '11'
}
packagingOptions {
// exclude 'lib/arm64-v8a/libagora-fdkaac.so'
}
@@ -67,8 +66,8 @@ dependencies {
implementation project(':moduletablayout')
implementation libs.activity
implementation libs.constraintlayout
implementation libs.androidx.appcompat
implementation libs.androidx.appcompat
api 'androidx.activity:activity-compose:1.8.2'
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
@@ -169,14 +168,17 @@ dependencies {
//
//sdk
api('com.tencent.liteav:LiteAVSDK_Professional:10.9.0.13102')
api('com.google.android.exoplayer:exoplayer-core:2.19.1')
api('com.google.android.exoplayer:exoplayer-ui:2.19.1')
api("com.egame.vap:animplayer:2.0.8")
// api('com.tencent.liteav:LiteAVSDK_Professional:10.9.0.13102')
// api('com.google.android.exoplayer:exoplayer-core:2.19.1')
// api('com.google.android.exoplayer:exoplayer-ui:2.19.1')
// api("com.egame.vap:animplayer:2.0.8")
api project(":animplayer")
api("com.liulishuo.okdownload:okdownload:1.0.7")
api('com.zlc.glide:webpdecoder:1.6.4.9.0')
api('com.jungly:gridPasswordView:0.3')
// 使使使RoomTipsView
api('com.cpiz.bubbleview:bubbleview:1.0.2')
// SDK声网
@@ -222,16 +224,7 @@ dependencies {
api 'com.qcloud.cos:cos-android:5.9.+'
api project(':Loadinglibrary')
// room数据库
// def room_version = "2.5.0"
// implementation "androidx.room:room-runtime:$room_version"
// implementation "androidx.room:room-ktx:$room_version"
// annotationProcessor "androidx.room:room-compiler:$room_version"
//2. normal SDK
//aar的名称WbCloudNormal-v5.1.10-123456789.aar 'WbCloudNormal-v5.1.10-123456789.aar'
api project(':moduletablayout')
implementation "org.jetbrains.kotlin:kotlin-reflect:2.0.21"
}
//apply plugin: 'com.alibaba.arouter' //

View File

@@ -16,18 +16,7 @@
android:exported="true"
android:foregroundServiceType="specialUse" />
<activity
android:name=".activity.WebViewActivity"
android:exported="true">
<intent-filter>
<action android:name="com.qxcm.qxlive.PROTOCOL_WEBVIEW" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activity.news.OfficialNoticeActivity"
android:exported="false" />
<!-- <service android:name="org.eclipse.paho.android.service.MqttService"-->
<!-- android:exported="false"/> &lt;!&ndash; <receiver android:name="org.eclipse.paho.android.service.AlarmPingSender$AlarmReceiver" &ndash;&gt;-->

View File

@@ -0,0 +1,837 @@
<!-- saved from url=(0051)https://vespa.qxyushen.top//api/Page/page_show?id=4 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>.Po4BvhR1CK2tJaywJ6AN path {
fill: var(--icon-path-fill);
}
.Oz4yDjua3Qe6thqkZYf_ path {
transition: 0.2s all;
}
.Oz4yDjua3Qe6thqkZYf_:hover path {
fill: var(--icon-hover-fill);
}
</style>
<style>/* !!!切勿直接改动该文件,该文件由 generator.ts 自动生成!!! */
/* !!! DONT MODIFY THIS FILE DIRECTLY, THIS FILE IS GENERATED BY generator.ts AUTOMATICALLY !!! */
.ibW4Oa5B7s2zJKKZ4pCg {
user-select: none;
}
.AtqKyJetjrG4smuk35Np {
max-width: 346px;
width: auto;
height: 36px;
background-color: var(--quark-style-white-color, #fff);
padding-left: 10px;
padding-right: 4px;
display: flex;
align-items: center;
box-sizing: border-box;
border: 1px solid var(--quark-style-gray-20-color, rgba(6, 10, 38, 0.12));
box-shadow: 0 12px 32px -6px var(--quark-style-gray-30-fixed-color, rgba(6, 10, 38, 0.24));
border-radius: 10px;
}
.ibW4Oa5B7s2zJKKZ4pCg .g6iGsZa_KHMeW2yICzQQ {
height: 28px;
display: flex;
align-items: center;
margin-right: 6px;
}
.ibW4Oa5B7s2zJKKZ4pCg .e4UXx38MPgfHdym_Lzt0 {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
height: 28px;
padding: 0 6px;
margin-right: 2px;
border-radius: 6px;
column-gap: 4px;
}
.ibW4Oa5B7s2zJKKZ4pCg .e4UXx38MPgfHdym_Lzt0:hover:not(.ibW4Oa5B7s2zJKKZ4pCg .kNOcXLDT_cCrcoY8LTm8) {
background: var(--quark-style-gray-10-color, rgba(6, 10, 38, 0.06));
}
.ibW4Oa5B7s2zJKKZ4pCg .kNOcXLDT_cCrcoY8LTm8 {
cursor: default;
}
.ibW4Oa5B7s2zJKKZ4pCg .kNOcXLDT_cCrcoY8LTm8 .Va3czASiR9Zztyl_lD4M {
color: var(--quark-style-gray-40-color, rgba(6, 10, 38, 0.4)) !important;
}
.ibW4Oa5B7s2zJKKZ4pCg .e4UXx38MPgfHdym_Lzt0 .Va3czASiR9Zztyl_lD4M {
font-size: 12px;
color: var(--quark-style-gray-color, #060A26);
line-height: 16px;
white-space: nowrap;
position: relative;
}
.ibW4Oa5B7s2zJKKZ4pCg .llw0qsmiI_08u93bFdNg {
position: relative;
width: 28px;
height: 28px;
overflow: visible !important;
}
.ibW4Oa5B7s2zJKKZ4pCg .LEo8kpqIERehkv8AhAfG {
width: 28px;
height: 28px;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
border-radius: 6px;
overflow: visible !important;
}
.ibW4Oa5B7s2zJKKZ4pCg .LEo8kpqIERehkv8AhAfG:hover {
background: var(--quark-style-gray-10-color, rgba(6, 10, 38, 0.06));
}
.ibW4Oa5B7s2zJKKZ4pCg .zoNmooxAnbLEJSN8m1Jg {
box-sizing: border-box;
position: absolute;
display: flex;
flex-direction: column;
align-items: center;
width: 110px;
max-height: 136px;
height: auto;
top: 36px;
right: -5px;
padding: 4px 0;
background-color: var(--quark-style-white-color, #fff);
border: 1px solid var(--quark-style-gray-20-color, rgba(6, 10, 38, 0.12));
box-shadow: 0 4px 16px -6px var(--quark-style-gray-20-fixed-color, rgba(6, 10, 38, 0.12));
border-radius: 8px;
overflow: visible !important;
row-gap: 4px;
}
.ibW4Oa5B7s2zJKKZ4pCg .O1imPofna4elG_8NcQnR {
top: -77px;
}
.ibW4Oa5B7s2zJKKZ4pCg .mdH0IY7jS3Swn5vdX6tz {
width: 102px;
height: 28px;
display: flex;
align-items: center;
justify-content: flex-start;
cursor: pointer;
column-gap: 8px;
border-radius: 6px;
padding: 0 6px;
box-sizing: border-box;
}
.ibW4Oa5B7s2zJKKZ4pCg .mdH0IY7jS3Swn5vdX6tz:hover:not(.ibW4Oa5B7s2zJKKZ4pCg .dEdHLVmn_L2GAzb_cmwt) {
background: var(--quark-style-gray-10-color, rgba(6, 10, 38, 0.06));
}
.ibW4Oa5B7s2zJKKZ4pCg .dEdHLVmn_L2GAzb_cmwt {
cursor: default;
}
.ibW4Oa5B7s2zJKKZ4pCg .dEdHLVmn_L2GAzb_cmwt .zEraruudgjR2MToGu4Kw {
color: var(--quark-style-gray-40-color, rgba(6, 10, 38, 0.4)) !important;
}
.ibW4Oa5B7s2zJKKZ4pCg .XfCMwvO0DsqFCeyzPYP2 {
width: 16px;
height: 16px;
}
.ibW4Oa5B7s2zJKKZ4pCg .zEraruudgjR2MToGu4Kw {
font-size: 12px;
color: var(--quark-style-gray-color, #060A26);
}
.ibW4Oa5B7s2zJKKZ4pCg .KZeoAuXbMIkWzOT4PcH5 {
width: 100%;
height: 1px;
background: var(--quark-style-gray-10-color, rgba(6, 10, 38, 0.06));
}
.ZL32C_XdLL8UQRZ3zObd {
display: flex;
align-items: center;
}
.u5llx7cIQZLdrjP5Vag1 {
width: 28px;
height: 28px;
display: flex;
justify-content: center;
align-items: center;
border-radius: 16px;
cursor: pointer;
margin-right: 12px;
background: var(--quark-style-gray-60-color, rgba(6, 10, 38, 0.6));
}
.ZL32C_XdLL8UQRZ3zObd .LEo8kpqIERehkv8AhAfG {
border-radius: 16px !important;
background: var(--quark-style-gray-60-color, rgba(6, 10, 38, 0.6)) !important;
}
.ZL32C_XdLL8UQRZ3zObd .zoNmooxAnbLEJSN8m1Jg {
right: 0 !important;
}
.ZL32C_XdLL8UQRZ3zObd {
overflow: visible !important;
}
</style>
</head>
<body><p><strong>羽声语音直播隐私保护政策</strong></p>
<p><strong>本版本更新日期2025年【10】月【27】日</strong></p>
<p><strong>本版本生效日期2025年【10】月【27】日</strong></p>
<p><strong>引言:</strong></p>
<p style="text-align: left;"><strong>“羽声语音”APP 的运营主体系陕西启星汇申网络科技有限公司(以下简称“我们”&amp;
”羽声”)深知个人信息对您的重要性,并会尽力保护您的个人信息安全可靠,我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则,目的明确原则,选择同意原则,最少够用原则,确保安全原则,主体参与原则,公开透明原则等。同时我们承诺,我们将按业界成熟的安全解决方案,采取相应的安全保护措施来保护您的个人信息。鉴此,我们制定本《隐私政策》(下称“本政策
/ 本隐私政策”)并提醒您: 本政策适用于羽声语音语音软件及相关服务。
需要特别说明的是,本政策不适用于其他第三方向您提供的服务,也不适用于已另行独立设置隐私权政策的产品或服务。
在使用羽声语音语音软件或服务前,请您务必仔细阅读并透彻理解本政策,特别是以粗体/粗体下划线标识的条款,您应重点阅读,在确认充分理解并同意后使用相关产品或服务。若您拒绝本政策,仅能进入访客态进行浏览。为保障软件及服务的安全运行,呱友在相应功能点触发时会收集相关设备信息及权限。如对本政策内容有任何疑问、意见或建议,您可通过呱友提供的各种联系方式与我们联系。
我们非常重视用户个人信息的保护,并且将以勤勉和审慎的义务对待这些信息。您在下载、安装、开启、浏览、注册、登录、使用(以下统称“使用”)本公司软件及相关服务时,本公司将按照本《隐私政策》收集、保存、使用、共享、披露及保护您的个人信息鉴此,我们希望通过本《隐私政策》向您介绍我们对您个人信息的处理方式并提醒您:
在使用“羽声”各项产品或服务前,请您留意重点阅读。若您认为本协议中的加粗条款可能会导致您的部分或全部权利或权益受损,请您务必再次仔细阅读,在确保您已经理解、接受了加粗条款的前提下,继续使用本公司服务。如对本政策内容有任何疑问、意见或建议,您可通过提供的各种联系方式与我们联系。</strong>
</p>
<p><strong>本政策将帮助您了解如下内容:</strong></p>
<p><strong>一、定义及适用范围</strong></p>
<p><strong>二、我们如何收集和使用您的个人信息</strong></p>
<p><strong>三、我们如何使用Cookie和第三方H5页面</strong></p>
<p><strong>四、我们如何共享、转让、公开披露您的个人信息</strong></p>
<p><strong>五、我们如何存储和保护您的个人信息</strong></p>
<p><strong>六、您如何管理您的个人信息</strong></p>
<p><strong>七、未成年人保护</strong></p>
<p><strong>八、本政策的更新</strong></p>
<p><strong>九、联系我们</strong></p>
<p><strong>十、其他</strong></p>
<p><strong>【特别提示】请您在使用我们各项产品或服务前,仔细阅读并透彻理解本政策,特别是以粗体/下划线/粗体下划线等有特殊标识的条款,您应重点阅读,在确认充分理解并同意后使用相关产品或服务。如果您不同意我们收集您的任何个人信息,您应当立即停止使用并退出羽声语音直播。当您使用或继续使用我们的产品或服务时,即表示您同意我们按照本政策来处理您的相关信息。</strong>
</p>
<p>
<strong>如对本政策内容有任何疑问,您可以通过本政策中“联系我们”一节提供的联系方式与我们联系。</strong>
</p>
<p><strong>一、定义及适用范围</strong></p>
<p><strong>(一)定义</strong></p>
<p><strong>1、羽声语音软件及相关服务指由陕西启星汇申网络科技有限公司陕西省咸阳市高新技术产业开发区高科三路科技企业孵化园3栋4层
及其关联方通过合法拥有并运营的、标注名称为羽声语音、羽声语音极速版的客户端应用程序、APP、微信小程序、微信公众号、羽声语音官方网站 </strong><u>https://golden-llama-1g494r.mysxl.cn/</u>
<strong>、通过APK、SDK、API等方式向您提供的软件和/或服务及随技术发展出现的新形态向您提供的产品与服务。</strong>
</p>
<p><strong>2、关联方</strong><span style="color: rgb(51, 51, 51);">:指在现在、将来控制</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">陕西启星汇申网络科技有限公司</span><span
style="color: rgb(51, 51, 51);">、受</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">陕西启星汇申网络科技有限公司</span><span
style="color: rgb(51, 51, 51);">控制或与</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">陕西启星汇申网络科技有限公司</span><span
style="color: rgb(51, 51, 51);">处于共同控制下的公司、机构。</span></p>
<p><strong>3、未成年人</strong><span style="color: rgb(51, 51, 51);">:指不满十八周岁的自然人。十六周岁以上的未成年人,以自己的劳动收入为主要生活来源的,视为完全民事行为能力人。</span>
</p>
<p><strong>4、儿童</strong><span style="color: rgb(51, 51, 51);">:指不满十四周岁的未成年人。</span>
</p>
<p><strong>(二)适用范围</strong></p>
<p>
<strong>本政策适用于羽声语音的产品或服务。如我们关联公司的产品或服务中使用了羽声语音直播提供的产品或服务,则本政策同样适用于该部分产品或服务。但请您注意,本政策不适用于以下情况:</strong>
</p>
<p><span
style="color: rgb(51, 51, 51);">1、为我们的产品或服务提供广告服务的第三方的信息收集/处理做法;</span>
</p>
<p><span style="color: rgb(51, 51, 51);">2、我们的产品或服务可能会包含或链接至第三方提供的信息与/或第三方服务(包括任何第三方应用、网站、产品、服务等),这些信息与/或服务由第三方负责运营,具体规则请参照该第三方的隐私政策或类似声明;</span>
</p>
<p><span style="color: rgb(51, 51, 51);">3、其他非</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音</span><span
style="color: rgb(51, 51, 51);">向您提供的产品与/或服务内容。</span></p>
<p><strong>二、我们如何收集和使用您的个人信息</strong></p>
<p><span style="color: rgb(51, 51, 51);">我们收集和使用的您的个人信息类型包括两种:第一种:我们产品与/或服务的基本业务功能所必需的信息:此类信息为产品与/或服务正常运行的必备信息,您须授权我们收集。如您拒绝提供,您将无法正常使用我们的产品与/或服务;第二种:拓展业务功能可能需要收集的信息:此信息为非基本业务功能所需的信息,您可以选择是否授权我们收集。如您拒绝提供,将导致拓展业务功能无法实现或无法达到我们拟达到的效果,但不影响您对基本业务功能的正常使用。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">我们在此特别提醒您:我们致力于打造多样的产品和服务以满足您的需求。因我们向您提供的产品和服务种类众多,且不同用户选择使用的具体产品/服务范围存在差异,故基本/拓展功能及对应收集使用的个人信息类型、范围等会有所区别,请以具体的产品/服务功能为准。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">我们收集和使用您的个人信息的场景有:</span></p>
<p><strong>(一)注册成为我们的用户</strong></p>
<p><span style="color: rgb(51, 51, 51);">当您在</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">上创建</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">账号时,您需要提供您</span><strong>本人的实名手机号码、验证码</strong><span
style="color: rgb(51, 51, 51);">并完善相关的网络身份识别信息(包括</span><strong>头像、昵称、登录密码、性别、生日</strong><span
style="color: rgb(51, 51, 51);">)。</span><strong>您需理解手机号码、验证码匹配结果、性别、生日均属于您的敏感个人信息我们收集您的手机号码、验证码是基于法律法规的相关要求。其中1实名手机号码、验证码是为了验证您的身份满足相关法律规定的网络实名制要求2生日是为了协助判断您是否为年满十八周岁的成年人若您是未成年人我们将不对您提供服务请您谅解也提请您按真实情况填写相应信息切勿虚构、假冒3性别是为了向您提供性别匹配服务。上述敏感个人信息您有权拒绝提供但将无法使用相关功能或服务请您谨慎考虑后再选择是否提供。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">在您注册账号后,您可以根据自身需求选择</span><strong>填写学校、个性签名、家乡、兴趣爱好等个人主页信息,来帮助您更加形象的展示自我</strong><span
style="color: rgb(51, 51, 51);">。但如果您不提供这些信息,将不会影响本服务的基本业务功能。</span><strong>您在个人主页发布的上述信息、动态、添加的兴趣标签、游戏名片以及你的账号等级、ID号、获赞数、粉丝数将会在账号包括APP和微信小程序的个人主页中公开展</strong><span
style="color: rgb(51, 51, 51);">您也可以通过APP设置-隐私进行信息隐藏(不对未关注用户显示可见)或通过第六节所述管理您的个人信息。</span>
</p>
<p><strong>(二)进行实名认证</strong></p>
<p><span style="color: rgb(51, 51, 51);">1、为满足相关法律规定及监管要求、确保用户身份真实性、实现反欺诈等风控、保障系统与服务安全包括依法保护未成年人合法权益、用户权益发放、打击电信网络诈骗等需要当您使用</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">中某些特定类型的产品与/或服务,</span><strong>您需要向平台提供您本人的真实姓名及身份证号码信息(敏感个人信息),并可能需要通过您的人脸信息(敏感个人信息)进行身份一致性核验</strong><span
style="color: rgb(51, 51, 51);"></span></p>
<p><span style="color: rgb(51, 51, 51);">1在您进行实名认证时</span><strong>若您选择或产品页面进入火山引擎、腾讯云等第三方的实名认证程序(人脸识别功能),我们及/或第三方会申请、调用终端设备的摄像头权限来采集您的面部识别信息在您授权后前述第三方实名认证程序将通过SDK方式获取您的如下敏感个人信息姓名、身份证件号码、人脸信息指为验证或识别您的身份而采集的人脸图像、视频以及基于上述图像、视频提取的面部识别特征为了准确验证您的身份第三方需将上述信息与其合法存有的如基于法律法规或政府部门、有权机关授权或存储您的个人信息进行比对核验。为了验证实名认证结果的有效性并及时解决用户就实名认证结果的争议或投诉您通过以上方式实名认证的第三方会向我们返回人脸识别验证结果以及为验证或识别您的身份而采集的部分人脸图像、视频具体以第三方提供为准此为您的敏感个人信息除此外我们会存储您在上述实名认证过程中主动填写的姓名、身份证号码敏感个人信息</strong>
</p>
<p><strong>当您通过本平台主动选择进行真人头像认证时经您同意后我们会收集您上传的头像照片为了验证您上传的头像照片为您本人不存在冒用或盗用他人照片、头像的情形我们将请求您按上述方式通过第三方人脸识别程序完成实名认证经第三方反馈验证一致的您上传的头像照片将作为您在羽声语音直播APP内的头像进行公开具体规则请见《真人头像认证协议》。因此我们在此提醒您谨慎使用真人头像认证功能您有权拒绝且您拒绝不影响您继续使用本平台的基本业务功能。</strong>
</p>
<p>
<strong>具体使用的第三方人脸识别程序可通过第四节第(一)条所列《羽声语音直播与第三方共享个人信息清单》查阅。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">2若您无法通过上述程序完成实名认证您可以选择通过人工认证方式完成实名认证程序为了完成实名认证服务我们将依据相关法律法规获取并存储您的个人身份信息包括如下</span><strong>姓名(敏感个人信息)、身份证件类型(包括但不限于相应的身份证、护照、台湾居民来往大陆通行证、港澳居民往来内地通行证等)和相应的证件正反面图片(敏感个人信息)、您手持相应身份证件的照片(敏感个人信息)。</strong>
</p>
<p><strong>提请您特别注意,您的身份证件信息、您手持身份证件的照片、真人照片、人脸信息均属于敏感个人信息,您可以拒绝提供,如果拒绝提供您将可能无法获得需要实名认证的特定服务,但不影响您正常使用产品的基本业务功能(包括产品的浏览和观看功能);同时,我们将依法记录、保存验证身份信息及验证结果,这些信息仅供完成验证目的,或者其他法律法规所规定的用途,未经您明示授权不会用作其他目的。</strong>
</p>
<p><strong>2、具体实名场景及对应服务主要包括具体以您使用的功能为准</strong></p>
<p><span
style="color: rgb(51, 51, 51);">1当您申请注册为互联网发布者主播、开设个人房时</span><strong>需要提供您的真实姓名、身份证件信息(敏感个人信息)进行实名身份认证,并通过您的面部识别信息(敏感个人信息)进行身份一致性核验</strong><span
style="color: rgb(51, 51, 51);">。通过验证后,您方可在平台上从事直播发布活动。如果您拒绝提供上述信息(您有权拒绝),您将可能无法获得相关服务(开播或开设个人房间),但不影响您正常使用产品的浏览和观看功能。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">2当您通过</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">进行充值、消费时(</span><strong>特别是当您使用下单功能时</strong><span
style="color: rgb(51, 51, 51);">),为了保证您的资金安全,避免未成年人使用下单功能,我</span><strong>们可能需要您提供您的真实姓名、身份证件信息(敏感个人信息)进行实名身份认证,并可能需要您通过您的面部识别信息(敏感个人信息)进行身份一致性核验</strong><span
style="color: rgb(51, 51, 51);">。前述信息您可以拒绝提供,您拒绝提供前述信息的,只会使您无法使用</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">对应功能,但不影响您使用其他功能。</span></p>
<p><span style="color: rgb(51, 51, 51);">3当您使用提现功能</span><strong>们会需要您绑定银行卡账号信息、支付宝账号、身份证号码、姓名(敏感个人信息)进行实名认证。在您授权后,我们可能需要通过您的面部识别信息(敏感个人信息)进行身份一致性核验</strong><span
style="color: rgb(51, 51, 51);">。您可以拒绝提供前述信息,但您拒绝提供将导致您无法使用对应功能,但不影响您使用</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">的其他功能。</span></p>
<p><span
style="color: rgb(51, 51, 51);">4在账号冻结、封禁申诉时为了核实争议账号是您本人持有平台还将使用您注册时使用的</span><strong>实名手机号码、身份证件信息(敏感个人信息)进行身份核实认证</strong><span
style="color: rgb(51, 51, 51);"></span></p>
<p><span
style="color: rgb(51, 51, 51);">5基于依法保护未成年人权益的需求我们为未成年人提供了青少年模式若您拟解除、退出青少年模式我们会需要您提</span><strong>供真实姓名、身份证件信息(敏感个人信息),并在您授权后,我们可能需要通过您的面部识别信息进行身份一致性核验</strong><span
style="color: rgb(51, 51, 51);">。如果您拒绝提供前述信息,您将无法退出青少年模式,但不影响您在青少年模式下使用</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">产品和服务。</span></p>
<p><strong>(三)为您提供服务内容的浏览/播放/搜索/下载</strong></p>
<p><span style="color: rgb(51, 51, 51);">1、</span><strong>当您进行直播间、聊天室、视频、音频等服务内容的浏览、播放、下载功能时,为与您的移动设备进行必要的适配,向您提供连续性、一致化的使用体验以及最优化的页面展示,我们需要收集您的设备信息、个人上网记录。</strong>
</p>
<p><strong>设备信息包括浏览器类型、设备型号、操作系统版本、设备设置、DEVICEID、AndroidID、MAC地址、IMEI、IDFA、OAID、ICCID、UDID、UUID、MEID及其他设备标识符、设备环境。</strong>
</p>
<p><strong>个人上网记录包括:浏览/点击/播放记录、收藏/关注/预约记录、点赞/分享/发布记录等。</strong></p>
<p><span style="color: rgb(51, 51, 51);">我们收集这些信息是为了向您提供直播间、视频、音频等内容的浏览、播放和展示服务,如您拒绝提供上述权限将可能导致您无法使用我们的相关产品与服务。请您理解,单独的设备信息、日志信息是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将该类个人信息做匿名化、去标识化处理。</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">2、当您使用我们提供的搜索功能时我们还会收集您搜索的关</span><strong>键字信息、设备信息包括设备型号、操作系统版本、设备设置、AndroidID、MAC地址、IMEI、IDFA、OAID、ICCID等设备标识符、设备环境、日志信息包括您的浏览记录和时间、您搜索的时间以及次数</strong><span
style="color: rgb(51, 51, 51);">。我们收集这些信息是为了方便您后续查找时无需再次输入,并向您快速匹配您所需要的内容以及您可能感兴趣的内容,为了提供高效的搜索服务,部分前述信息会暂时存储在您的本地存储设备之中,并可向您展示搜索结果内容、搜索历史记录。您可以自主删除前述搜索记录。搜索的关键词信息通常无法单独识别您的个人身份,不属于您的个人信息,不在本政策的限制范围内。但当您的搜索关键词信息与您的其他信息有联结并可识别您的个人身份时,在结合使用期间,我们会将您的搜索关键词信息作为您的个人信息,与您的搜索历史记录一同按照本政策对其进行处理与保护。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">当您分享/接收被分享的信息时,我们会在您进入</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">时访问您的剪切板,写入或读取其中包含的文字、链接、口令、分享码,以实现分享、跳转功能。我们不会收集、存储剪切板的其他信息。</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">3、当您使用下载功能时经您同意后我们会访问您的</span><strong>存储权限</strong><span
style="color: rgb(51, 51, 51);">,以便在您设备外置存储空间内写入相关文件。如您拒绝提供,仅会使您无法使用该功能,但并不影响您正常使用产品或服务的其他功能。同时,您也可以随时通过您设备的相关功能设置开启/取消该权限。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">(五)</span><strong>帮助您上传或发布图文、音频和视频</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">1、若您通过</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">的社区功能或通过</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">的评论、分享、发帖、发布动态等功能上传/发布/编辑图文、音频、视频时,当您使用到具体功能时,我们将向您分别单独请求</span><strong>访问您设备的相机/摄像头权限、相册权限IOS端/存储权限(安卓端)、录音/麦克风权限1经您同意授权相机/摄像头权限后,我们会访问您的相应权限,以便您拍摄照片、视频,并采集、识别上述功能实现过程中所拍摄或录制的图片及视频信息</strong><span
style="color: rgb(51, 51, 51);"></span><strong>2经您同意授权相册权限IOS端/存储权限(安卓端)后,我们会访问您的相应权限,以便您查看、选择相册里的图片/视频发布动态、反馈意见,设置与更换头像、封面,聊天时分享图片/视频,以及保存图片/视频至相册您还可以在其他场景访问设备里的照片、音频和视频以及保存内容到设备3经您同意授权录音/麦克风权限后,我们会访问您的相应权限,以便识别您上传的语音信息,并采集、识别上述功能实现过程中所录制、输入的音频信息。如您拒绝提供上述权限的仅会使您无法使用该功能,但并不影响您正常使用产品/服务的其他功能,同时,您也可以随时通过您的设备系统或使用我们的产品/服务的相关功能设置页面开启/取消该权限。</strong>
</p>
<p><span
style="color: rgb(51, 51, 51);">2、如您自愿填写信息或自愿发布内容的我们会收集您上传的</span><strong>视频、照片、音视频、帖子、评论、点赞、关注、分享信息、浏览及搜索信</strong><span
style="color: rgb(51, 51, 51);">息。您可随时删除您发布的照片、音视频、帖子及评论内容。为了验证您发布内容的合法合规性,避免您发布的内容涉及违法或侵犯第三方合法权益的情形。您</span><strong>同意我们为了上述目的将您发布的图文、音频、视频内容提供给我们的服务提供商,并由我们的服务提供商对上述内容进行审核、标注后向我们反馈结果。</strong><span
style="color: rgb(51, 51, 51);">我们不会向上述服务商传输或共享您的个人信息,我们仅会对您发布内容的合法合规性进行审核。</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">3、当您使用设备相机扫描二维码时我们将访问您设备的</span><strong>相机/摄像头权限</strong><span
style="color: rgb(51, 51, 51);">。如您拒绝提供的仅会使您无法使用该功能,但并不影响您正常使用产品与/或服务的其他功能。同时,您也可以随时通过您的设备的设置开启/取消该权限。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">4、您在使用动态发布等功能时发布的公开信息可能涉及您或他人的个人信息或个人隐私信息如您在分享、评论时选择上传的包括个人信息的图片或视频。</span><strong>您应更为谨慎考虑是否公开该等信息,以及获得合法权利人授权后再行发布,同时如该等信息中涉及未成年人个人信息的,您应在发布前征得其监护人同意。</strong>
</p>
<p><strong>(六)录制音视频及提供直播功能</strong></p>
<p><span
style="color: rgb(51, 51, 51);">当您使用录制音视频、使用个人房间服务以及直播服务时,经您分别授权我们将</span><strong>访问您设备的相机/摄像头权限(当您同意开启此项权限后,我们会使用您设备上的相机拍摄功能。此项功能将用于实现照片拍摄、录制视频功能,并采集、识别上述功能实现过程中所拍摄或录制的图片及视频信息)、录音(麦克风)相关权限(当您同意开启此项权限后,我们会使用您设备上的麦克风功能,并会识别您上传的语音信息。此项权限将用于实现语音输入功能,并采集、识别上述功能实现过程中所输入的语音信息)</strong><span
style="color: rgb(51, 51, 51);">,如您拒绝授权的仅会使您无法使用该功能,但并不影响您正常使用产品与/或服务的其他功能。同时,您也可以随时通过您的设备设置开启/取消该权限。此外,</span><strong>为保证您使用直播或聊天室功能时的流畅度、节省您的流量,我们会收集您使用该功能时段内使用流量的大小。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">(七)消费与提现</span></p>
<p><span style="color: rgb(51, 51, 51);">当您通过</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音</span><span
style="color: rgb(51, 51, 51);">购买商品和/或服务时如SVIP会员购买、购买虚拟商品、个性装扮、礼物为帮助您完成交易、保障交易安全、提供订单查询、客服及售后服务</span><strong>我们需要根据商品的类型收集如下部分或全部的订单信息:下单时间、订单编号、订单状态、交易的商品信息、支付信息(支付金额、支付方式、支付流水号、支付状态、第三方支付渠道的支付账号,敏感个人信息)、虚拟商品消费使用记录、会员开通时间</strong><span
style="color: rgb(51, 51, 51);">。为此为保障您的账户和资金安全以及支付服务的安全稳定运行、履行反电信网络诈骗等法定义务我们还会收集您必要的设备信息IP地址并提供给您选择的第三方支付渠道。为向您提供售后与争议解决服务之目的我们需要及时获悉并确认交付、售后的进度及状态您同意我们可自相应第三方处收集与交付、售后进度相关的信息。我们向您承诺我们会以最大努力保障您的个人信息安全并严格要求第三方对您的个人信息保密只以交付、售后之目的获悉和使用不得对外泄露或做其他任何用途。您可以拒绝提供前述信息但您拒绝提供将导致您无法使用对应功能但不影响您使用</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">的基本业务功能。</span></p>
<p><span style="color: rgb(51, 51, 51);">当您使用提现功能时,</span><strong>为了完成支付结算,我们会收集、使用您主动填写的收款账户信息(银行卡账号信息及开户行信息、支付宝账号及/或微信账号,具体以您填写为准)以及身份证号码、姓名,并会共享给第三方支付结算机构(请见第四节第(一)项)。前述信息为敏感个人信息,您可以拒绝提供,您拒绝提供将导致您无法使用对应提现功能,但不影响您使用羽声语音直播的其他功能。</strong>
</p>
<p><strong>(八)客户服务</strong></p>
<p><strong>当您主动填写羽声语音APP上的反馈意见如帮助与反馈-意见反馈页面)、举报投诉页面时,我们会收集您主动填写的手机号、反馈/举报投诉内容(请谨慎考虑后再决定是否填写),我们收集信息仅用于收集您的意见,便于与您联系、尽快帮助您解决问题。</strong>
</p>
<p><span
style="color: rgb(51, 51, 51);">当您向我们发起投诉、申诉或进行咨询时,为了保障您的账户及系统安全,</span><strong>我们需要您提供必要的个人信息(包括账号信息、姓名、手机号、身份证以及其他必要身份信息)以核验您的用户身份</strong><span
style="color: rgb(51, 51, 51);">。为</span><strong>便于与您联系、尽快帮助您解决问题或记录相关问题的处理方案及结果,我们可能会收集您与我们的沟通信息(包括文字/图片/音视频/通话记录形式)、您为了证明相关事实提供的信息、与客服需求相关联的其他必要信息。如您针对具体的订单发起客服需求的,我们还会使用您的订单信息。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">以上信息为您的</span><strong>个人敏感信息</strong><span
style="color: rgb(51, 51, 51);">,您有权拒绝提供,但我们收集这些信息是为了调查事实与帮助您解决问题,如您拒绝提供上述信息,我们可能无法向您及时反馈投诉、申诉或咨询结果。</span>
</p>
<p><strong>(九)为您提供安全保障服务</strong></p>
<p><span style="color: rgb(51, 51, 51);">为了使</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">产品及服务与您的移动设备进行必要的适配,提高您使用我们及我们合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免受侵害,更好的预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络入侵等安全风险,分析当前设备的风险等级,有效识别各种作弊行为、风险设备、恶意刷量、恶意程序、保护您的账号安全,我们会收集为实现安全保障功能的必要信息,我们会获取您的以下信息:</span>
</p>
<p><strong>1、网络访问日志信息和用户日志信息。包括网络信息如网络类型、运营商信息如SIM卡信息、账号信息如账号登录地以及使用“羽声语音直播”产品或服务的频率、崩溃数据、总体安装、使用情况、性能数据、服务故障等信息。</strong>
</p>
<p><strong>2、您的设备信息。包括设备型号、操作系统、设备序列号/SN、设备标识符如IMEI/IMSI/Android
ID/IDFA/OpenUDID/GUID/ICCID/
UUID/MEID/DEVICEID、设备MAC地址、应用列表、登陆IP地址、软件版本号、接入网络的方式、类型和状态、设备当前运行进程/运行中进程信息、设备传感器信息、蓝牙信息屏幕尺寸等参数信息同时为了保证您的账号安全我们会检测您设备的root状态</strong><span
style="color: rgb(51, 51, 51);">。请您注意为了便于您及时接收、发送聊天消息、接收消息通知我们会在后台状态下获取您设备的MAC地址。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">我们可能会使用或整合您的上述日志信息与设备信息、账户信息、交易信息、支付信息以及其他取得您授权或依据法律共享的信息,综合判断您账户及交易风险、完成身份验证、检测,防范安全事件,并依法采取必要的记录、审计、分析、处置措施,保护各方合法权益稳定不受侵害。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">您理解并同意为了帮助我们进行bug分析、反作弊、反黑产等安全保护工作保障您正常使用本产品与/或服务、保障您的账号安全,</span><strong>在您的羽声语音App每次切换至后台或处于静默状态下或重新启动时我们会收集您的Mac地址信息包括手机Mac地址和蓝牙Mac地址、IMEI、获取运行中进程信息、设备序列号、Android
ID、DEVICEID我们将把读取频次控制在合理范围内。</strong></p>
<p><strong>请您理解,单独的设备信息、日志信息等是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将该类个人信息做匿名化、去标识化处理。</strong>
</p>
<p><strong>同时为了维护网络安全、保障良好生态便于公众为公共利益实施监督依据《互联网用户账号信息管理规定》等法律规定您的IP地址所对应的归属地域信息将会展示在您的个人资料页。境内展示到省区、市境外展示到国家或地区信息以网络运营商数据为准请您理解该信息不会泄露您的详细地址相关展示暂不支持手动开启或关闭。</strong>
</p>
<p><strong>(十)我们获取的设备权限</strong></p>
<p><span style="color: rgb(51, 51, 51);">为确保相关业务功能的正常实现,我们需要根据具体的使用场景调用对应的必要权限。请您注意,您开启任一权限即代表您授权我们可以收集和使用相关个人信息来为您提供对应服务,若您关闭任一权限或取消授权,我们将不再基于对应权限继续收集和使用相关个人信息,也无法为您提供该权限所对应的服务。但是,您关闭权限的决定不会影响此前基于您的授权所进行的信息收集及使用。</span>
</p>
<p><strong>(十一)收集和使用个人信息的其他规则</strong></p>
<p><span
style="color: rgb(51, 51, 51);">1、若您提供的信息中含有其他用户的个人信息在向我们提供这些个人信息之前您需确保您已经取得合法的授权。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">2、您理解并知悉您向外部第三方</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">关联公司不在此限)</span><strong>提供的个人信息或外部第三方收集的您的个人信息我们无法获取更不会使用非常规方式恶意干预对方系列APP数据擅自以软件程序获得您的个人信息。羽声语音直播可能因业务发展的需要而确实需要从第三方间接收集如共享等您的个人信息的且由我们直接或共同为您提供产品或服务的我们会在收集前明确以书面形式要求该第三方说明其个人信息来源以及是否已经就其收集、处理以及向我们提供您的个人信息取得了您的合法授权如果使用方式和范围超出您在第三方原授权范围的我们会再次征得您的授权同意。我们的某些产品或服务由第三方业务合作伙伴提供或共同提供时为了必要且合理的开展业务我们可能会从部分业务合作伙伴处间接收集的您的部分信息、其他方使用我们的产品/服务时所提供有关您的信息。如果第三方的授权范围无法涵盖我们的处理和使用目的时,我们会自行或者要求该第三方征得您的同意后再行处理您的个人信息。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">3、如果某一需要收集您的个人信息的产品/服务未能在本隐私政策中予以说明的,或者我们超出了与收集您的个人信息时所声称的目的及具有直接或合理关联范围的,我</span><strong>们将在收集和使用您的个人信息前,通过更新本隐私政策、页面提示、弹窗、站内信、网站公告或其他便于您获知的方式另行向您说明,并为您提供自主选择同意的方式,且在征得您明示同意后收集和使用。</strong>
</p>
<p><strong>4、征得授权同意的例外</strong></p>
<p><strong>您理解并同意,在以下情况下,我们无需取得您的授权同意即可收集和使用您的个人信息:</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">1与国家安全、国防安全有关的</span></p>
<p><span style="color: rgb(51, 51, 51);">2与公共安全、公共卫生、重大公共利益有关的</span></p>
<p><span style="color: rgb(51, 51, 51);">3与犯罪侦查、起诉、审判和判决执行等有关的</span></p>
<p><span
style="color: rgb(51, 51, 51);">4出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的</span>
</p>
<p><span style="color: rgb(51, 51, 51);">5所收集的个人信息是您自行向社会公众公开的</span></p>
<p><span style="color: rgb(51, 51, 51);">6从合法公开披露的信息中收集个人信息的如合法的新闻报道、政府信息公开等渠道并依照《个人信息保护法》规定在合理的范围内处理您自行公开或者其他已经合法公开的个人信息</span>
</p>
<p><span style="color: rgb(51, 51, 51);">7根据您的要求签订合同所必需的</span></p>
<p><span
style="color: rgb(51, 51, 51);">8用于维护所提供的产品或服务的安全稳定运行所必需的例如发现、处置产品或服务的故障</span>
</p>
<p><span style="color: rgb(51, 51, 51);">9为合法的新闻报道所必需的</span></p>
<p><span style="color: rgb(51, 51, 51);">10学术研究机构基于公共利益开展统计或学术研究所必要且对外提供学术研究或描述的结果时对结果中所包含的个人信息进行去标识化处理的</span>
</p>
<p><span style="color: rgb(51, 51, 51);">11法律法规规定的其他情形。</span></p>
<p><span style="color: rgb(51, 51, 51);">我们需要特别提醒您的是:</span><strong>由于我们的产品和服务较多,为您提供的内容也不同,因此收集的您的个人信息也会因产品/服务的内容不同而有所区别,具体以产品/服务实际提供为准。我们可能会不时推出新的或优化后的功能,或者依据最新法律法规要求,可能需要收集、使用您的新的个人信息或变更个人信息使用目的或方式。届时,我们将通过更新本政策、弹窗、页面提示等方式另行向您说明并为您提供自主选择同意的方式,且在征得您同意后再收集、使用。</strong>
</p>
<p><strong>三、我们如何使用Cookie和第三方H5页面</strong></p>
<p><span style="color: rgb(51, 51, 51);">为使您获得更轻松的访问体验,您使用</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">产品或服务时,我们可能会通过采用各种技术收集和存储您访问</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">服务的相关数据,在您访问或再次访问</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">服务时,我们能识别您的身份,并通过分析数据为您提供更好更多的服务。包括使用小型数据文件识别您的身份,这么做是为了解您的使用习惯,帮您省去重复输入账户信息的步骤,或者帮助判断您的账户安全。这</span><strong>些数据文件可能是Cookie、Flash
Cookie或您的浏览器或关联应用程序提供的其他本地存储统称“Cookie”</strong></p>
<p><span style="color: rgb(51, 51, 51);">网页上常会包含一些电子图像称为“单像素GIF文件”或“网络beacon”它可以帮助网站计算浏览网页的用户或访问某些cookie。我们会通过网络beacon收集您浏览网页活动信息例如您访问的页面地址、您先前访问的援引页面的位址、您停留在页面的时间、您的浏览环境以及显示设定等。</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">如果您的浏览器或浏览器附加服务允许您可以修改对Cookie的接受程度或者拒绝</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">的Cookie在浏览器具备该功能的前提下可以通过您的浏览器的设置以管理、部分或全部拒绝Cookie与/或同类技术或删除已经储存在您的计算机、移动设备或其他装置内的Cookie与/或同类技术,从而实现我们无法全部或部分追踪您的个人信息。您如需详细了解如何更改浏览器设置,请具体查看您使用的浏览器的相关设置页面),但拒绝</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">的Cookie可能无法使用由我们提供的、依赖于Cookie的功能或服务如有</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">第三方H5页面。为了提升服务便捷性、方便用户快速触达第三方服务我们可能会接入</span><strong>第三方的H5服务页面入口如果您进入这些H5页面该第三方可能会收集你的手机号、身份证件号、付款账号信息请注意您在以上第三方H5页面进行的各项操作请遵守该等第三方的隐私保护政策。当您离开我们平台跳转至第三方H5页面时我们提醒您注意保护个人隐私。本平台不收集、不存储您在该类第三方服务页面填写和提交的任何个人信息。</strong>
</p>
<p><strong>四、我们如何共享、转让、公开披露您的个人信息</strong></p>
<p><strong>(一)共享</strong></p>
<p>
<strong>我们不会与陕西启星汇申网络科技有限公司及关联方以外的任何公司、组织和个人分享您的个人信息,但以下情况除外:</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">1、获得您及监护人明确同意或授权的共享</span></p>
<p><span style="color: rgb(51, 51, 51);">2、基于法定情形提供。根据法律法规的规定、诉讼争议解决需要、您与我们签署的相关协议(包括在线签署的电子协议及平台规则)或法律文件,或行政、司法等有权机关依法提出要求时,我们可能会共享您的个人信息;</span>
</p>
<p><span style="color: rgb(51, 51, 51);">3、提供统一管理服务。为</span><strong>便于您统一管理账号,体验更优质的服务,我们可能会向我们的关联公司共享您的个人信息。但我们只会共享必要的个人信息,如果我们共享您的个人敏感信息或者关联方改变个人信息的使用目的,将再次征求您的授权同意;</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">4、提供必要的合作服务并保证服务安全、优化。</span><strong>我们提供的产品/服务大多是无法单独完成的故我们的某些服务将由业务合作伙伴提供。为保障为您提供的服务顺利完成我们可能会将您的个人信息共享给我们的合作伙伴包括基础技术服务、支付服务、营销活动等的合作商、第三方商家、广告商等同时为了向您提供更完善、优质、安全的产品和服务我们的应用中会嵌入授权合作伙伴的软件工具开发包本政策中简称“SDK”或其他类似的应用程序我们的某些服务将由授权合作伙伴提供或使用第三方SDK相关技术为您提供服务。基于此我们会与合作伙伴共享您的某些个人信息或者第三方SDK会通过SDK方式收集您的个人信息</strong><span
style="color: rgb(51, 51, 51);">,具体包括:</span></p>
<p><span style="color: rgb(51, 51, 51);">1</span><strong>第三方账号登录、内容分享</strong><span
style="color: rgb(51, 51, 51);">。QQ、微信、新浪微博会通过SDK方式收集您的</span><strong>位置信息、网络信息包括Wi-Fi信息、设备标识信息(MAC地址、IMEI、IMSI)、运营商信息、外部存储设备信息,用于实现第三方账号授权登录、共享发布的内容及评论等信息。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">2</span><strong>安全监测与风险防范</strong><span
style="color: rgb(51, 51, 51);">。为了保障您的账号安全避免您遭受欺诈、网络病毒、网络攻击等风险为我们提供安全保障的合作伙伴会通过SDK方式收集与您有关的必要</span><strong>设备信息、日志信息,以及您的使用习惯和常用软件信息等来综合判断您的账号及交易风险,预防安全事件的发生。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">3</span><strong>支付与结算功能。</strong><span
style="color: rgb(51, 51, 51);">支付功能由与我们合作的第三方支付机构向您提供服务基于此支付宝、微信、银联会通过SDK方式收集您的</span><strong>手机号、设备信息识别码(包括IMSI)、位置信息、网络信息包括Wi-Fi信息、当前运行进程/获取运行中进程信息、屏幕参数、运营商信息</strong><span
style="color: rgb(51, 51, 51);">,保证充值、消费、支付功能的正常使用,这些信息是支付功能所必需的信息,拒绝提供将导致您无法使用该功能。</span><strong>当您提现收入(如有)时,为了您能及时完成收入的结算与提现、依据法律规定完成税费缴纳,将由与您另行单独确认的第三方服务方向您提供结算、税费扣缴服务,基于此,我们会向该类第三方服务方共享您提现时主动提供的收款账户信息以及身份信息,具体信息详见第二节第(七)款。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">4人脸识别。阿里云、腾讯云、字节跳动会通过SDK方式收集您的证件信息、设备标识信息、网络信息包括Wi-Fi信息、设备传感器信息、屏幕参数、应用列表该等第三方获取的面部特征信息用于人脸核验我们只获得核验结果不保存您的面部特征信息。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">5直播视频服务。声网、会</span><strong>通过SDK收集您的共享Wi-Fi信息、设备标识信息、地理位置信息、运营商信息、外部存储设备、当前运行进程/获取运行中进程信息、屏幕参数,并共享用户授予的读取/写入外置存储、位置权限、获取设备信息、相机/摄像头权限、读取手机/电话状态用于聊天室内和IM音视频通话图片上传、直播推流和直播回放功能等相关功能。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">目前,我们接入的第三方服务商主要包括以下几种类型:</span></p>
<p><span style="color: rgb(51, 51, 51);">用于消息推送功能包括手机厂商Push推送、特定事件提醒</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">用于支付相关服务,包括订单支付、交易行为核验、收入结算、支付信息汇总统计;</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">用于在您同意的情况下获取设备位置权限、搜集设备信息和日志信息;</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">用于第三方授权服务,包括第三方账号登陆、将有关内容分享至第三方产品;</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">用于优化产品性能,包括提高硬件配网能力、降低服务器成本、功能热修复;</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">用于账号安全、产品加固相关服务,包括网络监测、域名解析、防劫持、防黑产、反作弊、加解密服务。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">我们接入的部分第三方SDK可能会收集您的个人信息如您在我们的服务中使用这类由第三方提供的服务时您同意将由其直接收集和处理您的信息。我们会评估这类第三方服务收集个人信息的合法性、正当性、必要性要求该等第三方对您的个人信息采取保护措施并严格遵守相关法律法规与监管要求。您可以查看下方《语音接入第三方SDK目录》了解我们主要接入的第三方SDK基本情况。</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">羽声语音直播接入第三方 SDK 目录(与全国平台登记信息完全一致)</span>
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">1、</span><span
style="color: rgb(51, 51, 51);">SDK 名称APP 支付客户端 SDK<br>开发者信息:支付宝(杭州)信息技术有限公司<br>服务类型:唤起支付宝 App 完成支付<br>所涉信息:设备 MAC 地址、网络访问、WiFi 状态、读取电话状态、写入外部存储<br>隐私政策链接:</span>https://opendocs.alipay.com/open/54/01g6qm
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">2、</span><span
style="color: rgb(51, 51, 51);">SDK 名称QQ 互联 SDKQQ 开放平台)<br>开发者信息:深圳市腾讯计算机系统有限公司<br>服务类型QQ 分享、授权登录<br>所涉信息设备标识信息IMEI/AndroidID/ICCID、定位信息、地理位置、ANDROID_ID<br>隐私政策链接:</span>https://connect.qq.com/index.html
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">3、</span><span
style="color: rgb(51, 51, 51);">SDK 名称:微信 OpenSDK Android<br>开发者信息:深圳市腾讯计算机系统有限公司<br>服务类型:微信分享、微信登录、微信支付、微信客服<br>所涉信息设备标识信息IMEI/AndroidID/ICCID、定位信息、地理位置、ANDROID_ID<br>隐私政策链接:</span>https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">4、</span><span
style="color: rgb(51, 51, 51);">SDK 名称:声网音视频 SDK含音频 RTC<br>开发者信息:上海声网科技有限公司<br>服务类型:提供实时音频服务<br>所涉信息:设备 MAC 地址、IP 地址、网络访问、WiFi 状态、设备信息、文件存储权限、麦克风权限<br>隐私政策链接:</span>https://www.shengwang.cn/SDK-privacy-policy/
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">5、</span><span
style="color: rgb(51, 51, 51);">SDK 名称:腾讯云即时通信 IM SDK<br>开发者信息:腾讯云计算(北京)有限责任公司<br>服务类型:即时通信(私聊、群聊、房间内公屏聊天)<br>所涉信息:设备 MAC 地址、IP 地址、网络状态、文件存储权限、麦克风权限、相机权限<br>隐私政策链接:</span>https://cloud.tencent.com/document/product/269/58094
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">6、</span><span
style="color: rgb(51, 51, 51);">SDK 名称ShareSDK含友盟统计 / 友盟推送)<br>开发者信息广州掌淘网络科技有限公司ShareSDK<br>服务类型:社会化分享、统计分析、消息推送<br>所涉信息设备标识符IMEI/Mac/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI 信息、社交账号公开信息、地理位置、IP 地址、应用列表<br>隐私政策链接:</span>https://www.umeng.com/page/policy
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">7、</span><span
style="color: rgb(51, 51, 51);">SDK 名称Bugly Android<br>开发者信息:深圳市腾讯计算机系统有限公司<br>服务类型:定位崩溃、异常上报与运营统计<br>所涉信息日志信息自定义日志、Logcat 日志、崩溃堆栈)、设备 IDandroidid / idfv、联网信息、系统名称、系统版本、国家码<br>隐私政策链接:</span>https://privacy.qq.com/document/preview/fc748b3d96224fdb825ea79e132c1a56
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">8、</span><span
style="color: rgb(51, 51, 51);">SDK 名称:腾讯云慧眼人脸核身增强版 SDK<br>开发者信息:腾讯云计算(北京)有限责任公司<br>服务类型:实名认证<br>所涉信息个人身份信息真实姓名、身份证号、面部识别特征、读取短信、联系人、通话记录、位置信息、设备标识信息IMEI、IMSI、AndroidID<br>隐私政策链接:</span>https://cloud.tencent.com/document/product/1007/66043
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">9、</span><span
style="color: rgb(51, 51, 51);">SDK 名称:音视频通话 TRTC SDKAndroid<br>开发者信息:深圳市腾讯计算机系统有限公司<br>服务类型:即时语音通话(私聊、群聊、房间内公屏聊天)<br>所涉信息:设备 MAC 地址、IP 地址、网络状态、文件存储权限、麦克风权限、相机权限<br>隐私政策链接:</span>https://cloud.tencent.com/document/product/647/57574
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">10、</span><span
style="color: rgb(51, 51, 51);">SDK 名称:号码认证-android阿里云一键登录<br>开发者信息:阿里巴巴云计算(北京)有限公司<br>服务类型:手机号一键登录<br>所涉信息网络类型、设备信息IP 地址、设备制造商、设备型号、手机操作系统、SIM 卡状态)、运营商类型、本机号码<br>隐私政策链接:</span>https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202112211045_86198.html
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">11、</span><span
style="color: rgb(51, 51, 51);">SDK 名称:对象存储 OSS Android SDK阿里云<br>开发者信息:阿里云计算有限公司<br>服务类型:平台图片、视频、礼物等文件存储<br>所涉信息:设备型号、设备操作系统信息(用于兼容性适配与故障排查)<br>隐私政策链接:</span>https://terms.alicdn.com/legal-agreement/terms/privacy_policy_full/20240202100310511/20240202100310511.html
</p>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><span style="color: rgb(51, 51, 51); font-family: 宋体;">12、</span><span
style="color: rgb(51, 51, 51);">SDK 名称:腾讯云 COS 文件存储器 SDK<br>开发者信息:腾讯云计算(北京)有限责任公司<br>服务类型:平台图片、视频、礼物等文件存储<br>所涉信息设备型号、设备操作系统、IP 地址、网络连接类型(用于兼容性与传输优化)<br>隐私政策链接:</span>https://cloud.tencent.com/document/product/454/61839
</p>
<p><br></p>
<p>13、<span
style="color: rgba(0, 0, 0, 0.9); background-color: rgb(255, 255, 255); font-size: 16px;">SDK 名称:联通认证 SDK<br>开发者信息:联通在线信息科技有限公司<br>服务类型:手机号一键登录 / 本机号码校验<br>所涉信息网络类型、网络地址IP 地址)、运营商类型、本机手机号、手机设备类型、手机操作系统、硬件厂商<br>隐私政策链接:</span><a
href="https://msv6.wosms.cn/html/oauth/protocol2.html" target="_blank"
style="text-align: start;">https://msv6.wosms.cn/html/oauth/protocol2.html</a><br></p>
<h3 style="text-align: start;">手机 GPS 定位说明(无第三方 SDK</h3>
<p>功能场景</p>
<ol>
<li style="text-align: start;">
业务功能:判断主播/观众实时地理位置,用于「附近频道」「同城房间」「地区排行榜」「内容合规(区域管制)」等。
</li>
<li style="text-align: start;">
触发时机:仅当用户首次进入需定位的页面时弹窗申请,拒绝不影响基础功能。
</li>
<li style="text-align: start;">所涉信息<br>精确位置GPS 经纬度)、粗略位置(网络定位辅助)、手机方向传感器(用于地图罗盘旋转)。
</li>
<li style="text-align: start;">使用方式</li>
</ol>
<ul>
<li style="text-align: start;">仅 App 前端调用
Android「LocationManager」/iOS「CLLocationManager」系统接口未集成任何第三方定位 SDK。
</li>
<li style="text-align: start;">
定位结果仅在客户端内存临时使用,退出相关页面立即释放,不做后台持续采集、不上传服务器、不存储本地、不与任何第三方共享。
</li>
<li style="text-align: start;">权限管理<br>用户可随时在系统设置-应用权限-位置信息中关闭授权,关闭后涉及位置的功能将提示「需要位置权限」并引导重新开启。
</li>
<li style="text-align: start;">未成年人<br>如用户未满 14 周岁,我们将在征得监护人同意后才会申请位置权限,否则默认关闭定位相关功能。
</li>
</ul>
<p><span style="color: rgb(51, 51, 51);"> </span></p>
<p><strong>自启动和关联启动说明:</strong></p>
<p><strong>为确保本应用处于关闭或后台运行状态下可正常接收到客户端推送的广播信息,本应用须使用(自启动)能力,将存在一定频率通过系统发送广播唤醒本应用自启动或关联启动行为,是因实现功能及服务所必要的。</strong>
</p>
<p><strong>请您知悉1我们仅会出于合法、正当、必要、明确的目的共享您的个人信息并且授权合作伙伴只能接触到其履行职责所需信息。同时我们会与合作伙伴签署严格的保密协定要求他们按照我们的说明、本政策以及其他任何相关的保密和安全措施来处理您的个人信息2前述第三方合作伙伴为数据控制者以其自己的名义获得您的同意以处理您的个人信息。合作方可能有其独立的隐私政策我们建议您认真阅读并遵守第三方的隐私政策。如果您拒绝我们的合作方在提供服务时收集为提供服务所必需的个人信息将可能导致您无法使用相应服务。</strong>
</p>
<p><strong>(二)转让</strong></p>
<p><span
style="color: rgb(51, 51, 51);">我们不会将您的个人隐私信息转让给任何公司组织和个人,但以下情况除外:</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">1、在获取明确同意的情况下共享获得您的明确同意后我们将与其分享您的个人隐私信息</span>
</p>
<p><span style="color: rgb(51, 51, 51);">2、在涉及合并、收购、资产转让、破产清算时你的个人信息有可能因此而被转移如涉及个人隐私信息转让我们将要求受让方继续受此政策约束并告知您受让方身份、联系方式否则我们将要求受让方向您重新索取授权同意。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">(三)公开披露</span></p>
<p><span
style="color: rgb(51, 51, 51);">1、公开披露是指向社会或不特定人群发布信息的行为。我们仅在下列情形下公开披露您的个人隐私信息</span>
</p>
<p><span style="color: rgb(51, 51, 51);">1征得您明确的授权同意</span></p>
<p><span style="color: rgb(51, 51, 51);">2基于国家法律法规的规定而对外披露</span></p>
<p><span
style="color: rgb(51, 51, 51);">3应国家司法机关及其他有关机关基于法定程序的要求而披露</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">4为公共利益实施新闻报道、舆论监督等行为在合理的范围内公开的</span>
</p>
<p><span style="color: rgb(51, 51, 51);">5为应对突发公共卫生事件或在紧急情况下为保护其他用户及第三方生命健康和财产安全而必须披露的在该情况下我们将在紧急情况消除后及时告知您</span>
</p>
<p><span style="color: rgb(51, 51, 51);">6应用户监护人合法要求而提供用户个人身份信息时</span></p>
<p><span
style="color: rgb(51, 51, 51);">7对违规账号、欺诈行为等进行处罚公告、公布中奖/获胜者等名单时脱敏展示相关信息等必要事宜而进行的必要披露。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">2、对于公开披露的您的个人信息我们会在收到公开披露申请后第一时间且审慎审查其正当性、合理性、合法性并在公开披露时和公开披露后采取最严格个人信息安全保护措施和手段对其进行保护。</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">(四)共享、转让、公开披露个人信息时事先征得授权同意的例外</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">下述情形中,共享、转让、公开披露您的个人信息无需事先征得您的授权同意:</span>
</p>
<p><span style="color: rgb(51, 51, 51);">1、与国家安全、国防安全直接相关的</span></p>
<p><span style="color: rgb(51, 51, 51);">2、与公共安全、公共卫生、重大公共利益直接相关的</span></p>
<p><span
style="color: rgb(51, 51, 51);">3、与犯罪侦查、起诉、审判和判决执行等直接相关的或根据法律法规的要求、行政机关或公检法等有权机关的要求的</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">5、个人信息是您自行向社会公开的或者是从合法公开的渠道如合法的新闻报道、政府信息公开等渠道中收集到的</span>
</p>
<p><span style="color: rgb(51, 51, 51);">6、根据与您签订和履行相关协议或其他书面文件所必需的</span>
</p>
<p><span style="color: rgb(51, 51, 51);">7、法律法规等规定的其他情形。</span></p>
<p><span style="color: rgb(51, 51, 51);">请知悉,根据适用的法律,若我们对个人信息采取技术措施和其他必要措施进行处理,使得数据接收方无法重新识别特定个人且不能复原,则此类处理后数据的共享、转让、公开披露无需另行向您通知并征得您的同意。</span>
</p>
<p><strong>五、我们如何存储和保护您的个人信息</strong></p>
<p><strong>(一)个人信息的存储</strong></p>
<p><strong>1、存储地点</strong><span style="color: rgb(51, 51, 51);">:我们会按照法律法规规定,将境内收集的用户个人信息存储于中华人民共和国境内。目前我们不会跨境传输或存储您的个人信息或向境外提供个人信息的场景。将来如需跨境传输或存储的,我们会单独向您明确告知信息出境的目的、接收方、使用方式和范围、安全保证措施等情况并征得您的同意。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">2、</span><strong>存储期限:除非依据法律法规或双方约定,我们只会在为实现服务目的所必需的最短时间内留存您的个人信息,此外,我们或对您的相关信息保存至相关法律所规定的必要期限(例如,根据《电子商务法》规定:商品和服务信息、交易信息保存时间自交易完成之日起不少于三年;根据《网络安全法》规定:采取监测、记录网络运行状态、网络安全事件的技术措施,并按照规定留存相关的网络日志不少于六个月;根据《互联网用户公众账号信息服务管理规定》:互联网用户公众账号信息服务提供者应当记录互联网用户公众账号信息服务使用者发布内容和日志信息,并按规定留存不少于六个月)。</strong>
</p>
<p><strong>我们在判断前述期限的标准主要包括并以其中较长者为准:</strong></p>
<p><strong>A. 完成与您相关的服务目的、维护相应服务及业务记录、应对您可能的查询或投诉;</strong></p>
<p><strong>B. 保证我们为您提供服务的安全和质量;</strong></p>
<p><strong>C. 您是否同意更长的留存期限;</strong></p>
<p><strong>D. 是否存在保留期限的其他特别约定。</strong></p>
<p>
<strong>在超出保存期限后,我们会根据适用法律的要求删除或者匿名化处理您的个人信息,但法律有特殊要求的除外。</strong>
</p>
<p>
<strong>当我们的产品或服务发生停止运营的情况时,我们将以推送通知、公告等形式通知您,并在合理期限内删除您的个人信息或进行匿名化处理,法律法规另有规定的除外。</strong>
</p>
<p><strong>(二)个人信息的保护措施</strong></p>
<p><span style="color: rgb(51, 51, 51);">数据传输方面采用传输层安全协议等密码技术通过Https等方式防止传输链路被嗅探、窃听截取风险建立安全的隐私数据采集环境保证数据采集的私密性和完整性。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">数据存储方面我们会通过安全的方式存储您的信息包括本地存储例如利用APP进行数据缓存。我们只会在为实现服务目的所必需的时间内或法律法规规定的条件下存储您的个人信息。您可以自主选择删除观看历史、视频缓存、搜索记录等您在使用</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音</span><span
style="color: rgb(51, 51, 51);">APP服务时提供和产生的数据记录。</span></p>
<p><span style="color: rgb(51, 51, 51);">信息安全方面,我们努力为您的信息安全提供保障,以防止信息的泄露、丢失、不当使用、未经授权访问和披露等。我们使用多方位的安全保护措施,以确保您的个人信息保护处于合理的安全水平,包括技术保护手段、管理制度控制、安全体系保障等诸多方面。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">数据访问和使用的安全控制方面,实施严格的数据权限控制机制,采取多重身份认证技术,并对能够处理您的信息的行为进行监控,避免数据被违规访问和未授权使用。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">建立完整的审计机制,对数据生命周期的全流程进行监控与审计,防止您的个人信息遭遇未经授权的访问、公开披露、使用、修改、人为或意外的损坏或丢失。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">其他可行的安全组织和管理措施:</span></p>
<p><span style="color: rgb(51, 51, 51);">1、在我们从第三方间接收集您的个人信息前我们会明确以书面形式如合作协议、承诺书要求该第三方在已经取得您明示同意后收集以及处理如共享等个人信息在书面协议层面要求第三方对个人信息来源的合法性和合规性作出承诺如第三方有违反行为的我们会明确要求对方承担相应法律责任</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">2、在我们向业务合作伙伴共享您的个人信息前我们会严格要求合作伙伴的信息保护义务与责任并要求业务合作伙伴在合作前需与</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">签署关于数据安全的保护协议,一旦业务合作伙伴有任何违反协议的行为,将须承担相应法律责任;</span>
</p>
<p><span style="color: rgb(51, 51, 51);">3、我们建立了合理有效、科学健全的安全应急响应体系明确了网络安全事件的分类分级标准、安全应急响应组织及职责并根据安全事件的不同类型和级别制定了适当的应急响应预案明确规范了安全事件的报告流程和应急响应处置流程。同时我们还具备“</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">”安全应急响应中心,由专业的安全技术和运营团队负责维护,便于及时有效的响应、处置各类安全漏洞和突发事件,联合相关部门进行安全事件溯源和打击;</span>
</p>
<p><span style="color: rgb(51, 51, 51);">4、如不幸发生个人信息安全事件的我们将按照法律法规的要求及时向您告知安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您难以逐一告知个人信息主体时我们会采取合理、有效的方式发布公告。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">5、请您知悉并理解互联网并非绝对安全的环境我们强烈建议通过安全方式、使用复杂密码协助我们保证您的账号安全。如发现自己的个人信息泄密尤其是您自己的账户或密码发生泄露请立即根据本政策文末中提供的联系方式联络我们以便我们采取相应措施来保护您的个人信息安全。</span>
</p>
<p><strong>六、您如何管理您的个人信息</strong></p>
<p><span style="color: rgb(51, 51, 51);">您对您的个人信息享有以下权利:</span></p>
<p><strong>(一)访问权</strong></p>
<p><strong>1、账号信息</strong><span style="color: rgb(51, 51, 51);">:您可以通过相关产品页面随时登陆您的个人账号,随时查询或访问您的账号中个人资料信息,包括:头像、昵称、星座、城市等。例如:“头像/昵称”信息在</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">APP中的访问路径为我的—头像栏</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">微信小程序的访问路径为:我的-&gt;点击个人头像-&gt;点击头像右下角编辑icon可进入资料编辑页面。</span>
</p>
<p><strong>2、使用信息</strong><span style="color: rgb(51, 51, 51);">:您可以通过相关产品页面随时查阅您的使用信息,包括:订单记录、浏览记录、动态记录等。例如:“浏览记录”信息在</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">APP和微信小程序中的访问路径为我的—足迹</span></p>
<p><span style="color: rgb(51, 51, 51);">3、财产信息您可以通过</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">APP 我的-钱包,以及</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">微信公众号-钱包查阅;</span></p>
<p><span style="color: rgb(51, 51, 51);">4、</span><strong>其他信息:您也可以在【我的】-【帮助与反馈】-【个人信息收集清单】中集中查询您的网络身份标识和鉴权信息、身份信息、用户基本资料、个人财产信息、用户使用过程信息、设备信息、内容制作与发布。如您在访问过程中遇到操作问题或如需获取其他前述方法无法获知的个人信息内容,您可通过本政策第九节提供的方式联系我们,我们将在核实您的身份后在合理期限内向您提供,但法律法规另有规定或本政策另有约定的除外。</strong>
</p>
<p><em>我们会按照如下规则进行个性化推荐或定向推送,并为您提供相应的退出机制:</em></p>
<p><em>我们会根据您的喜欢为您提供个性化的推广内容,</em></p>
<p><em>例如在主页推荐房间、派对 -
推荐;您可以通过“我的-设置-个性化推荐”-关闭。关闭后,您看到的相关内容以房间活跃值默认展示。</em></p>
<p><strong>(二)复制权</strong></p>
<p><strong>若您需要复制我们收集的关于你本人的基本资料、身份信息的,您可通过本政策第九节提供的方式联系我们,我们将在核实您的身份后在合理期限内向您提供,或在技术可行的前提下根据您的请求将您的个人信息转移至指定的个人信息处理者,但法律法规另有规定或本政策另有约定的除外。</strong>
</p>
<p><strong>(三)更正/修改权</strong></p>
<p>
<strong>若您发现您提供给我们的个人信息存在登记错误、不完整或有更新的,您可在我们产品和/或服务中更正/修改您的相关个人信息。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">1、对于您的部分个人信息您可以按照相关功能页面的指引和设置在线进行更正/修改。例如“头像/昵称”信息更正/修改路径为:我的—头像栏—编辑资料;</span>
</p>
<p><span style="color: rgb(51, 51, 51);">2、对于您在行使上述权利过程中遇到的困难或者其他可能目前无法向您提供在线自行更正/修改服务的,经过对您身份的验证,且更正/修改不影响信息的客观性和准确性的情况下,您</span><strong>有权对错误或不完整的信息作出更正或修改,或在特定情况下,尤其是数据错误时,通过我们公布的反馈与报错等措施将您的更正/修改申请提交给我们,或联系我们(联系方式:详见下文第九节),要求我们更正或修改您的数据,但法律法规另有规定的除外。但出于安全性和身份识别的考虑,您可能无法修改注册时提交的某些初始注册信息。</strong>
</p>
<p><strong>(四)删除权</strong></p>
<p><span
style="color: rgb(51, 51, 51);">1、对于您提供的部分个人信息您可以自行通过我们提供的相关产品和服务的功能页面主动删除您提供信息。例如</span><strong>头像/昵称”信息在羽声语音APP中的删除路径为【我的-个人主页-资料】。您也可以自主删除您发布的视频、动态、图片等。一旦您删除后,我们即会对此类信息进行删除或匿名化处理,法律法规另有规定的除外</strong><span
style="color: rgb(51, 51, 51);"></span></p>
<p><span
style="color: rgb(51, 51, 51);">2、在以下情形中</span><strong>您可以通过本政策第九节提供的联系方式</strong><span
style="color: rgb(51, 51, 51);">向我们提出删除个人信息的请求,但已做匿名化处理或法律法规另有规定的除外:</span>
</p>
<p><span style="color: rgb(51, 51, 51);">1如果我们处理个人信息的行为违反法律法规</span></p>
<p><span
style="color: rgb(51, 51, 51);">2如果我们收集、使用您的个人信息却未征得您的明确同意</span>
</p>
<p><span style="color: rgb(51, 51, 51);">3如果我们处理个人信息的行为严重违反了该政策</span></p>
<p><span style="color: rgb(51, 51, 51);">4如果您主动注销了账号</span></p>
<p><span style="color: rgb(51, 51, 51);">5当我们终止服务及运营时。</span></p>
<p><strong>(五)撤回同意权</strong></p>
<p><span style="color: rgb(51, 51, 51);">1、我们提供的产品或服务的部分功能需要获得您使用设备的相关权限包括位置、相机、麦克风等详见本隐私政策第二节第十二条“我们获取的设备权限”具体以产品实际获取的功能为准</span><strong>您可以在授权后随时撤回(或停止)对该权限的继续授权</strong><span
style="color: rgb(51, 51, 51);">,包括通过您设备中的设置页面或</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音</span><span
style="color: rgb(51, 51, 51);">APP的相关路径“我的-设置-隐私-隐私权限设置”)撤回相关授权。示例路径如下:</span>
</p>
<p>
<strong>1位置的权限您可通过【我的-设置-隐私-隐私权限设置-允许羽声语音直播访问位置信息】撤回同意;</strong>
</p>
<p>
<strong>2相机的权限您可通过【我的-设置-隐私-隐私权限设置-允许羽声语音直播访问相机】撤回同意;</strong>
</p>
<p>
<strong>3麦克风的权限您可通过【我的-设置-隐私-隐私权限设置-允许羽声语音直播访问相机】撤回同意;</strong>
</p>
<p><strong>4日历的权限您可通过【我的-系统设置-系统权限管理】撤回同意。</strong></p>
<p><span style="color: rgb(51, 51, 51);">2、</span><strong>就我们通过短信的方式向您发送的商业性服务信息如果您不想收到此类信息您可以通过联系我们联系方式详见下文第九节或者通过编辑“T”或“TD”并回复短信进行退订提请注意我们不会就您申请退订额外收取任何费用但可能会发生一定的通信或者网络费用具体以通信运营商与您约定为准退订成功后我们将不再向您发送此类型的短信。就我们通过您设备的系统通知向你推送的内容如果您不想收到此类信息你可选择在设备中关闭羽声语音直播的通知功能</strong><span
style="color: rgb(51, 51, 51);"></span></p>
<p><span style="color: rgb(51, 51, 51);">3、对于合作方使用或我们转让、公开披露您的个人信息您可以通过我们的相关功能页面或联系我们、合作方撤回您的授权但法律法规另有规定或本隐私政策另有约定的除外。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">4、您可以通过卸载</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音</span><span
style="color: rgb(51, 51, 51);">App的方式撤回我们通过当前设备对您的个人信息的收集能力。</span>
</p>
<p><strong>5、当您收回同意后我们将不再处理相应的个人信息。但您收回同意的决定不会影响此前基于您的授权而开展的个人信息处理。当您更新APP版本后未经您的明确同意我们不会更改您之前设置的权限状态。</strong>
</p>
<p>
<strong>6、对于您无法直接通过上述路径改变授权同意或撤回同意的您均可通过本政策第九节提供的方式联系我们进行处理但法律法规另有规定或本政策另有约定的除外。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">(六)注销权</span></p>
<p><span
style="color: rgb(51, 51, 51);">我们向您提供账户注销的途径。在您符合国家相关法律法规规定及约定注销条件的情况下,可以通过本隐私政策预留的联系方式(</span><strong>详见下文第九节</strong><span
style="color: rgb(51, 51, 51);">)或在线申请注销您的账户。</span></p>
<p><strong>提请注意:当您注销账号后,您将无法再以该账号登录和使用我们的产品与服务;且该账号在羽声语音及旗下的其他产品与服务使用期间已产生的但未消耗完毕的权益及未来的预期利益等全部权益将被清除;该账号下的内容、信息、数据、记录等将会被删除或匿名化处理(但法律法规另有规定或监管部门另有要求的除外,如依据《中华人民共和国网络安全法》规定,您的网络操作日志将至少保留六个月的时间);羽声语音账号注销完成后,将无法恢复。更多关于羽声语音账号注销的流程、条件等事项请详见《帐号注销须知》。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">如您在谨慎考虑后仍执意决定注销您的</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">账号的,您可以在您使用的我们的产品/服务的相关功能设置页面或根据操作指引向我们提交注销申请,</span><strong>羽声语音APP的在线申请注销路径为【我的】-【设置】-【账号与安全】-【安全中心】-【注销账号】羽声语音直播微信小程序可以选择通过上述羽声语音APP注销路径、联系客服或者通过本隐私政策第九节预留的联系方式申请注销。</strong>
</p>
<p>
<strong>在您主动注销账户之后,我们将停止为您提供产品或服务,根据适用法律的要求删除您的个人信息,或使其匿名化处理。</strong>
</p>
<p><strong>(七)约束信息系统自动决策</strong></p>
<p><span style="color: rgb(51, 51, 51);">在某些业务功能中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。如果这些决定显著影响您的合法权益,您有权通过本政策第九节提供的联系方式要求我们做出解释并拒绝我们仅通过自动化决策的方式作出决定,我们也将在不侵害</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音直播</span><span
style="color: rgb(51, 51, 51);">商业秘密或其他用户权益、社会公共利益、国家利益的前提下做出合理解释、处理。</span>
</p>
<p><span style="color: rgb(51, 51, 51);"></span><strong>八)我们对去世用户的个人信息保护</strong>
</p>
<p><strong>1.
羽声语音直播将根据《个人信息保护法》的相关规定保护死者个人信息。羽声语音用户(仅限自然人)去世后,其近亲属为了自身的合法、正当利益,可以通过本隐私政策第九节“联系我们”中公示的联系方式,对去世用户的相关个人信息行使查阅、复制、更正、删除等权利,但是去世用户生前另有安排的除外。</strong>
</p>
<p><strong>2.
您理解并确认,为了充分保护去世用户的个人信息权益,申请行使本条权利的去世用户近亲属需要根据羽声语音直播的指定流程或客服提示,提交去世用户的身份证明文件、死亡证明文件、申请人的身份证明文件、申请人与去世用户的亲属关系证明文件,并提供申请行使的权利种类、目的。更多关于去世用户的个人信息保护流程、条件等事项请联系在线客服。</strong>
</p>
<p><strong>(九)响应您的上述请求</strong></p>
<p>
<strong>如果您在行使上述权利、处置您的个人信息时有任何疑问,您均可以通过本隐私政策第九节中公示的联系方式与我们沟通解决。</strong>
</p>
<p>
<strong>为保障安全当您提出前述请求时您需要提供上述要求材料或以其他方式证明您的身份再处理您的请求若您拒绝提供相应证明材料我们将无法响应您的请求。我们将在15日内做出答复</strong><span
style="color: rgb(51, 51, 51);">。在以下情形中,按照法律法规要求,我们将无法响应您的请求:</span>
</p>
<p><span style="color: rgb(51, 51, 51);">1、与国家安全、国防安全、国家利益有关的</span></p>
<p><span style="color: rgb(51, 51, 51);">2、与公共安全、公共卫生、重大公共利益有关的</span></p>
<p><span style="color: rgb(51, 51, 51);">3、与犯罪刑事侦查、起诉、立案、审判和执行判决等有关的</span>
</p>
<p><span style="color: rgb(51, 51, 51);">4、有充分证据表明个人信息主体存在主观恶意串通妨碍第三人行使合法权益或滥用权利使其他个人、组织的合法权益受到严重损害的</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">5、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的</span>
</p>
<p><span style="color: rgb(51, 51, 51);">6、涉及商业秘密的。</span></p>
<p><strong>七、未成年人保护</strong></p>
<p><span style="color: rgb(51, 51, 51);">我们的产品、网站和服务主要面向成年人。</span><strong>您知悉,羽声语音直播将依赖用户提供的个人信息判断用户是否为未成年人</strong><span
style="color: rgb(51, 51, 51);">。若您是未成年人,建议您及您的监护人仔细阅读本政策,并在征得您的监护人同意的前提下使用我们的产品或服务或向我们提供信息。对于经父母或监护人同意使用我们的产品或服务而收集未成年人个人信息的情况,我们只会在法律法规允许、父母或监护人明确同意或者保护未成年人所必要的情况下使用、共享、转让或披露此信息。</span>
</p>
<p><strong>特别地若您是14周岁以下的儿童将适用《羽声语音儿童个人信息保护规则》建议您及您的监护人仔细阅读《羽声语音儿童个人信息保护规则》并在征得您的监护同意的前提下使用我们的产品或服务。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">若您是未成年人的监护人,一旦发现未成年人虚报年龄注册账号的,可通过本政策第九节所述方式向我们提出中止/终止该未成年人的账号或者要求向该未成年人提供青少年保护服务模式下的产品与/或服务。为了验证请求方为未成年人的监护人,特别是当您作为监护人提出资金类申请时,我</span><strong>们可能需要您向我们提供被监护人以及监护人的身份证(正面及反面)复印件/扫描件一份、可证明法定监护关系的有效法律文件(如出生证明、户口本)以及监护人手机号码、收款账号信息(如需),以保障用户的账号与资金安全。我们在收到您的上述文件后,会及时审核其真实性和有效性,并请确保监护人的手机畅通,以便我们的专业客服联系您进一步核实身份(如需)。同时,我们将依法记录、保存验证身份信息及验证结果</strong><span
style="color: rgb(51, 51, 51);">,这些信息仅供完成验证、争议解决服务之目的,或者其他法律法规所规定的用途,我们向您承诺,我们会以最大努力保障您的个人信息安全,未经您明示授权不会用作其他目的。以上信息包含您及您所监护的未成年人的个人敏感信息,您有权拒绝提供,但我们收集这些信息是为了调查事实与帮助您解决问题,如您拒绝提供上述信息,我们可能无法向您及时反馈投诉、申诉或咨询结果。</span>
</p>
<p><span style="color: rgb(51, 51, 51);">若您是未成年人的监护人,当您对您所监护的未成年人的个人信息保护有任何相关疑问时,请通过第九节“联系我们”中公示的联系方式与我们联系。</span>
</p>
<p><strong>八、本政策的更新</strong></p>
<p>
<strong>为保证您能够获得更好的服务并应平台业务调整以及未来发展,本政策也会与时俱进随之更新。但在更新的同时,我们会以单独、明显的方式获取您的授权。</strong>
</p>
<p>
<strong>我们在应用程序、官方网站更新版本后或官方发出公告后以合理、适当、明显的方式提醒您相关内容的更新,以便您能更快了解您权利的更迭。</strong>
</p>
<p>
<strong>对于重大变更,我们还会提供更为显著的通知方式(我们会通过包括但不限于邮件、短信、公告、首页或在浏览页面做特别提示等方式,来向您表达政策的更新内容)。</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">本政策所指的重大变更包括但不限于:</span></p>
<p><span
style="color: rgb(51, 51, 51);">(一)我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">(二)我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;</span>
</p>
<p><span style="color: rgb(51, 51, 51);">(三)个人信息共享、转让或公开披露的主要对象发生变化;</span>
</p>
<p><span
style="color: rgb(51, 51, 51);">(四)您参与个人信息处理方面的权利及其行使方式发生重大变化。</span>
</p>
<p><strong>九、联系我们</strong></p>
<p>
<strong>如您对本政策或您个人信息的相关事宜有投诉、举报、意见或建议的可以通过如下方式与我们陕西启星汇申网络科技有限公司联系我们将在15天内予以您答复</strong>
</p>
<p><span style="color: rgb(51, 51, 51);">1、</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">羽声语音</span><span
style="color: rgb(51, 51, 51);">站内客服:【我的】-【在线客服】-输入“人工客服”进行咨询;</span>
</p>
<p><span style="color: rgb(51, 51, 51);">2、人工客服电话</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">17531991222</span></p>
<p><span style="color: rgb(51, 51, 51);">3、个人信息保护负责人电话</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">17531991222</span></p>
<p style="text-align: left;"><span
style="color: rgb(51, 51, 51);">4、我们还设立了个人信息保护专职部门您可以写信至</span><span
style="font-family: 宋体;">陕西省咸阳市高新技术产业开发区高科三路科技企业孵化园3栋4层</span><span
style="color: rgb(51, 51, 51);">法务合规部(收);邮编</span><span
style="color: rgb(51, 51, 51); font-family: 宋体;">710000</span></p>
<p><strong>十、其他</strong></p>
<p><strong>本政策的解释、执行及争议解决均适用中华人民共和国法律(不包括冲突法)。因本政策产生争议的,双方应首先友好协商,协商不成的,您同意通过被告所在地有管辖权的法院提起诉讼来寻求解决方案。</strong>
</p>
<p><strong>陕西启星汇申网络科技有限公司 </strong></p>
<p><strong>陕西省咸阳市高新技术产业开发区高科三路科技企业孵化园3栋4层</strong></p>
<p><span
style="color: rgb(26, 26, 26); background-color: rgb(255, 255, 255);">陕ICP备2024054760号-7A</span>
</p>
<p></p>
<p></p>
<p style="text-align: left;"><span style="font-family: 宋体;"> </span></p></body>
</html>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,8 @@
package com.xscm.moduleutil;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
public class BaseEvent {
}

View File

@@ -0,0 +1,373 @@
package com.xscm.moduleutil.activity;
import android.annotation.SuppressLint;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import com.alibaba.android.arouter.launcher.ARouter;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.BarUtils;
import com.blankj.utilcode.util.LogUtils;
import com.hjq.toast.ToastUtils;
import com.xscm.moduleutil.R;
import com.xscm.moduleutil.base.CommonAppContext;
import com.xscm.moduleutil.dialog.LoadingDialog;
import com.xscm.moduleutil.utils.BackgroundManager;
import com.xscm.moduleutil.utils.ColorManager;
import com.xscm.moduleutil.utils.DisplayUtil;
import com.xscm.moduleutil.widget.QXGiftDriftView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.lang.reflect.Method;
public abstract class BaseAppCompatActivity<VDB extends ViewDataBinding> extends AppCompatActivity
implements BackgroundManager.BackgroundUpdateListener, ColorManager.ColorChangeListener {
@Override
protected void attachBaseContext(Context newBase) {
// 设置字体缩放比例为1.0f,即不跟随系统字体大小变化
super.attachBaseContext(DisplayUtil.attachBaseContext(newBase, 1.0f));
}
protected VDB mBinding;
@Subscribe (threadMode = ThreadMode.MAIN)
public void onEvent(Object event) {
}
private LoadingDialog mLoadingDialog;
// 添加广播接收器成员变量
private BroadcastReceiver mLogoutReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if ("com.xscm.moduleutil.ACTION_USER_LOGOUT".equals(intent.getAction())) {
// 在这里处理用户登出后的UI更新
// 例如:隐藏需要登录才能显示的控件
// 或者跳转到登录状态的页面
handleUserLogout();
}
}
};
// 处理用户登出的方法
protected void handleUserLogout() {
// 子类可以重写此方法处理具体的登出逻辑
// 例如更新UI状态、清除本地数据等
ActivityUtils.finishAllActivities();
}
QXGiftDriftView qxGiftDriftView;
protected void doDone(){}
@SuppressLint("UnspecifiedRegisterReceiverFlag")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
initFestivalTheme(CommonAppContext.getInstance().is_open);
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// getWindow().getDecorView().setBackgroundResource(R.attr.app_bg_img);
setContentView(getLayoutId());
doDone();
// 隐藏标题栏
if (getSupportActionBar() != null) {
getSupportActionBar().hide();
}
mBinding = DataBindingUtil.setContentView(this, getLayoutId());
mBinding.setLifecycleOwner(this);
ARouter.getInstance().inject(this);
BarUtils.setStatusBarLightMode(this, isLightMode());
BarUtils.transparentStatusBar(this);
initView();
initData();
initCompleted();
// 注册背景更新监听器
BackgroundManager.getInstance().addListener(this);
// 尝试加载网络背景
// loadNetworkBackground();
// 注册颜色变化监听器
ColorManager.getInstance().addColorChangeListener(this);
// 注册登出广播接收器
IntentFilter filter = new IntentFilter("com.xscm.moduleutil.ACTION_USER_LOGOUT");
registerReceiver(mLogoutReceiver, filter);
EventBus.getDefault().register(this);
}
// 节日判断+主题切换核心方法
private void initFestivalTheme(int currentFestival) {
switch (currentFestival) {
case 0:
setTheme(R.style.AppTheme_CustomAttrs);
break;
case 1:
setTheme(R.style.AppTheme_Spring_CustomAttrs);
break;
case 2:
setTheme(R.style.AppTheme_newYear_CustomAttrs);
break;
default:
// 默认皮肤
setTheme(R.style.AppTheme_CustomAttrs);
break;
}
}
// 在Activity中
private static final int REQUEST_OVERLAY_PERMISSION = 1001;
private void checkAndRequestOverlayPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
new AlertDialog.Builder(this)
.setTitle("需要悬浮窗权限")
.setMessage("应用需要悬浮窗权限才能显示飘屏效果")
.setPositiveButton("去设置", (dialog, which) -> {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, REQUEST_OVERLAY_PERMISSION);
})
.setNegativeButton("取消", null)
.show();
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_OVERLAY_PERMISSION) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Settings.canDrawOverlays(this)) {
ToastUtils.show("已获得悬浮窗权限");
} else {
ToastUtils.show("未获得悬浮窗权限");
}
}
}
}
@Override
public void onColorChanged() {
// 在主线程中更新UI
runOnUiThread(this::updateUIColors);
}
// 子类可以重写此方法来更新UI颜色
protected void updateUIColors() {
// 默认实现,子类可以覆盖
}
//在类中添加以下成员变量
private Handler timerHandler = new Handler();
private Runnable timerRunnable = new Runnable() {
@Override
public void run() {
// 调用你要执行的方法
// executePeriodicTask();
// 每10秒执行一次
timerHandler.postDelayed(this, 10000);
}
};
// 启动定时器的方法
private void startTimer() {
timerHandler.postDelayed(timerRunnable, 10000);
}
protected void loadNetworkBackground() {
// 只有当已经有背景URL时才加载
// int backgroundUrl = BackgroundManager.getInstance().getBackgroundUrl();
// getWindow().getDecorView().setBackgroundResource(backgroundUrl);
}
@Override
public void onBackgroundUpdated(Drawable drawable) {
// 当背景更新时更新当前Activity的背景
if (drawable != null) {
getWindow().getDecorView().setBackground(drawable);
}
}
// 提供一个方法供子类调用用于设置背景URL
protected void setNetworkBackgroundUrl(String url) {
// BackgroundManager.getInstance().setBackgroundUrl(url);
}
@Override
public Resources getResources() {//禁止app字体大小跟随系统字体大小调节
Resources resources = super.getResources();
if (resources != null && resources.getConfiguration().fontScale != 1.0f) {
android.content.res.Configuration configuration = resources.getConfiguration();
configuration.fontScale = 1.0f;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return resources;
}
static float fontScale = 1f;
// @Override
// public Resources getResources() {
// Resources resources = super.getResources();
// return DisplayUtil.getResources(this,resources,fontScale);
// }
public void setFontScale(float fontScale) {
this.fontScale = fontScale;
DisplayUtil.recreate(this);
}
public boolean isLightMode() {
return true;
}
protected abstract void initData();
protected abstract void initView();
protected void initCompleted() {
}
protected abstract int getLayoutId();
@Override
public void finish() {
super.finish();
LogUtils.e(this.getComponentName()+"========finish");
}
@Override
protected void onDestroy() {
EventBus.getDefault().unregister(this);
// 移除背景更新监听器
BackgroundManager.getInstance().removeListener(this);
// 移除颜色变化监听器
ColorManager.getInstance().removeColorChangeListener(this);
if (mBinding != null) {
mBinding.unbind();
}
try {
unregisterReceiver(mLogoutReceiver);
} catch (Exception e) {
// 忽略异常
}
try {
unregisterReceiver(mLogoutReceiver);
} catch (Exception e) {
// 忽略异常
}
super.onDestroy();
}
public void showLoading(String content) {
if (mLoadingDialog == null) {
mLoadingDialog = new LoadingDialog(this,content);
}
if (!mLoadingDialog.isShowing()) {
mLoadingDialog.show();
}
}
public void showLoading() {
if (mLoadingDialog == null) {
mLoadingDialog = new LoadingDialog(this);
}
if (!mLoadingDialog.isShowing()) {
mLoadingDialog.show();
}
}
public void disLoading() {
if (mLoadingDialog != null && mLoadingDialog.isShowing()) {
mLoadingDialog.dismiss();
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View view = getCurrentFocus();
if (isShouldHideInput(view, ev)) {
InputMethodManager Object = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (Object != null) {
Object.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}
}
try {
return super.dispatchTouchEvent(ev);
} catch (Exception e) {
return false;
}
}
//判断是否隐藏键盘
public boolean isShouldHideInput(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] leftTop = {0, 0};
//获取输入框当前的location位置
v.getLocationInWindow(leftTop);
int left = leftTop[0];
int top = leftTop[1];
int bottom = top + v.getHeight();
int right = left + v.getWidth();
if (event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom) {
// 点击的是输入框区域保留点击EditText的事件
return false;
} else {
return true;
}
}
return false;
}
@Override
protected void onResume() {
super.onResume();
LogUtils.e(this.getComponentName()+"========onResume");
}
@Override
protected void onPause() {
super.onPause();
LogUtils.e(this.getComponentName()+"=========onPause");
}
@Override
protected void onStop() {
super.onStop();
LogUtils.e(this.getComponentName()+"=========onStop");
}
}

View File

@@ -74,8 +74,7 @@ public class AppUpdateDialog extends BaseDialog<DialogAppUpdateBinding> implemen
mProgressDialog.setCanceledOnTouchOutside(false);
mProgressDialog.setMessage("下载中请稍等!!!");
mProgressDialog.show();
DownloadUtil downloadUtil = new DownloadUtil(getContext());
downloadUtil.downloadFile(appUpdateModel.getUrl(), this);
DownloadUtil downloadUtil = new DownloadUtil(getContext(),appUpdateModel.getUrl(),this);
}
}
@@ -118,6 +117,7 @@ public class AppUpdateDialog extends BaseDialog<DialogAppUpdateBinding> implemen
mProgressDialog.dismiss();
}
try {
LogUtils.e("installAppSuccess",localPath);
AppUtils.installApp(localPath);
} catch (Exception e) {
Logger.e("installAppError", e);

View File

@@ -4,6 +4,8 @@ import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static com.blankj.utilcode.util.ActivityUtils.startActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
@@ -29,6 +31,7 @@ import com.xscm.moduleutil.utils.MeHeadView;
import com.xscm.moduleutil.utils.NumberFormatUtils;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.widget.MyGridView;
import com.xscm.moduleutil.widget.ShineTextView;
import com.xscm.moduleutil.widget.img.FullScreenUtil;
import java.util.List;
@@ -43,14 +46,15 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
super(R.layout.item_cirle_list);
this.mPageType = pageType;
}
public interface OnItemClickListener {
void onDianzanClick(CircleListBean item);
void onDianzanClick(int index, CircleListBean item);
void onHeadImageClick(CircleListBean item);
void onZsClick(CircleListBean item);
void onZsClick(int idx, CircleListBean item);
void onDiandianClick(CircleListBean item);
void onMoreClick(int idx, CircleListBean item);
void onPinglunClick(CircleListBean item);
@@ -65,6 +69,44 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
this.mListener = listener;
}
public static final String PAYLOAD_LIKE = "like";
public void updateLikeStatusOnly(int position, int isLike) {
notifyItemChanged(position, PAYLOAD_LIKE);
}
@Override
protected void convertPayloads(@NonNull BaseViewHolder helper, CircleListBean item, @NonNull List<Object> payloads) {
super.convertPayloads(helper, item, payloads);
if (payloads.isEmpty()) {
convert(helper, item);
} else {
Object payload = payloads.get(0);
if (payload instanceof Bundle) {
Bundle diff = (Bundle) payload;
if (diff.containsKey("like_num")) {
helper.setText(R.id.dy_fabulous, diff.getString("like_num"));
if (diff.containsKey("is_like")) {
if (diff.getInt("is_like") == 1) {
helper.setImageResource(R.id.dianzan_image, R.mipmap.dongtai_hudong_yidianzan);
} else {
helper.setImageResource(R.id.dianzan_image, com.xscm.moduleutil.R.mipmap.dongtai_hudong_dianzan);
}
}
}
if (diff.containsKey("comment_num")) {
helper.setText(R.id.dy_comment, diff.getString("comment_num"));
}
if (diff.containsKey("rewards_num")) {
double rewardNum = diff.getString("rewards_num") != null ? Double.parseDouble(item.getRewards_num()) : 0;
helper.setText(R.id.dy_zs, NumberFormatUtils.formatRewardNumber(rewardNum));
}
}
}
}
@Override
protected void convert(BaseViewHolder helper, CircleListBean item) {
helper.addOnClickListener(com.xscm.moduleutil.R.id.dianzan)
@@ -89,8 +131,8 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
// 设置点击回调
helper.getView(com.xscm.moduleutil.R.id.dianzan).setOnClickListener(v -> {
if (mListener != null){
mListener.onDianzanClick(item);
if (mListener != null) {
mListener.onDianzanClick(helper.getPosition(), item);
}
});
@@ -99,11 +141,11 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
});
helper.getView(com.xscm.moduleutil.R.id.zs).setOnClickListener(v -> {
if (mListener != null) mListener.onZsClick(item);
if (mListener != null) mListener.onZsClick(helper.getPosition(), item);
});
helper.getView(R.id.diandian).setOnClickListener(v -> {
if (mListener != null) mListener.onDiandianClick(item);
if (mListener != null) mListener.onMoreClick(helper.getPosition(), item);
});
helper.getView(R.id.pinglun).setOnClickListener(v -> {
@@ -124,18 +166,27 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
});
//昵称
helper.setText(R.id.dy_name_text, item.getNickname());
ShineTextView tvName = helper.getView(R.id.dy_name_text);
if (!item.getNickname_color().isEmpty()) {
tvName.setStartColor(Color.parseColor(item.getNickname_color()));
tvName.setShineColor(Color.parseColor(item.getNickname_color()));
tvName.setEndColor(Color.parseColor(item.getNickname_color()));
tvName.setShine(true);
tvName.setShineType(0);
}
//头像
// ImageUtils.loadHeadCC(item.getAvatar(), helper.getView(R.id.dy_head_image));
MeHeadView headView = helper.getView(R.id.dy_head_image);
headView.setData(item.getAvatar(), "", item.getSex() + "");
headView.setData(item.getAvatar(), "", item.getNobility_image());
//动态内容以富文本展示
String content = item.getContent();
if (content == null || content.length() == 0) {
helper.getView(R.id.dy_lookmore_tv).setVisibility(GONE);
helper.getView(R.id.dy_content_tv).setVisibility(GONE);
} else {
helper.getView(R.id.dy_lookmore_tv).setVisibility(VISIBLE);
helper.getView(R.id.dy_lookmore_tv).setVisibility(GONE);
helper.getView(R.id.dy_content_tv).setVisibility(VISIBLE);
}
helper.getView(R.id.dy_lookmore_tv).getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@@ -145,7 +196,7 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
TextView view = helper.getView(R.id.dy_content_tv);
int lineCount = view.getLineCount();
if (lineCount >= 7) {
helper.getView(R.id.dy_lookmore_tv).setVisibility(VISIBLE);
helper.getView(R.id.dy_lookmore_tv).setVisibility(GONE);
helper.getView(R.id.dy_content_tv).getViewTreeObserver().removeOnPreDrawListener(this);//销毁
} else {
helper.getView(R.id.dy_lookmore_tv).setVisibility(GONE);
@@ -163,7 +214,7 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
TextView view = helper.getView(R.id.dy_content_tv);
view.setVisibility(VISIBLE);
}
// 创建 SpannableString 来拼接 title 并设置点击事件
// 创建 SpannableString 来拼接 title 并设置点击事件
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append(content).append(" "); // 添加原始内容
if (item.getTitle() != null) {
@@ -206,28 +257,28 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
if (item.getIs_like() == 1) {
helper.setImageResource(R.id.dianzan_image, R.mipmap.dongtai_hudong_yidianzan);
// helper.setText(R.id.dy_fabulous, String.valueOf(Integer.parseInt(item.getLike_num()) + 1));
} else {
helper.setImageResource(R.id.dianzan_image, com.xscm.moduleutil.R.mipmap.dongtai_hudong_dianzan);
// helper.setText(R.id.dy_fabulous, item.getLike_num());
}
helper.setText(R.id.dy_fabulous, item.getLike_num());
if (mPageType==PAGE_SEARCH){
if (mPageType == PAGE_SEARCH) {
helper.setVisible(R.id.gensui, false);
}else {
if (item.getUser_id()==SpUtil.getUserId()){
} else {
if (item.getUser_id() == SpUtil.getUserId()) {
helper.setVisible(R.id.gensui, false);
}else {
} else {
helper.setVisible(R.id.gensui, true);
}
}
if (item.getRoom_id() != null && !item.getRoom_id().equals("0")) {
helper.setText(R.id.gensui, "跟随");
} else if (item.getRoom_id() == null || item.getRoom_id().equals("0")){
helper.setText(R.id.gensui, "私信");
helper.setText(R.id.gensui, "");
helper.getView(R.id.gensui).setBackgroundResource(com.xscm.moduleutil.R.mipmap.gsui);
} else if (item.getRoom_id() == null || item.getRoom_id().equals("0")) {
helper.setText(R.id.gensui, "");
helper.getView(R.id.gensui).setBackgroundResource(com.xscm.moduleutil.R.mipmap.six);
}
//分享数
// helper.setText(R.id.dy_zs, item.getRewards_num() != null ? item.getRewards_num() : "0");
@@ -251,7 +302,6 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
String[] arrIv = item.getImages().split(",");
OneImageYuanJiaoAdapter oneImageYuanJiaoAdapter = new OneImageYuanJiaoAdapter(mContext);
MyGridView recyclerView = helper.getView(R.id.dy_image_recyc);
recyclerView.setNumColumns(3);
recyclerView.setAdapter(oneImageYuanJiaoAdapter);
oneImageYuanJiaoAdapter.getList_adapter().clear();
@@ -262,51 +312,25 @@ public class CirleListAdapter extends BaseQuickAdapter<CircleListBean, BaseViewH
recyclerView.setOnItemClickListener((parent, view, position, id) -> {
FullScreenUtil.showFullScreenDialog(mContext, position, oneImageYuanJiaoAdapter.getList_adapter());
});
}else {
} else {
helper.getView(R.id.dy_image_recyc).setVisibility(View.GONE);
}
if (item.getLike_list() == null){
if (item.getLike_list() == null) {
helper.getView(R.id.rela).setVisibility(GONE);
helper.getView(R.id.view).setVisibility(VISIBLE);
}else {
} else {
helper.getView(R.id.rela).setVisibility(VISIBLE);
helper.getView(R.id.view).setVisibility(GONE);
RecyclerView recyclerView= helper.getView(R.id.recycle_view);
RecyclerView recyclerView = helper.getView(R.id.recycle_view);
recyclerView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
LikeUserAdapter<CircleListBean.LikeList> likeUserAdapter = new LikeUserAdapter<>();
recyclerView.setAdapter(likeUserAdapter);
likeUserAdapter.setNewData(item.getLike_list());
helper.setText(R.id.pinglun_tv, item.getLike_num()+"人点赞");
helper.setText(R.id.pinglun_tv, item.getLike_num() + "人点赞");
}
}
public static final String PAYLOAD_LIKE = "like";
public void updateLikeStatusOnly(int position, int isLike) {
notifyItemChanged(position, PAYLOAD_LIKE);
}
@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position, @NonNull List<Object> payloads) {
if (payloads.isEmpty()) {
onBindViewHolder(holder, position); // 全量绑定
} else {
for (Object payload : payloads) {
if (payload.equals(PAYLOAD_LIKE)) {
CircleListBean item = getData().get(position);
if (item.getIs_like() == 1) {
holder.setImageResource(R.id.dianzan_image, R.mipmap.dongtai_hudong_yidianzan);
holder.setText(R.id.dy_fabulous, String.valueOf(Integer.parseInt(item.getLike_num()) + 1));
} else {
holder.setImageResource(R.id.dianzan_image, com.xscm.moduleutil.R.mipmap.dongtai_hudong_dianzan);
holder.setText(R.id.dy_fabulous, item.getLike_num());
}
}
}
}
}
}

View File

@@ -0,0 +1,209 @@
package com.xscm.moduleutil.adapter;
import android.annotation.SuppressLint;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ForegroundColorSpan;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.xscm.moduleutil.R;
import com.xscm.moduleutil.bean.GiftPackBean;
import com.xscm.moduleutil.event.RoomGiftPackToEvent;
import com.xscm.moduleutil.utils.ImageUtils;
import org.greenrobot.eventbus.EventBus;
import java.lang.ref.WeakReference;
import java.util.List;
/**
* @Author lxj$
* @Time 2025年7月29日23:36:25$ $
* @Description 背包礼物适配器$
*/
public class GiftPackAdapter extends BaseQuickAdapter<GiftPackBean, BaseViewHolder> {
private final List<GiftPackBean> mDatas;
private final LayoutInflater inflater;
private final Context mContext;
private final MyGestureDetector gestureDetector;
private final String type;
/**
* 页数下标,从0开始(当前是第几页)
*/
private final int curIndex;
/**
* 每一页显示的个数
*/
private final int pageSize = 100;
public GiftPackAdapter(Context context, List<GiftPackBean> mDatas, int curIndex, String type) {
super(R.layout.item_gift_room, mDatas);
inflater = LayoutInflater.from(context);
this.mDatas = mDatas;
this.curIndex = curIndex;
this.mContext = context;
this.type = type;
this.gestureDetector = new MyGestureDetector(mContext);
}
/**
* 先判断数据集的大小是否足够显示满本页mDatas.size() > (curIndex+1)*pageSize,
* 如果够则直接返回每一页显示的最大条目个数pageSize,
* 如果不够,则有几项返回几,(mDatas.size() - curIndex * pageSize);(也就是最后一页的时候就显示剩余item)
*/
// @Override
// public int getCount() {
// return mDatas.size() > (curIndex + 1) * pageSize ? pageSize : (mDatas.size() - curIndex * pageSize);
// }
//
// @Override
// public GiftPackBean getItem(int position) {
// return mDatas.get(position + curIndex * pageSize);
// }
@Override
protected void convert(@NonNull BaseViewHolder helper, GiftPackBean giftModel) {
helper.getView(R.id.cl_gift).setOnClickListener(v -> {
// RoonGiftModel clickedModel = (RoonGiftModel) v.getTag();
EventBus.getDefault().post(new RoomGiftPackToEvent(this, giftModel, 2));
});
helper.setVisible(R.id.integral, true).setText(R.id.integral, "x" + giftModel.getNum());
helper.setText(R.id.tv_gift_name, giftModel.getGift_name());
//设置礼物价格
String surplusTxt = giftModel.getGift_price();
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(surplusTxt);
//ForegroundColorSpan 为文字前景色BackgroundColorSpan为文字背景色
ForegroundColorSpan redSpan = new ForegroundColorSpan(mContext.getResources().getColor(R.color.color_FFA9A9A9));
stringBuilder.setSpan(redSpan, surplusTxt.length(), surplusTxt.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//修改最后两个字体的颜色
helper.setText(R.id.tv_gift_price,stringBuilder);
//加载礼物图片
ImageUtils.loadImageView(giftModel.getBase_image(),helper.getView(R.id.iv_gift_pic));
//设置选中后的样式
if (giftModel.isChecked()) {//被选中
helper.getView(R.id.cl_iv_down_on).setBackgroundResource(R.mipmap.room_gift_bjx);
helper.setVisible(R.id.iv_down_on, false);
} else {
helper.setVisible(R.id.iv_down_on, false);
helper.getView(R.id.cl_iv_down_on).setBackgroundResource(0);
}
}
@Override
public long getItemId(int position) {
return position + (long) curIndex * pageSize;
}
private static class MyGestureDetector extends GestureDetector {
private static WeakReference<GiftPackAdapter> sAdapter = new WeakReference<>(null);
private static GiftPackBean sGiftModel;
private GiftPackAdapter mAdapter;
private GiftPackBean mGiftModel;
public void setGiftModel(GiftPackAdapter adapter, GiftPackBean gift) {
sAdapter = new WeakReference<>(adapter);
sGiftModel = gift;
}
private static final SimpleOnGestureListener sSimpleOnGestureListener = new SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
EventBus.getDefault().post(new RoomGiftPackToEvent(sAdapter.get(), sGiftModel, 1));
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
EventBus.getDefault().post(new RoomGiftPackToEvent(sAdapter.get(), sGiftModel, 2));
return true;
}
};
public MyGestureDetector(Context context) {
super(context, sSimpleOnGestureListener);
setOnDoubleTapListener(sSimpleOnGestureListener);
}
}
// @Override
// @SuppressLint({"SetTextI18n", "ClickableViewAccessibility"})
// public View getView(int position, View convertView, ViewGroup parent) {
// GiftPackAdapter.ViewHolder viewHolder;
// GiftPackBean giftModel = getItem(position);
// if (convertView == null) {
// convertView = inflater.inflate(R.layout.item_gift_room, parent, false);
// viewHolder = new GiftPackAdapter.ViewHolder();
// viewHolder.tv_gift_name = (TextView) convertView.findViewById(R.id.tv_gift_name);
// viewHolder.tv_gift_price = (TextView) convertView.findViewById(R.id.tv_gift_price);
// viewHolder.iv_gift_pic = (ImageView) convertView.findViewById(R.id.iv_gift_pic);
// viewHolder.item_layout = (ConstraintLayout) convertView.findViewById(R.id.cl_gift);
// viewHolder.ivDownOn = (ImageView) convertView.findViewById(R.id.iv_down_on);
// viewHolder.cl_iv_down_on = (ConstraintLayout) convertView.findViewById(R.id.cl_iv_down_on);
// viewHolder.integral = (TextView) convertView.findViewById(R.id.integral);
// viewHolder.im_heart = (ImageView) convertView.findViewById(R.id.im_heartssss);
// convertView.setTag(viewHolder);
// } else {
// viewHolder = (GiftPackAdapter.ViewHolder) convertView.getTag();
// }
//
// viewHolder.item_layout.setOnClickListener(v -> {
//// RoonGiftModel clickedModel = (RoonGiftModel) v.getTag();
// EventBus.getDefault().post(new RoomGiftPackToEvent(this, giftModel, 2));
//
// });
// viewHolder.integral.setVisibility(View.VISIBLE);
// viewHolder.integral.setText("x"+giftModel.getNum());
// //设置礼物名字
// viewHolder.tv_gift_name.setText(giftModel.getGift_name());
// //设置礼物价格
// String surplusTxt = giftModel.getGift_price();
// SpannableStringBuilder stringBuilder = new SpannableStringBuilder(surplusTxt);
// //ForegroundColorSpan 为文字前景色BackgroundColorSpan为文字背景色
// ForegroundColorSpan redSpan = new ForegroundColorSpan(mContext.getResources().getColor(R.color.color_FFA9A9A9));
// stringBuilder.setSpan(redSpan, surplusTxt.length(), surplusTxt.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//修改最后两个字体的颜色
// viewHolder.tv_gift_price.setText(stringBuilder);
//// viewHolder.item_layout.setTag(R.id.id_gift_tag, giftModel);
//
// //加载礼物图片
// ImageUtils.loadImageView(giftModel.getBase_image(), viewHolder.iv_gift_pic);
// //设置选中后的样式
//
// if (giftModel.isChecked()) {//被选中
// viewHolder.cl_iv_down_on.setBackgroundResource(R.mipmap.room_gift_bjx);
// viewHolder.ivDownOn.setVisibility(View.GONE);
// } else {
// viewHolder.ivDownOn.setVisibility(View.GONE);
// viewHolder.cl_iv_down_on.setBackgroundResource(0);
// }
//
// return convertView;
// }
//
//
// static class ViewHolder {
// public ConstraintLayout item_layout;
// public TextView tv_gift_name, tv_gift_price, integral;
// public ImageView iv_gift_pic;
// public TextView tv_gift_change_love_values;
// public ImageView ivDownOn;
// public ConstraintLayout cl_iv_down_on;
// public ImageView im_heart;
// }
}

View File

@@ -0,0 +1,324 @@
package com.xscm.moduleutil.adapter;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import android.annotation.SuppressLint;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import com.blankj.utilcode.util.LogUtils;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.hjq.toast.ToastUtils;
import com.xscm.moduleutil.R;
import com.xscm.moduleutil.bean.RoonGiftModel;
import com.xscm.moduleutil.event.RoomGiftClickToEvent;
import com.xscm.moduleutil.utils.ImageUtils;
import org.greenrobot.eventbus.EventBus;
import java.lang.ref.WeakReference;
import java.util.List;
public class GiftRoomAdapter extends BaseQuickAdapter<RoonGiftModel, BaseViewHolder> {
private final List<RoonGiftModel> mDatas;
private final LayoutInflater inflater;
private final Context mContext;
private final MyGestureDetector gestureDetector;
private final String type;
/**
* 页数下标,从0开始(当前是第几页)
*/
private final int curIndex;
/**
* 每一页显示的个数
*/
private final int pageSize = 100;
public GiftRoomAdapter(Context context, List<RoonGiftModel> mDatas, int curIndex, String type) {
super(R.layout.item_gift_room);
this.mDatas = mDatas;
this.curIndex = curIndex;
this.mContext = context;
this.type = type;
this.gestureDetector = new MyGestureDetector(mContext);
inflater = LayoutInflater.from(mContext);
}
/**
* 先判断数据集的大小是否足够显示满本页mDatas.size() > (curIndex+1)*pageSize,
* 如果够则直接返回每一页显示的最大条目个数pageSize,
* 如果不够,则有几项返回几,(mDatas.size() - curIndex * pageSize);(也就是最后一页的时候就显示剩余item)
*/
// @Override
// public int getCount() {
// return mDatas !=null ? mDatas.size() : 0;
//// return mDatas.size() > (curIndex + 1) * pageSize ? pageSize : (mDatas.size() - curIndex * pageSize);
// }
//
// @Override
// public RoonGiftModel getItem(int position) {
// return mDatas.get(position);
//// return mDatas.get(position + curIndex * pageSize);
// }
@Override
protected void convert(@NonNull BaseViewHolder helper, RoonGiftModel giftModel) {
helper.getView(R.id.cl_gift).setOnClickListener(v -> {
// RoonGiftModel clickedModel = (RoonGiftModel) v.getTag();
if (giftModel.getIs_lock() == 0) {
EventBus.getDefault().post(new RoomGiftClickToEvent(this, giftModel, 1));
} else if (giftModel.getIs_lock() == 1) {
ToastUtils.show("当前属于爵位礼物,请开通爵位");
}
});
if (giftModel.getIs_lock() == 0) {
helper.setVisible(R.id.iv_gift_select,false);
} else {
helper.setVisible(R.id.iv_gift_select,true);
}
if (TextUtils.isEmpty(giftModel.getIcon())) {
helper.setVisible(R.id.im_heartssss,false);
}else {
helper.setVisible(R.id.im_heartssss,true);
ImageUtils.loadHead(giftModel.getIcon(), helper.getView(R.id.im_heartssss));
}
//设置礼物名字
helper.setText(R.id.tv_gift_name,giftModel.getGift_name());
if (TextUtils.isEmpty(giftModel.getNum())){
helper.setVisible(R.id.integral, false);
}else {
helper.setVisible(R.id.integral, true).setText(R.id.integral, "x" + giftModel.getNum());
}
//设置礼物价格
String surplusTxt = giftModel.getGift_price();
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(surplusTxt);
//ForegroundColorSpan 为文字前景色BackgroundColorSpan为文字背景色
ForegroundColorSpan redSpan = new ForegroundColorSpan(mContext.getResources().getColor(R.color.color_FFA9A9A9));
stringBuilder.setSpan(redSpan, surplusTxt.length(), surplusTxt.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//修改最后两个字体的颜色
helper.setText(R.id.tv_gift_price,stringBuilder);
// viewHolder.item_layout.setTag(R.id.id_gift_tag, giftModel);
//加载礼物图片
ImageUtils.loadImageView(giftModel.getBase_image(), helper.getView(R.id.iv_gift_pic));
//设置选中后的样式
if (giftModel.getGift_bag() == 10) {
helper.setText(R.id.tv_gift_name,"");
helper.getView(R.id.cl_gift).setBackgroundResource(R.mipmap.gift_tkzj);
helper.getView(R.id.tv_gift_name).setBackgroundResource(R.mipmap.gift_name_tkzj);
} else if (giftModel.getGift_bag() == 11) {
helper.setText(R.id.tv_gift_name,"");
helper.getView(R.id.cl_gift).setBackgroundResource(R.mipmap.gift_syzc);
helper.getView(R.id.tv_gift_name).setBackgroundResource(R.mipmap.gift_name_syzc);
} else if (giftModel.getGift_bag() == 12) {
helper.setText(R.id.tv_gift_name,"");
helper.getView(R.id.cl_gift).setBackgroundResource(R.mipmap.gift_sjzd);
helper.getView(R.id.tv_gift_name).setBackgroundResource(R.mipmap.gift_name_skzd);
}else {
helper.setText(R.id.tv_gift_name,giftModel.getGift_name());
helper.getView(R.id.tv_gift_name).setBackgroundResource(0);
helper.getView(R.id.cl_gift).setBackgroundResource(R.mipmap.gift_bj);
}
if (giftModel.isChecked()) {//被选中
helper.getView(R.id.cl_iv_down_on).setBackgroundResource(R.mipmap.room_gift_bjx);
helper.setVisible(R.id.iv_down_on,false);
} else {
helper.getView(R.id.cl_iv_down_on).setBackgroundResource(0);
helper.setVisible(R.id.iv_down_on,false);
}
}
@Override
public long getItemId(int position) {
return position;
// return position + (long) curIndex * pageSize;
}
private static class MyGestureDetector extends GestureDetector {
private static WeakReference<GiftRoomAdapter> sAdapter = new WeakReference<>(null);
private static RoonGiftModel sGiftModel;
private GiftRoomAdapter mAdapter;
private RoonGiftModel mGiftModel;
public void setGiftModel(GiftRoomAdapter adapter, RoonGiftModel gift) {
sAdapter = new WeakReference<>(adapter);
sGiftModel = gift;
}
private static final SimpleOnGestureListener sSimpleOnGestureListener = new SimpleOnGestureListener() {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
EventBus.getDefault().post(new RoomGiftClickToEvent(sAdapter.get(), sGiftModel, 1));
return true;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
EventBus.getDefault().post(new RoomGiftClickToEvent(sAdapter.get(), sGiftModel, 2));
return true;
}
};
public MyGestureDetector(Context context) {
super(context, sSimpleOnGestureListener);
setOnDoubleTapListener(sSimpleOnGestureListener);
}
}
public void updateData(List<RoonGiftModel> newData) {
this.mDatas.clear();
// 确保新数据都不处于选中状态
for (RoonGiftModel model : newData) {
model.setChecked(false);
}
this.mDatas.addAll(newData);
}
// @Override
// @SuppressLint({"SetTextI18n", "ClickableViewAccessibility"})
// public View getView(int position, View convertView, ViewGroup parent) {
// ViewHolder viewHolder;
// RoonGiftModel giftModel = getItem(position);
// if (convertView == null) {
// convertView = inflater.inflate(R.layout.item_gift_room, parent, false);
// viewHolder = new ViewHolder();
// viewHolder.item_layout = (ConstraintLayout) convertView.findViewById(R.id.cl_gift);
// viewHolder.cl_iv_down_on = (ConstraintLayout) convertView.findViewById(R.id.cl_iv_down_on);
// viewHolder.tv_gift_name = (TextView) convertView.findViewById(R.id.tv_gift_name);
// viewHolder.tv_gift_price = (TextView) convertView.findViewById(R.id.tv_gift_price);
// viewHolder.iv_gift_pic = (ImageView) convertView.findViewById(R.id.iv_gift_pic);
// viewHolder.ivDownOn = (ImageView) convertView.findViewById(R.id.iv_down_on);
// viewHolder.iv_gift_select = (ImageView) convertView.findViewById(R.id.iv_gift_select);
//
// // im_heart现在位于顶层布局中
// viewHolder.im_heart = (ImageView) convertView.findViewById(R.id.im_heartssss);
// convertView.setTag(viewHolder);
// } else {
// viewHolder = (ViewHolder) convertView.getTag();
// }
//
// viewHolder.item_layout.setOnClickListener(v -> {
//// RoonGiftModel clickedModel = (RoonGiftModel) v.getTag();
// if (giftModel.getIs_lock() == 0) {
// EventBus.getDefault().post(new RoomGiftClickToEvent(this, giftModel, 1));
// } else if (giftModel.getIs_lock() == 1) {
// ToastUtils.show("当前属于爵位礼物,请开通爵位");
// }
// });
// if (giftModel.getIs_lock() == 0) {
// viewHolder.iv_gift_select.setVisibility(GONE);
// } else {
// viewHolder.iv_gift_select.setVisibility(VISIBLE);
// }
// if (TextUtils.isEmpty(giftModel.getIcon())) {
// viewHolder.im_heart.setVisibility(GONE);
// }else {
// viewHolder.im_heart.setVisibility(VISIBLE);
// ImageUtils.loadHead(giftModel.getIcon(), viewHolder.im_heart);
// }
//
//// if (giftModel.getIs_cp() == 0 && giftModel.getIs_teacher() == 0 ) {//这是cp礼物
//// viewHolder.im_heart.setVisibility(GONE);
//// } else {
//// if (viewHolder.im_heart != null) {
//// viewHolder.im_heart.setVisibility(VISIBLE);
//// if (giftModel.getIs_cp() == 1) {
//// viewHolder.im_heart.setImageResource(R.mipmap.icon_heart);
//// }else if (giftModel.getIs_teacher() == 1) {
//// viewHolder.im_heart.setImageResource(R.mipmap.icon_teacher);
//// }
//// }
//// }
//
//
// /*
// * 在给View绑定显示的数据时计算正确的position = position + curIndex * pageSize
// */
//// viewHolder.tv_gift_num.setVisibility(type.equals("1") ? View.VISIBLE : View.INVISIBLE);
//// viewHolder.tv_gift_change_love_values.setVisibility(View.GONE);
//
//
// //设置礼物名字
// viewHolder.tv_gift_name.setText(giftModel.getGift_name());
// //设置礼物价格
// String surplusTxt = giftModel.getGift_price();
// SpannableStringBuilder stringBuilder = new SpannableStringBuilder(surplusTxt);
// //ForegroundColorSpan 为文字前景色BackgroundColorSpan为文字背景色
// ForegroundColorSpan redSpan = new ForegroundColorSpan(mContext.getResources().getColor(R.color.color_FFA9A9A9));
// stringBuilder.setSpan(redSpan, surplusTxt.length(), surplusTxt.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//修改最后两个字体的颜色
// viewHolder.tv_gift_price.setText(stringBuilder);
//// viewHolder.item_layout.setTag(R.id.id_gift_tag, giftModel);
//
// //加载礼物图片
// ImageUtils.loadImageView(giftModel.getBase_image(), viewHolder.iv_gift_pic);
// //设置选中后的样式
//
// if (giftModel.isChecked()) {//被选中
// viewHolder.cl_iv_down_on.setBackgroundResource(R.mipmap.room_gift_bjx);
// viewHolder.ivDownOn.setVisibility(View.GONE);
// } else {
// viewHolder.ivDownOn.setVisibility(View.GONE);
// viewHolder.cl_iv_down_on.setBackgroundResource(0);
// }
// //设置
//// //设置礼物心动值
//// if (giftModel.getCardiac().equals("0")) {
//// viewHolder.tv_gift_change_love_values.setBackgroundResource(R.mipmap.room_gift_xin_dong_reduce);
//// viewHolder.tv_gift_change_love_values.setText(String.format("%s", giftModel.getCardiac()));
//// } else {
//// viewHolder.tv_gift_change_love_values.setBackgroundResource(R.mipmap.room_gift_xin_dong_add);
//// viewHolder.tv_gift_change_love_values.setText(String.format("+%s", giftModel.getCardiac()));
//// }
//// if (giftModel.isManghe()) {
//// viewHolder.tv_gift_change_love_values.setVisibility(View.GONE);
//// }
// if (giftModel.getGift_bag() == 10) {
//
// viewHolder.item_layout.setBackgroundResource(R.mipmap.gift_tkzj);
// viewHolder.tv_gift_name.setText("");
// viewHolder.tv_gift_name.setBackgroundResource(R.mipmap.gift_name_tkzj);
// } else if (giftModel.getGift_bag() == 11) {
// viewHolder.tv_gift_name.setText("");
// viewHolder.item_layout.setBackgroundResource(R.mipmap.gift_syzc);
// viewHolder.tv_gift_name.setBackgroundResource(R.mipmap.gift_name_syzc);
// } else if (giftModel.getGift_bag() == 12) {
// viewHolder.tv_gift_name.setText("");
// viewHolder.item_layout.setBackgroundResource(R.mipmap.gift_sjzd);
// viewHolder.tv_gift_name.setBackgroundResource(R.mipmap.gift_name_skzd);
// }
// return convertView;
// }
//
//
// static class ViewHolder {
// public ConstraintLayout item_layout;
// public TextView tv_gift_name, tv_gift_price, tv_gift_num;
// public ImageView iv_gift_pic;
// public TextView tv_gift_change_love_values;
// public ImageView ivDownOn;
// public ImageView iv_gift_select;
// public ImageView im_heart;
// public ConstraintLayout cl_iv_down_on;
// }
}

View File

@@ -158,10 +158,10 @@ public class GiftTwoAdapter extends BaseAdapter {
viewHolder.ivDownOn.setVisibility(View.GONE);
viewHolder.cl_iv_down_on.setBackgroundResource(0);
}
if (giftModel.getNum()==0){
if (giftModel.getNum().isEmpty()){
viewHolder.tv_gift_num.setVisibility(View.GONE);
}
viewHolder.tv_gift_num.setText(String.format("x%s", (giftModel.getNum()!=0?giftModel.getNum():"")));
viewHolder.tv_gift_num.setText(String.format("x%s", giftModel.getNum()));
//设置

View File

@@ -10,6 +10,7 @@ import androidx.annotation.Nullable;
import com.blankj.utilcode.util.ToastUtils;
import com.xscm.moduleutil.R;
import com.xscm.moduleutil.base.BaseMvpFragment;
import com.xscm.moduleutil.base.CommonAppContext;
import com.xscm.moduleutil.bean.GiftLabelBean;
import com.xscm.moduleutil.bean.GiftPackBean;
import com.xscm.moduleutil.bean.GiftPackEvent;
@@ -70,7 +71,6 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
@@ -79,7 +79,7 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
}
public void loadDataIfNeeded(String id, int type, String roomId) {
if (MvpPre==null){
if (MvpPre == null) {
MvpPre = new RewardGiftPresenter(this, getActivity());
}
if (id.equals("0")) {
@@ -95,11 +95,12 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
}
}
bdgiftId = "";
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onString(GiftPackEvent event) {
if (event!=null && event.getBdid()!=null) {
if (event != null && event.getBdid() != null) {
bdgiftId = event.getBdid();
MvpPre.giftPack();
}
@@ -107,19 +108,9 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
@Override
protected void initData() {
if (type==0){
if (type == 0) {//当type=0的时候这个是点击排麦插队礼物的这里传递的id是0
MvpPre.getGiftList("0", type, roomId);
}
// if (id.equals("0")) {
// MvpPre.giftPack();
// } else {
// if (type == 0) {
// MvpPre.getGiftList("0", type, roomId);
// } else {
// MvpPre.getGiftList(id, type, roomId);
// }
//
// }
}
@Override
@@ -157,14 +148,17 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
@Override
public void setGiftList(List<RoonGiftModel> data, int type) {
if (data == null)
return;
giftList = new ArrayList<>();
giftList.addAll(data);
pageCount = (int) Math.ceil(data.size() * 1.0 / pageSize);
// 只需要创建一次Adapter并设置循环设置没有意义
if (pageCount > 0) {
roomAdapter = new GiftRoomAdapter(getActivity(), data, 0, "0");
roomAdapter = new GiftRoomAdapter(CommonAppContext.getInstance(), data, 0, "0");
mBinding.rvGift.setAdapter(roomAdapter);
roomAdapter.setNewData(data);
}
}
@@ -192,7 +186,7 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
@Override
public void giftPack(List<GiftPackBean> giftPackBean) {
giftPackList = new ArrayList<>();
if (getActivity()==null){
if (getActivity() == null) {
return;
}
@@ -208,8 +202,6 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
giftPackList.addAll(giftPackBean);
pageCount = (int) Math.ceil(giftPackBean.size() * 1.0 / pageSize);
for (int j = 0; j < pageCount; j++) {
// mAdapter = new GiftTwoAdapter(getActivity(), data, j, "0");
// mBinding.rvGift.setAdapter(mAdapter);
packAdapter = new GiftPackAdapter(getActivity(), giftPackBean, j, "0");
mBinding.rvGift.setAdapter(packAdapter);
}
@@ -221,7 +213,6 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
}
}
@Override
@@ -234,6 +225,11 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
}
@Override
public void roomHotCard() {
}
@Override
public void getRewardList(List<RewardUserBean> rewardUserBeanList) {
@@ -305,15 +301,21 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
roonGiftModel.setGift_name(giftModel.getGift_name());
roonGiftModel.setGift_price(giftModel.getGift_price());
roonGiftModel.setBase_image(giftModel.getBase_image());
roonGiftModel.setNum(Integer.parseInt(giftModel.getNum()));
roonGiftModel.setNum(giftModel.getNum());
if (giftModel.getGift_id().equals(id)) {
if (!giftModel.isChecked()) {
EventBus.getDefault().post(new GiftUserRefreshEvent(true, event.type, roonGiftModel));
giftModel.setChecked(true);
roonGiftModel.setChecked(giftModel.isChecked());
EventBus.getDefault().post(new GiftUserRefreshEvent(true, event.type, roonGiftModel));
} else {
giftModel.setChecked(false);
roonGiftModel.setChecked(giftModel.isChecked());
}
} else {
giftModel.setChecked(false);
roonGiftModel.setChecked(giftModel.isChecked());
}
}
if (event.adapter != null && event.adapter.get() != null) {
event.adapter.get().notifyDataSetChanged();
@@ -328,17 +330,24 @@ public class GiftTwoDetailsFragment extends BaseMvpFragment<RewardGiftPresenter,
roonGiftModel.setGift_name(giftModel.getGift_name());
roonGiftModel.setGift_price(giftModel.getGift_price());
roonGiftModel.setBase_image(giftModel.getBase_image());
roonGiftModel.setNum(Integer.parseInt(giftModel.getNum()));
roonGiftModel.setNum(giftModel.getNum());
if (giftModel.getGift_id().equals(id)) {
selGift = giftModel;
if (!giftModel.isChecked()) {
EventBus.getDefault().post(new GiftUserRefreshEvent(true, event.type, roonGiftModel));
giftModel.setChecked(true);
roonGiftModel.setChecked(giftModel.isChecked());
EventBus.getDefault().post(new GiftUserRefreshEvent(true, event.type, roonGiftModel));
} else {
giftModel.setChecked(false);
roonGiftModel.setChecked(giftModel.isChecked());
EventBus.getDefault().post(new GiftUserRefreshEvent(true, event.type, roonGiftModel));
}
} else {
giftModel.setChecked(false);
EventBus.getDefault().post(new GiftUserRefreshEvent(false, event.type, null));
roonGiftModel.setChecked(giftModel.isChecked());
// EventBus.getDefault().post(new GiftUserRefreshEvent(false, event.type, roonGiftModel));
}
}
if (event.adapter != null && event.adapter.get() != null) {
event.adapter.get().notifyDataSetChanged();

View File

@@ -0,0 +1,29 @@
package com.xscm.moduleutil.adapter;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.xscm.moduleutil.R;
import com.xscm.moduleutil.bean.CircleListBean;
import com.xscm.moduleutil.bean.room.RoomOnlineBean;
import com.xscm.moduleutil.utils.ImageUtils;
/**
*@author qx
*@data 2025/6/10
*@description: 显示用户小头像
*/
public class LikeUser2Adapter<T> extends BaseQuickAdapter<T, BaseViewHolder> {
public LikeUser2Adapter() {
super(R.layout.item_like_user);
}
@Override
protected void convert(BaseViewHolder helper,T item) {
if (item instanceof CircleListBean.LikeList) {
ImageUtils.loadHeadCC(((CircleListBean.LikeList) item).getAvatar(), helper.getView(R.id.user_icon));
} else {
// 可扩展:通过接口回调获取头像 URL
ImageUtils.loadHeadCC(((RoomOnlineBean) item).getAvatar(), helper.getView(R.id.user_icon));
}
}
}

View File

@@ -13,7 +13,7 @@ import com.xscm.moduleutil.utils.ImageUtils;
*/
public class LikeUserAdapter<T> extends BaseQuickAdapter<T, BaseViewHolder> {
public LikeUserAdapter() {
super(R.layout.item_like_user);
super(R.layout.item_like_user_2);
}
@Override

View File

@@ -14,32 +14,10 @@ import com.xscm.moduleutil.utils.ImageUtils;
public class OneImageYuanJiaoAdapter extends MyBaseAdapter<String> {
private Context context;
// public OneImageYuanJiaoAdapter(Context context) {
// this.context = context;
// }
public OneImageYuanJiaoAdapter(Context context) {
this.context = context;
}
// @Override
// protected void convert(BaseViewHolder helper, String item) {
// helper.addOnClickListener(R.id.fiv);
//
// helper.setVisible(R.id.ll_del, false);
// QMUIRadiusImageView image = helper.getView(R.id.fiv);
// RequestOptions options = new RequestOptions()
// .centerCrop()
// .placeholder(R.color.white)
// .diskCacheStrategy(DiskCacheStrategy.ALL);
// Glide.with(mContext)
// .load(item)
// .apply(options)
// .into(image);
// }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder VH;
@@ -53,10 +31,8 @@ public class OneImageYuanJiaoAdapter extends MyBaseAdapter<String> {
VH.iv_del.setVisibility(View.GONE);
if (!TextUtils.isEmpty(list_adapter.get(position))) {
ImageUtils.loadHeadCC(list_adapter.get(position),VH.tv_title);
}
//
return convertView;
}
@@ -64,27 +40,10 @@ public class OneImageYuanJiaoAdapter extends MyBaseAdapter<String> {
public static class ViewHolder {
RoundedImageView tv_title;
ImageView iv_del;
RelativeLayout layoutImg;
public ViewHolder(View convertView) {
tv_title = convertView.findViewById(R.id.fiv);
iv_del = convertView.findViewById(R.id.iv_del);
// layoutImg = convertView.findViewById(R.id.layout_img);
//
// int screenWidth = QMUIDisplayHelper.getScreenWidth(BaseApplication.mApplication) - QMUIDisplayHelper.dp2px(BaseApplication.mApplication, 24);
//
// int imgWidth = screenWidth*1/3-QMUIDisplayHelper.dp2px(BaseApplication.mApplication, 10);
//
// RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) layoutImg.getLayoutParams();
// params.width = imgWidth;
// params.height = imgWidth;
// layoutImg.setLayoutParams(params);
//
// params = (RelativeLayout.LayoutParams) tv_title.getLayoutParams();
// params.width = imgWidth;
// params.height = imgWidth;
// tv_title.setLayoutParams(params);
}
}
}

View File

@@ -0,0 +1,74 @@
package com.xscm.moduleutil.base
import android.app.Dialog
import android.content.DialogInterface
import android.graphics.Color
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.view.WindowManager
import androidx.core.view.WindowCompat
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.DialogFragment
import androidx.viewbinding.ViewBinding
import com.voice.lib_base.ext.inflateBindingWithGeneric
import com.xscm.moduleutil.R
open class BaseBottomFragmentDialog<B : ViewBinding?>(private val resourceID: Int) :
DialogFragment() {
var mDatabind: B? = null
val mBinding: B get() = mDatabind!!
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = Dialog(requireActivity(), R.style.myChooseDialog)
mDatabind = DataBindingUtil.inflate(LayoutInflater.from(requireContext()), resourceID, null, false) as B
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
dialog.setContentView(mBinding!!.root)
val window = dialog.window
val params = window!!.attributes
params.width = WindowManager.LayoutParams.MATCH_PARENT
params.height = WindowManager.LayoutParams.WRAP_CONTENT
params.gravity = Gravity.BOTTOM
window.attributes = params
dialog.setCanceledOnTouchOutside(true)
return dialog
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mDatabind = inflateBindingWithGeneric(inflater, container, false)
// return if (mBinding != null) mBinding!!.root else mDatabind?.root
return mBinding?.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(requireDialog().window!!, false)
requireDialog().setOnShowListener { dialog: DialogInterface? ->
(view.parent as ViewGroup).setBackgroundColor(
Color.TRANSPARENT
)
}
}
override fun onDestroyView() {
super.onDestroyView()
mDatabind = null
}
fun setBundleArgs(bundleArgs: Bundle?): BaseBottomFragmentDialog<B> {
arguments = bundleArgs
return this
}
}

View File

@@ -14,10 +14,18 @@ import androidx.fragment.app.Fragment;
import com.xscm.moduleutil.activity.BaseAppCompatActivity;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
public abstract class BaseFragment<VDB extends ViewDataBinding> extends Fragment {
protected VDB mBinding;
@Override
public void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -35,8 +43,14 @@ public abstract class BaseFragment<VDB extends ViewDataBinding> extends Fragment
initView();
initData();
initListener();
EventBus.getDefault().register(this);
}
@Subscribe (threadMode = ThreadMode.MAIN)
public void onEvent(Object event) {
}
public void initArgs(Bundle arguments) {
}

View File

@@ -0,0 +1,68 @@
package com.xscm.moduleutil.base
import android.app.Dialog
import android.content.DialogInterface
import android.graphics.Color
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.Window
import android.view.WindowManager
import androidx.core.view.WindowCompat
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.fragment.app.DialogFragment
import androidx.viewbinding.ViewBinding
import com.voice.lib_base.ext.inflateBindingWithGeneric
import com.xscm.moduleutil.R
open class BaseFragmentDialog<B : ViewBinding?>(private val resourceID: Int) : DialogFragment() {
var mDatabind: B? = null
val mBinding: B get() = mDatabind!!
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = Dialog(requireActivity(), R.style.myChooseDialog)
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE)
mDatabind = DataBindingUtil.inflate<ViewDataBinding>(LayoutInflater.from(requireContext()), resourceID, null, false) as B
dialog.setContentView(mDatabind!!.root)
val window = dialog.window
val params = window!!.attributes
params.width = WindowManager.LayoutParams.MATCH_PARENT
params.height = WindowManager.LayoutParams.WRAP_CONTENT
window.attributes = params
dialog.setCanceledOnTouchOutside(true)
return dialog
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mDatabind = inflateBindingWithGeneric(inflater, container, false)
return if (mBinding != null) mBinding!!.root else null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(requireDialog().window!!, false)
requireDialog().setOnShowListener { dialog: DialogInterface? ->
(view.parent as ViewGroup).setBackgroundColor(
Color.TRANSPARENT
)
}
}
override fun onDestroyView() {
super.onDestroyView()
mDatabind = null
}
fun setBundleArgs(bundleArgs: Bundle?): BaseFragmentDialog<B> {
arguments = bundleArgs
return this
}
}

View File

@@ -22,6 +22,10 @@ import com.xscm.moduleutil.activity.BaseAppCompatActivity;
import com.xscm.moduleutil.activity.IPresenter;
import com.xscm.moduleutil.activity.IView;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
/**
*@author qx
*@data 2025/5/29
@@ -43,6 +47,12 @@ public abstract class BaseMvpDialogFragment<P extends IPresenter, VDM extends Vi
return getActivity();
}
@Override
public void onDestroy() {
EventBus.getDefault().unregister(this);
super.onDestroy();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -61,6 +71,12 @@ public abstract class BaseMvpDialogFragment<P extends IPresenter, VDM extends Vi
}
initView();
initData();
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(Object event){
}

View File

@@ -11,6 +11,7 @@ import androidx.annotation.Nullable;
import androidx.databinding.ViewDataBinding;
import androidx.fragment.app.FragmentActivity;
import com.blankj.utilcode.util.LogUtils;
import com.xscm.moduleutil.activity.IPresenter;
import com.xscm.moduleutil.activity.IView;
@@ -20,6 +21,8 @@ public abstract class BaseMvpFragment<P extends IPresenter, VDB extends ViewData
protected abstract P bindPresenter();
protected boolean isShowSuccess = false;
@Override
public FragmentActivity getSelfActivity() {
return getActivity();
@@ -37,6 +40,23 @@ public abstract class BaseMvpFragment<P extends IPresenter, VDB extends ViewData
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
isShowSuccess = true;
}
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
LogUtils.e("BaseMvpFragmentAAA","onHiddenChanged==="+hidden+"====="+this.getClass().getSimpleName()+"===="+isShowSuccess);
}
@Override
public void onStop() {
super.onStop();
}
@Override
public void onDestroyView() {
if (MvpPre != null) {

View File

@@ -0,0 +1,66 @@
package com.xscm.moduleutil.base;
import android.os.Bundle;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.databinding.ViewDataBinding;
import com.xscm.moduleutil.bean.room.RoomInfoResp;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseRoomFragment<P extends BaseRoomPresenter, VDB extends ViewDataBinding> extends BaseMvpFragment<P, VDB> implements BaseRoomContacts.View {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
@Override
public void onDestroyView() {
unRegisterWheatViews();
super.onDestroyView();
}
@Override
protected void initView() {
registerWheatViews();
}
/**
* 房间信息
*/
@Subscribe(threadMode = ThreadMode.MAIN)
public void roomInfo(RoomInfoResp resp) {
roomInfoUpdate(resp);
}
public abstract void roomInfoUpdate(RoomInfoResp resp);
public abstract void registerWheatViews();
public abstract void unRegisterWheatViews();
public abstract int[] collectCurrentCardiacValues();
protected void tzblChanged() {
}
private int getAmativenessWheatMaoziLevel(int value) {
if (value >= 52000) {
return 3;
} else if (value >= 10000) {
return 2;
} else if (value >= 1000) {
return 1;
} else {
return 0;
}
}
}

View File

@@ -132,7 +132,7 @@ public class BaseRoomPresenter<V extends IView> extends BasePresenter<V> impleme
@Override
public void putOnWheat(String roomId, String userId,String pitNum) {
MvpRef.get().showLoadings();
// MvpRef.get().showLoadings();
// ApiClient.getInstance().putOnWheat(roomId, userId,pitNum, new BaseObserver<PutOnWheatResp>() {
// @Override
// public void onSubscribe(Disposable d) {

View File

@@ -0,0 +1,65 @@
package com.xscm.moduleutil.base
import androidx.lifecycle.*
import com.xscm.moduleutil.http.RetrofitClient
import com.xscm.moduleutil.widget.room.PassRoomException
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import okhttp3.MultipartBody
/**
*
*/
open class BaseViewModel : ViewModel(), LifecycleObserver {
private var clickTime: Long = 0
var baseRepository = RetrofitClient.getInstance()
private val passRoom by lazy { MutableLiveData<Exception>() }
private val error by lazy { MutableLiveData<Exception>() }
private val finally by lazy { MutableLiveData<Int>() }
//进入房间
var imgListData: MutableLiveData<List<String>> = MutableLiveData()
var addImgData = MutableLiveData<Any>()
//运行在UI线程的协程
fun launchUI(block: suspend CoroutineScope.() -> Unit) = viewModelScope.launch {
try {
block()
} catch (e: Exception) {
if (e is PassRoomException) {
passRoom.value = e
} else {
error.value = e
// throw e
}
} finally {
finally.value = 200
}
}
/**
* 请求失败,出现异常
*/
fun getError(): LiveData<Exception> {
return error
}
/**
* 请求完成,在此处做一些关闭操作
*/
fun getFinally(): LiveData<Int> {
return finally
}
}

View File

@@ -26,20 +26,25 @@ import androidx.multidex.MultiDex;
import androidx.multidex.MultiDexApplication;
import com.alibaba.android.arouter.launcher.ARouter;
import com.blankj.utilcode.util.ActivityUtils;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ProcessUtils;
import com.lahm.library.EasyProtectorLib;
import com.lahm.library.EmulatorCheckCallback;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.imsdk.v2.V2TIMAdvancedMsgListener;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMMessage;
import com.tencent.imsdk.v2.V2TIMMessageManager;
import com.tencent.imsdk.v2.V2TIMMessageReceipt;
import com.tencent.imsdk.v2.V2TIMValueCallback;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUICallback;
import com.xscm.moduleutil.bean.UserBean;
import com.xscm.moduleutil.bean.UserInfo;
import com.xscm.moduleutil.dialog.ConfirmDialog;
import com.xscm.moduleutil.event.AppLifecycleEvent;
import com.xscm.moduleutil.event.UnreadCountEvent;
import com.xscm.moduleutil.http.RetrofitClient;
@@ -52,20 +57,8 @@ import com.xscm.moduleutil.utils.CrashHandler;
import com.xscm.moduleutil.utils.SpUtil;
import com.xscm.moduleutil.utils.UtilConfig;
import com.xscm.moduleutil.utils.config.EnvironmentEnum;
import com.xscm.moduleutil.utils.config.EnvironmentPrefs;
import com.xscm.moduleutil.utils.cos.CosUploadManager;
import com.xscm.moduleutil.widget.CommonAppConfig;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
import com.scwang.smartrefresh.layout.api.RefreshFooter;
import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import com.tencent.bugly.crashreport.CrashReport;
import com.tencent.qcloud.tuicore.TUILogin;
import com.tencent.qcloud.tuicore.interfaces.TUICallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.greenrobot.eventbus.EventBus;
@@ -84,7 +77,7 @@ import lombok.Setter;
* Created by cxf on 2017/8/3.
*/
public class CommonAppContext extends MultiDexApplication implements Application.ActivityLifecycleCallbacks {
public class CommonAppContext extends MultiDexApplication implements Application.ActivityLifecycleCallbacks {
private static CommonAppContext sInstance;
private static Handler sMainThreadHandler;
@@ -92,7 +85,7 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
private boolean mFront;//是否前台
public String emulator = "0";
@Getter
private EnvironmentEnum currentEnvironment;
public EnvironmentEnum currentEnvironment;
public UserBean mUserBean;
public boolean isShow;
@@ -104,17 +97,19 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
public boolean isShowAg;
public boolean isRoomJoininj=false;
public boolean isRoomJoininj = false;
public String playCover;
public boolean showSelf;//盲盒是否能送自己
public String playName;
private MqttConnect mqttConnect=null;
private MqttConnect mqttConnect = null;
// 添加后台状态标记
private boolean wasInBackground = false;
public boolean isMai=false;
public boolean isMai = false;
public boolean isLogout = false;
public void onAppBackground() {
wasInBackground = true;
@@ -132,40 +127,60 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
private AppStateListener appStateListener;
private boolean isListeningUnreadCount = false;
public boolean onConnectFailed=false;//是否重连
public boolean onConnectFailed = false;//是否重连
public Map<String, Integer> onlineMap=new HashMap<>();
public void setOnlineMap(Map<String, Integer> onlineMap) {
this.onlineMap = onlineMap;
}
public Map<String, Integer> getOnlineMap() {
return onlineMap;
}
@Getter
@Setter
public Map<String, Integer> onlineMap = new HashMap<>();
@Setter
@Getter
public UnreadCountEvent unreadCountEvent;
public static int selectRelease = -1;
public int is_open = 0;//主题的开关
public String appId = "com.qxcm.qxlive";
public String appVersionCode = "88";
public String appVersionName = "1.0.9.8";
@Override
public void onCreate() {
super.onCreate();
sInstance = this;
sMainThreadHandler = new Handler();
EnvironmentPrefs prefs = new EnvironmentPrefs(this);
// 添加内存优化配置
optimizeMemorySettings();
currentEnvironment = prefs.getSelectedEnvironment();
initialization();
// EnvironmentPrefs prefs = new EnvironmentPrefs(this);
// currentEnvironment = prefs.getSelectedEnvironment();
registerActivityLifecycleCallbacks(this);
appStateListener = AppStateManager.getInstance();
startListeningUnreadMessageCount();
// 全局设置字体不缩放
adjustFontScale(getResources().getConfiguration());
CrashHandler.init(this);
if (SpUtil.getShelf() != 0) {
SpUtil.setShelf(1);
}
if (SpUtil.getTaskService() == 1){//当如果是正式服的时候这里就变成可以设置成辅助服务器当如果是测试服务的时候就是变成了测试了
selectRelease = 1;
}
//设置mqtt环境 false 测试环境 true 正式环境
// ExternalResConstants.INSTANCE.setIS_MQTT_RELEASE(false);
//设置http环境 false 测试环境 true 正式环境
ExternalResConstants.INSTANCE.setIS_HTTP_RELEASE(selectRelease);
currentEnvironment = ExternalResConstants.INSTANCE.HTTP_PATH();
initialization();
}
public void adjustFontScale(Configuration configuration) {
@@ -210,6 +225,58 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
}
}
public void dialogHttp(){
new ConfirmDialog(ActivityUtils.getTopActivity(),
"提示",
"当前网络环境异常,请重试",
"确认",
"取消",
v -> {
// 点击确认按钮时执行删除操作
selectRelease = 3;
initHttp();
},
v -> {
selectRelease = 3;
initHttp();
// 点击取消按钮时什么都不做
}, false, 0).show();
}
public void initHttp(){
ExternalResConstants.INSTANCE.setIS_HTTP_RELEASE(selectRelease);
currentEnvironment = ExternalResConstants.INSTANCE.HTTP_PATH();
try {
RetrofitClient.INSTANCE=null;
RetrofitClient.getInstance();
clearLoginInfo();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
public void clearLoginDialog(String msg){
new ConfirmDialog(ActivityUtils.getTopActivity(),
"提示",
msg,
"",
"确定",
v -> {
// 点击确认按钮时执行删除操作
},
v -> {
try {
clearLoginInfo();
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
// 点击取消按钮时什么都不做
}, true, 4).show();
}
// 更新未读消息数的方法
private void updateUnreadMessageCount() {
V2TIMManager.getConversationManager().getTotalUnreadMessageCount(new V2TIMValueCallback<Long>() {
@@ -229,17 +296,19 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
// 通知未读数变化的方法可以发送广播或EventBus事件
private void notifyUnreadCountChanged(long unreadCount) {
UnreadCountEvent event =unreadCountEvent;
if (event==null){
event=new UnreadCountEvent();
UnreadCountEvent event = unreadCountEvent;
if (event == null) {
event = new UnreadCountEvent();
}
event.setALong(unreadCount);
// 使用EventBus通知
CommonAppContext.getInstance().setUnreadCountEvent(event);
EventBus.getDefault().post(event);
EventBus.getDefault().post(event);
}
/**
* 检查网络是否可用
*
* @return true表示网络可用false表示网络不可用
*/
public boolean isNetworkAvailable() {
@@ -438,33 +507,17 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
initARouter();
if (SpUtil.isAgreePolicy()) {
checkInEmulator();
UtilConfig.checkInEmulator();
AgoraManager.getInstance(this);
AgoraManager.init(currentEnvironment.getSwSdkAppId());
MessageListenerSingleton.getInstance();
CrashReport.initCrashReport(this, "b45883f58f", true);/*bugly初始化*/
// // 启动 MQTT 服务
// Intent mqttServiceIntent = new Intent(this, MyMqttService.class);
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// startForegroundService(mqttServiceIntent);
// } else {
// startService(mqttServiceIntent);
// }
// UtilConfig.checkInEmulator();
// mqttConnect=MqttConnect.getInstance(this,"tcp://1.13.181.248","android-"+ MqttClient.generateClientId());
mqttConnect=MqttConnect.getInstance(this,"tcp://1.13.101.98","android-"+ MqttClient.generateClientId());
mqttConnect.mqttClient();
CrashReport.initCrashReport(this, "b45883f58f", true);/*bugly初始化*/
// 每次启动应用时重置状态
SpUtil.getInstance().setBooleanValue("youth_model_shown", false);
startInitSdk();
// 初始化通常在Application或Activity的onCreate中
CosUploadManager.getInstance(CommonAppContext.getInstance());
// 启动IM连接服务
// IMServiceManager.getInstance().startIMService(this);
}
}
// piaoPingManager = PiaoPingManager.getInstance(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!Settings.canDrawOverlays(this)) {
@@ -530,11 +583,14 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
}
public void upMqtt(){
if (mqttConnect==null){
// mqttConnect=MqttConnect.getInstance(this,"tcp://1.13.181.248","android-"+ MqttClient.generateClientId());
mqttConnect=MqttConnect.getInstance(this,"tcp://1.13.101.98","android-"+ MqttClient.generateClientId());
if (mqttConnect == null){
mqttConnect=MqttConnect.getInstance(this, currentEnvironment.getMqttUrl(),"android-"+ MqttClient.generateClientId());
mqttConnect.mqttClient();
}
AgoraManager.getInstance();
MessageListenerSingleton.getInstance();
startInitSdk();
}
@Override
@@ -763,15 +819,25 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
SpUtil.putToken("");
// piaoPingManager.unsubscribe();
FileUtils.deleteAllInDir(getCacheDir());
FileUtils.deleteAllInDir(getExternalCacheDir());
AgoraManager.getInstance(getApplicationContext()).destroy();
// TODO: 2026/1/22 清楚本地缓存但是在清楚的时候会把所有的图片缓存就清除了这是不对的今天进行了修改注释掉
// FileUtils.deleteAllInDir(getCacheDir());
// FileUtils.deleteAllInDir(getExternalCacheDir());
AgoraManager.getInstance().destroy();
// 每次启动应用时重置状态
SpUtil.setBooleanValue("youth_model_shown", false);
if (mqttConnect != null){
mqttConnect.close();
mqttConnect = null;
}
isLogout = true;
// 发送广播通知所有Activity刷新状态
Intent refreshIntent = new Intent("com.xscm.moduleutil.ACTION_USER_LOGOUT");
sendBroadcast(refreshIntent);
// Intent refreshIntent = new Intent("com.xscm.moduleutil.ACTION_USER_LOGOUT");
// sendBroadcast(refreshIntent);
ActivityUtils.finishAllActivities();
Intent intent = new Intent("com.qxcm.qxlive.LAUNCH_PAGE");
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(intent);
@@ -786,32 +852,6 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
}
}
//static 代码段可以防止内存泄露
static {
//设置全局的Header构建器
SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
@Override
public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
ClassicsHeader header = new ClassicsHeader(context);
header.setDrawableSize(20);
header.setFinishDuration(0);
return header;//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header默认是 贝塞尔雷达Header
// return new CustomRefreshHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header默认是 贝塞尔雷达Header
}
});
//设置全局的Footer构建器
SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
@Override
public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
ClassicsFooter classicsFooter = new ClassicsFooter(context);
classicsFooter.setDrawableSize(20);
classicsFooter.setFinishDuration(0);
//指定为经典Footer默认是 BallPulseFooter
return classicsFooter;
}
});
}
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
@@ -838,7 +878,7 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
AppLifecycleUtil.onAppFrontGround();
}
if (playId!=null && !playId.equals("")){
RetrofitClient.getInstance().userRoomBack(playId, "2");
// RetrofitClient.getInstance().userRoomBack(playId, "2");
}
activityCount++;
}
@@ -853,7 +893,7 @@ public class CommonAppContext extends MultiDexApplication implements Applicatio
}
if (playId!=null && !playId.equals("")){
RetrofitClient.getInstance().userRoomBack(playId, "1");
// RetrofitClient.getInstance().userRoomBack(playId, "1");
}
AppLifecycleUtil.onAppBackGround();

View File

@@ -0,0 +1,34 @@
package com.xscm.moduleutil.base
import com.xscm.moduleutil.utils.config.EnvironmentEnum
object ExternalResConstants {
//================================================================================MQTT======================================================================================
// var IS_MQTT_RELEASE = true
// val MQTT_PATH_DEBUG = "tcp://1.13.181.248"
// val MQTT_PATH_RELEASE = "tcp://1.13.101.98"
//
// fun MQTT_PATH(): String {
// return if (IS_MQTT_RELEASE) {
// MQTT_PATH_RELEASE
// } else {
// MQTT_PATH_DEBUG
// }
// }
//================================================================================HTTP======================================================================================
var IS_HTTP_RELEASE: Int = 1 //0 测试环境 1 正式环境 2 辅助环境
val HTTP_PATH_DEBUG: EnvironmentEnum = EnvironmentEnum.TEST
val HTTP_PATH_RELEASE: EnvironmentEnum = EnvironmentEnum.PRODUCTION
val HTTP_AUXILIARY: EnvironmentEnum = EnvironmentEnum.Auxiliary
fun HTTP_PATH(): EnvironmentEnum {
return if (IS_HTTP_RELEASE == 1) {
HTTP_PATH_RELEASE
} else if (IS_HTTP_RELEASE == 3) {
HTTP_AUXILIARY
} else {
HTTP_PATH_DEBUG
}
}
//================================================================================END======================================================================================
}

View File

@@ -0,0 +1,10 @@
package com.xscm.moduleutil.base;
public class RealTimeMessages<T> {
public T data;
public int code;
}

View File

@@ -0,0 +1,6 @@
package com.xscm.moduleutil.base
data class SocketBean(
val code: Int, val data: Any
)

View File

@@ -0,0 +1,37 @@
package com.xscm.moduleutil.base
/**
* Created by xscm on 2020/7/23.
* 描述web url 常量
*/
object WebUrlConstants {
val BASE_URL = CommonAppContext.getInstance().currentEnvironment.h5Url
/**青少年模式*/
val WEB_ADOLESCENT_URL = BASE_URL + "/web/index.html#/pages/feedback/teenage?id=%s"
val WEB_SET_GROUP_URL = BASE_URL + "/web/index.html#/pages/union/setGroup?id=%s&guildId=%s"
/**举报*/
val WEB_REPORT_URL =
BASE_URL + "/web/index.html#/pages/feedback/report?id=%s&fromType=%d&fromId=%s"
/**规则*/
val WEB_RULES_URL = BASE_URL + "/web/index.html#/pages/other/taskDesc"
/**道具商城*/
val WEB_PROP_MALL_URL = BASE_URL + "/web/index.html#/pages/prop/propMall?id=%s"
/**公会*/
val WEB_GUILD_URL = BASE_URL + "/web/index.html#/pages/union/index?id=%s&guild_id=%s"
/**等级*/
val WEB_GRADE_URL = BASE_URL + "/web/index.html#/pages/other/grade?id=%s"
/**反馈*/
val WEB_HELP_URL = BASE_URL + "/web/index.html#/pages/feedback/help?id=%s"
/**邀请*/
val WEB_INVITATION_URL = BASE_URL + "/web/index.html#/pages/other/income?id=%s"
}

View File

@@ -0,0 +1,11 @@
package com.xscm.moduleutil.bean
/**
* 项目名称:羽声语音
* 时间2026/1/14 18:47
* 用途app配置的客服用户id和name
*/
class AppCustomerBean {
var user_id: String = ""
var user_name: String = ""
}

View File

@@ -0,0 +1,9 @@
package com.xscm.moduleutil.bean
import java.io.Serializable
class BeforeJoinRoomCheckBean :Serializable {
var room_id:String? = null
var msg:String? = null
var code:Int = -1
}

View File

@@ -0,0 +1,28 @@
package com.xscm.moduleutil.bean
/**
* 项目名称:羽声语音
* 时间2026/1/7 19:47
* 用途:
*/
class BlackRoomBean {
var id: Int = 0
var p_room_id: Int = 0
var room_id: Int = 0
var user_id: Int = 0
var meet_user_id: Int = 0
var end_time: Int = 0
var createtime: Int = 0
var status: Int = 0
var heart_value: String? = ""
/* "id": 1,
"p_room_id": 6065,
"room_id": 6071,
"user_id": 20142,
"meet_user_id": 20137,
"end_time": 1767957473,
"createtime": 1767784373,
"status": 1,
"heart_value": null*/
}

View File

@@ -16,6 +16,6 @@ public class BlackUserBean {
private int sex;
private String user_code;
private int is_online;
private int is_follow;
private int is_follow;// 是否关注 0:未关注 1已关注 2别人关注了你你没有关注别人这个2只会在粉丝中使用
private List<String> icon;
}

View File

@@ -0,0 +1,20 @@
package com.xscm.moduleutil.bean
/**
* 项目名称:羽声语音
* 时间2025/12/21 11:37
* 用途:盲盒转盘状态
*/
class BlindBoxStatus {
var gift_bag_id: Int = 0
var name: String = ""
var status: Int = 0 //0关闭 1开启
var status_str: String = ""
var icon: String = ""
// "gift_bag_id": 11,
// "name": "岁月之城",
// "status": 1,
// "status_str": "开启中",
// "icon": null
}

View File

@@ -0,0 +1,53 @@
package com.xscm.moduleutil.bean;
import java.util.List;
import lombok.Data;
/**
* @author qx
* @data 2025/6/3
* @description: 这是广场中的列表数据
*/
@Data
public class CircleListBean {
public int id;//语圈ID
public int user_id;//用户ID
public String nickname;//用户昵称
public String avatar;//用户头像
public int is_like;//我是否点赞0没有1点赞
public int sex;//性别 1男2女
public String content;//内容
public String like_num;//点赞数
public String rewards_num; //打赏金额
public String is_room;//作者是否在房间中1在0不在
public String room_id;//作者所在房间ID is_room =0 此值小于0
public String comment_num;//评论数
public int is_recommend;//1非推荐2推荐
public String ip;//活跃地址
public String images;////图片 JSON字符串 封面获取第一张
public String createtime;//时间
public String topic_id;
public String share_url;
public List<HeatedBean> title;//话题列表
public String nobility_image;//贵族图标
public String nickname_color = "";//昵称颜色
public String mic_cycle;//麦圈
public String read_num;//阅读数
public List<LikeList> like_list;
@Data
public class LikeList {
public String user_id;
public String nickname;
public String avatar;
public int age;//年龄
public String sex;
public String constellation;//星座
public String birthday;//生日
}
}

View File

@@ -1,5 +1,6 @@
package com.xscm.moduleutil.bean;
import java.io.Serializable;
import java.util.List;
import lombok.Data;
@@ -10,7 +11,7 @@ import lombok.Data;
* @Description $
*/
@Data
public class CombinedGiftBean {
public class CombinedGiftBean implements Serializable {
private int gift_id;
private String gift_price;
private String gift_name;
@@ -21,7 +22,7 @@ public class CombinedGiftBean {
private boolean is_liang;
@Data
public static class TopUsers {
public static class TopUsers implements Serializable{
private int user_id;
private String nickname;
private String avatar;

View File

@@ -0,0 +1,174 @@
package com.xscm.moduleutil.bean
import com.google.gson.annotations.SerializedName
import java.util.ArrayList
/**
* 项目名称:羽声语音
* 时间2026/1/4 10:22
* 用途:装扮价格详情
*/
class DecorateDetailBean {
// 用户信息服务端返回的user_info字段
@SerializedName("user_info")
var userInfo: UserInfoDecorate? = UserInfoDecorate()
// 装饰商品核心信息服务端返回的decorate字段
@SerializedName("decorate")
var decorate: Decorate? = null
/**
* 用户信息内部类对应服务端user_info
*/
class UserInfoDecorate {
@SerializedName("user_id")
var userId: Int = 0
@SerializedName("user_coin")
var userCoin: String = ""
}
/**
* 装饰商品核心信息对应服务端decorate直接解析服务端返回数据
* 注意与之前适配器的Item模型解耦该类仅负责接收服务端数据不承担适配器布局类型职责
*/
class Decorate {
@SerializedName("title")
var title: String = "" // 商品名称(如“粉色花头”)
@SerializedName("price")
var price : String =""
@SerializedName("base_image")
var base_image : String =""
@SerializedName("price_list")
var priceList: List<PriceListBean> = ArrayList() // 价格/时长列表(服务端返回数组)
}
/**
* 价格/时长明细bean对应服务端price_list中的单个对象
* 可直接解析服务端返回的每个价格项数据同时适配适配器的PriceItem模型
*/
class PriceListBean {
@SerializedName("price")
var price: String = "" // 现价
@SerializedName("original_price")
var originalPrice: String = "" // 原价
@SerializedName("discount")
var discount: String = "" // 折扣如“5.0”)
@SerializedName("day")
var day: Int = 0 // 有效天数
@SerializedName("month")
var month: String = "" // 有效月数
@SerializedName("end_time")
var endTime: String = "" // 有效期截止时间
}
// ---------------------- 适配器适配相关:转换方法 + 适配器所需模型 ----------------------
/**
* 适配器的Item数据模型密封类区分单行/多选项)
* 与服务端数据模型解耦专门用于RecyclerView适配器布局
*/
sealed class DecorateAdapterItem {
// 单行信息类型(如“商品价格”“有效期至”)
data class SingleItem(
val label: String, // 左侧标签文字
val content: String // 右侧内容文字
) : DecorateAdapterItem()
// 购买时长多选项类型(承载所有时长选项)
data class MultiOptionItem(
val options: List<PriceListBean> // 直接复用PriceListBean已适配服务端数据
) : DecorateAdapterItem()
// type=12专用购买次数加减按钮
data class BuyCountItem(
val initialCount: Int,
val unitPrice: String
) : DecorateAdapterItem()
}
/**
* 转换方法将服务端数据Decorate转换为适配器所需数据列表List<DecorateAdapterItem>
* 实现服务端数据与适配器的桥接,方便适配器直接使用
* @param defaultSelectedPos 默认选中的时长选项下标默认0即第一个选项
*/
fun convertToAdapterData(
decorate: Decorate?,
defaultSelectedPos: Int = 0
): List<DecorateAdapterItem> {
val adapterDataList = mutableListOf<DecorateAdapterItem>()
if (decorate == null ) {
return adapterDataList
}
if ( decorate.priceList.isEmpty()){
// ---------- type=12解析单个字段无price_list新增购买次数、商品总价 ----------
val unitPrice = decorate.price// 直接取Decorate的singlePrice服务端返回的单价
val unitPriceStr = unitPrice // 格式化单价,避免小数异常
// 2. 商品单价单行项取decorate.singlePrice
adapterDataList.add(
DecorateAdapterItem.SingleItem(
label = "商品单价",
content = unitPriceStr
)
)
// 3. 购买次数type=12专用初始数量1传入单价用于计算总价
adapterDataList.add(
DecorateAdapterItem.BuyCountItem(
initialCount = 1,
unitPrice = unitPrice
)
)
// 4. 商品总价单行项初始单价×1
adapterDataList.add(
DecorateAdapterItem.SingleItem(
label = "商品总价",
content = unitPriceStr // 初始总价=单价×1
)
)
}else {
// 安全获取默认选中项(防止下标越界)
val selectedPos = if (defaultSelectedPos in decorate.priceList.indices) {
defaultSelectedPos
} else {
0
}
val selectedPriceItem = decorate.priceList[selectedPos]
// 1. 添加“商品价格”单行项(取选中项的现价)
adapterDataList.add(
DecorateAdapterItem.SingleItem(
label = "商品价格",
content = "${selectedPriceItem.price}" // 拼接货币符号,优化展示
)
)
// 2. 添加“有效期至”单行项(取选中项的截止时间)
adapterDataList.add(
DecorateAdapterItem.SingleItem(
label = "有效期至",
content = selectedPriceItem.endTime
)
)
// 3. 添加“购买时长”多选项(承载所有价格/时长列表)
adapterDataList.add(
DecorateAdapterItem.MultiOptionItem(
options = decorate.priceList
)
)
}
return adapterDataList
}
}

View File

@@ -20,5 +20,6 @@ public class ExpandColumnBean {
private int room_id;//房间id,当有参数的时候就显示跟随当没有的时候就显示私信控件
private String agree;
private List<String> icon;
private String nobility_image;//贵族图标
private String nickname_color = "";//昵称颜色
}

View File

@@ -0,0 +1,34 @@
package com.xscm.moduleutil.bean
/**
* 项目名称:羽声语音
* 时间2025/11/27 16:47
* 用途:
*/
class FamilyEarnings {
var id: Int=0
var nickname: String=""
var avatar: String=""
var user_code: String=""
var earnings: String=""
var createtime: Long=0
var gift_name: String=""
var gift_price: String=""
/* id 列表 id
nickname 用户昵称
avatar
user_code
earnings 收益
createtime
gift_name 礼物名称
gift_price 礼物价格*/
}

View File

@@ -0,0 +1,11 @@
package com.xscm.moduleutil.bean
/**
* 项目名称:羽声语音
* 时间2025/12/30 9:44
* 用途:节日主题接口
*/
class FestivalThemeBean {
var is_open : Int = 0 //主题开关
var theme_name : String = "" //主题名称
}

View File

@@ -41,7 +41,8 @@ public class GiftBean {
public boolean isSameGiftFromSameSender(GiftBean other) {
if (other == null) return false;
return Objects.equals(gift_id, other.gift_id) &&
Objects.equals(senderName, other.senderName);
Objects.equals(senderName, other.senderName) &&
Objects.equals(nickname,other.nickname);
}
// 生成礼物唯一键

Some files were not shown because too many files have changed in this diff Show More