新增aidl服务模拟
Showing
12 changed files
with
1758 additions
and
4 deletions
| ... | @@ -4,10 +4,10 @@ | ... | @@ -4,10 +4,10 @@ |
| 4 | <selectionStates> | 4 | <selectionStates> |
| 5 | <SelectionState runConfigName="app"> | 5 | <SelectionState runConfigName="app"> |
| 6 | <option name="selectionMode" value="DROPDOWN" /> | 6 | <option name="selectionMode" value="DROPDOWN" /> |
| 7 | <DropdownSelection timestamp="2024-10-12T05:40:06.328823Z"> | 7 | <DropdownSelection timestamp="2024-10-14T01:44:33.742803Z"> |
| 8 | <Target type="DEFAULT_BOOT"> | 8 | <Target type="DEFAULT_BOOT"> |
| 9 | <handle> | 9 | <handle> |
| 10 | <DeviceId pluginId="Default" identifier="serial=0123456789;connection=725ee2fc" /> | 10 | <DeviceId pluginId="LocalEmulator" identifier="path=/Users/bohu/.android/avd/Pixel_Tablet_API_31.avd" /> |
| 11 | </handle> | 11 | </handle> |
| 12 | </Target> | 12 | </Target> |
| 13 | </DropdownSelection> | 13 | </DropdownSelection> | ... | ... |
| ... | @@ -9,6 +9,7 @@ | ... | @@ -9,6 +9,7 @@ |
| 9 | <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> | 9 | <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /> |
| 10 | <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> | 10 | <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> |
| 11 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> | 11 | <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> |
| 12 | <permission android:name="com.android.smart.terminal.iptv.aidl.SERVICES" android:protectionLevel="normal"/> | ||
| 12 | 13 | ||
| 13 | <application | 14 | <application |
| 14 | android:allowBackup="true" | 15 | android:allowBackup="true" |
| ... | @@ -30,6 +31,11 @@ | ... | @@ -30,6 +31,11 @@ |
| 30 | <category android:name="android.intent.category.LAUNCHER" /> | 31 | <category android:name="android.intent.category.LAUNCHER" /> |
| 31 | </intent-filter> | 32 | </intent-filter> |
| 32 | </activity> | 33 | </activity> |
| 34 | <service android:exported="true" android:name="com.android.smart.terminal.iptv.aidl.ServiceCfg"> | ||
| 35 | <intent-filter> | ||
| 36 | <action android:name="com.android.smart.terminal.iptv.aidl.ServiceCfg"/> | ||
| 37 | </intent-filter> | ||
| 38 | </service> | ||
| 33 | </application> | 39 | </application> |
| 34 | 40 | ||
| 35 | </manifest> | 41 | </manifest> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
app/src/main/assets/iptv_param.json
0 → 100644
| 1 | { | ||
| 2 | "iptvauthurl": "1http://epg.itv.cq.cn:8080/iptvepg/platform/index.jsp", | ||
| 3 | "iptvaccount": "kdspb2", | ||
| 4 | "userid": "kdspb2", | ||
| 5 | "iptvpassword": "159357", | ||
| 6 | "stbid": "0010059900E06810042094D505F12A7E", | ||
| 7 | "usertoken": "IlrUGIlrUG17tYxUgfawMrNRAmf8XV7S", | ||
| 8 | "epgdomain": "http://172.23.88.137:33200/EPG/jsp/xinaishangbanmuban/en/Category.jsp", | ||
| 9 | "epginfo": "", | ||
| 10 | "epggroupnmb": "xinaishangbanmuban", | ||
| 11 | "usergroupnmb": "717", | ||
| 12 | "productmodel": "", | ||
| 13 | "terminaltype": "", | ||
| 14 | "areaid": "", | ||
| 15 | "countyid": "", | ||
| 16 | "romversion": "", | ||
| 17 | "terminalversion": "", | ||
| 18 | "mac": "", | ||
| 19 | "iptvstate": "", | ||
| 20 | "ottcp": "", | ||
| 21 | "sessionid": "DF10A297F8449B9526B58811497FC4B4" | ||
| 22 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
app/src/main/assets/livechannels.json
0 → 100644
| 1 | [{ | ||
| 2 | "UserChannelID": "35", | ||
| 3 | "ChannelNo": "763", | ||
| 4 | "ChannelName": "时尚购物", | ||
| 5 | "ext": "" | ||
| 6 | }, { | ||
| 7 | "UserChannelID": "36", | ||
| 8 | "ChannelNo": "1486", | ||
| 9 | "ChannelName": "江苏卫视(超高清)", | ||
| 10 | "ext": "" | ||
| 11 | }, { | ||
| 12 | "UserChannelID": "33", | ||
| 13 | "ChannelNo": "561019957", | ||
| 14 | "ChannelName": "环球购物", | ||
| 15 | "ext": "" | ||
| 16 | }, { | ||
| 17 | "UserChannelID": "34", | ||
| 18 | "ChannelNo": "3072", | ||
| 19 | "ChannelName": "家有购物(测试)", | ||
| 20 | "ext": "" | ||
| 21 | }, { | ||
| 22 | "UserChannelID": "39", | ||
| 23 | "ChannelNo": "1487", | ||
| 24 | "ChannelName": "深圳卫视(高清)", | ||
| 25 | "ext": "" | ||
| 26 | }, { | ||
| 27 | "UserChannelID": "37", | ||
| 28 | "ChannelNo": "1485", | ||
| 29 | "ChannelName": "浙江卫视(超高清)", | ||
| 30 | "ext": "" | ||
| 31 | }, { | ||
| 32 | "UserChannelID": "38", | ||
| 33 | "ChannelNo": "1501", | ||
| 34 | "ChannelName": "东方卫视(超高清)", | ||
| 35 | "ext": "" | ||
| 36 | }, { | ||
| 37 | "UserChannelID": "43", | ||
| 38 | "ChannelNo": "3332", | ||
| 39 | "ChannelName": "贵州卫视(超高清)", | ||
| 40 | "ext": "" | ||
| 41 | }, { | ||
| 42 | "UserChannelID": "42", | ||
| 43 | "ChannelNo": "1484", | ||
| 44 | "ChannelName": "天津卫视(超高清)", | ||
| 45 | "ext": "" | ||
| 46 | }, { | ||
| 47 | "UserChannelID": "41", | ||
| 48 | "ChannelNo": "1482", | ||
| 49 | "ChannelName": "山东卫视(高清)", | ||
| 50 | "ext": "" | ||
| 51 | }, { | ||
| 52 | "UserChannelID": "40", | ||
| 53 | "ChannelNo": "1490", | ||
| 54 | "ChannelName": "北京卫视(超高清)", | ||
| 55 | "ext": "" | ||
| 56 | }, { | ||
| 57 | "UserChannelID": "202", | ||
| 58 | "ChannelNo": "754", | ||
| 59 | "ChannelName": "CQTV影视", | ||
| 60 | "ext": "" | ||
| 61 | }, { | ||
| 62 | "UserChannelID": "203", | ||
| 63 | "ChannelNo": "756", | ||
| 64 | "ChannelName": "CQTV社会与法", | ||
| 65 | "ext": "" | ||
| 66 | }, { | ||
| 67 | "UserChannelID": "2018", | ||
| 68 | "ChannelNo": "2652", | ||
| 69 | "ChannelName": "江苏晚会4K", | ||
| 70 | "ext": "" | ||
| 71 | }, { | ||
| 72 | "UserChannelID": "204", | ||
| 73 | "ChannelNo": "759", | ||
| 74 | "ChannelName": "CQTV时尚生活", | ||
| 75 | "ext": "" | ||
| 76 | }, { | ||
| 77 | "UserChannelID": "2019", | ||
| 78 | "ChannelNo": "3954", | ||
| 79 | "ChannelName": "聚精彩临时业务流", | ||
| 80 | "ext": "" | ||
| 81 | }, { | ||
| 82 | "UserChannelID": "205", | ||
| 83 | "ChannelNo": "757", | ||
| 84 | "ChannelName": "CQTV娱乐", | ||
| 85 | "ext": "" | ||
| 86 | }, { | ||
| 87 | "UserChannelID": "200", | ||
| 88 | "ChannelNo": "752", | ||
| 89 | "ChannelName": "重庆卫视频道", | ||
| 90 | "ext": "" | ||
| 91 | }, { | ||
| 92 | "UserChannelID": "201", | ||
| 93 | "ChannelNo": "753", | ||
| 94 | "ChannelName": "CQTV新闻", | ||
| 95 | "ext": "" | ||
| 96 | }, { | ||
| 97 | "UserChannelID": "22", | ||
| 98 | "ChannelNo": "3536", | ||
| 99 | "ChannelName": "CQTV社会与法(超高清)", | ||
| 100 | "ext": "" | ||
| 101 | }, { | ||
| 102 | "UserChannelID": "23", | ||
| 103 | "ChannelNo": "3535", | ||
| 104 | "ChannelName": "CQTV时尚生活(超高清)", | ||
| 105 | "ext": "" | ||
| 106 | }, { | ||
| 107 | "UserChannelID": "24", | ||
| 108 | "ChannelNo": "3533", | ||
| 109 | "ChannelName": "CQTV娱乐(超高清)", | ||
| 110 | "ext": "" | ||
| 111 | }, { | ||
| 112 | "UserChannelID": "25", | ||
| 113 | "ChannelNo": "3532", | ||
| 114 | "ChannelName": "CQTV新农村(超高清)", | ||
| 115 | "ext": "" | ||
| 116 | }, { | ||
| 117 | "UserChannelID": "26", | ||
| 118 | "ChannelNo": "4094", | ||
| 119 | "ChannelName": "CQTV少儿(高清)", | ||
| 120 | "ext": "" | ||
| 121 | }, { | ||
| 122 | "UserChannelID": "206", | ||
| 123 | "ChannelNo": "758", | ||
| 124 | "ChannelName": "CQTV新农村", | ||
| 125 | "ext": "" | ||
| 126 | }, { | ||
| 127 | "UserChannelID": "27", | ||
| 128 | "ChannelNo": "3733", | ||
| 129 | "ChannelName": "CQTV科教(超高清)", | ||
| 130 | "ext": "" | ||
| 131 | }, { | ||
| 132 | "UserChannelID": "28", | ||
| 133 | "ChannelNo": "4093", | ||
| 134 | "ChannelName": "CQTV汽摩(高清)", | ||
| 135 | "ext": "" | ||
| 136 | }, { | ||
| 137 | "UserChannelID": "168", | ||
| 138 | "ChannelNo": "3034", | ||
| 139 | "ChannelName": "城市剧场(测试)", | ||
| 140 | "ext": "" | ||
| 141 | }, { | ||
| 142 | "UserChannelID": "208", | ||
| 143 | "ChannelNo": "755", | ||
| 144 | "ChannelName": "CQTV科教", | ||
| 145 | "ext": "" | ||
| 146 | }, { | ||
| 147 | "UserChannelID": "29", | ||
| 148 | "ChannelNo": "4096", | ||
| 149 | "ChannelName": "CQTV移动(高清)", | ||
| 150 | "ext": "" | ||
| 151 | }, { | ||
| 152 | "UserChannelID": "3", | ||
| 153 | "ChannelNo": "2552", | ||
| 154 | "ChannelName": "CCTV-3综艺(高清)", | ||
| 155 | "ext": "" | ||
| 156 | }, { | ||
| 157 | "UserChannelID": "409", | ||
| 158 | "ChannelNo": "1552", | ||
| 159 | "ChannelName": "IPTV相声小品.", | ||
| 160 | "ext": "" | ||
| 161 | }, { | ||
| 162 | "UserChannelID": "2", | ||
| 163 | "ChannelNo": "1479", | ||
| 164 | "ChannelName": "CCTV-2财经(高清)", | ||
| 165 | "ext": "" | ||
| 166 | }, { | ||
| 167 | "UserChannelID": "408", | ||
| 168 | "ChannelNo": "1555", | ||
| 169 | "ChannelName": "IPTV谍战剧场.", | ||
| 170 | "ext": "" | ||
| 171 | }, { | ||
| 172 | "UserChannelID": "1", | ||
| 173 | "ChannelNo": "1491", | ||
| 174 | "ChannelName": "CCTV-1综合(高清)", | ||
| 175 | "ext": "" | ||
| 176 | }, { | ||
| 177 | "UserChannelID": "7", | ||
| 178 | "ChannelNo": "2532", | ||
| 179 | "ChannelName": "CCTV-6电影(高清)", | ||
| 180 | "ext": "" | ||
| 181 | }, { | ||
| 182 | "UserChannelID": "405", | ||
| 183 | "ChannelNo": "1594", | ||
| 184 | "ChannelName": "IPTV6+", | ||
| 185 | "ext": "" | ||
| 186 | }, { | ||
| 187 | "UserChannelID": "6", | ||
| 188 | "ChannelNo": "1596", | ||
| 189 | "ChannelName": "CCTV-5+体育赛事(高清)", | ||
| 190 | "ext": "" | ||
| 191 | }, { | ||
| 192 | "UserChannelID": "404", | ||
| 193 | "ChannelNo": "1593", | ||
| 194 | "ChannelName": "IPTV5+", | ||
| 195 | "ext": "" | ||
| 196 | }, { | ||
| 197 | "UserChannelID": "5", | ||
| 198 | "ChannelNo": "2533", | ||
| 199 | "ChannelName": "CCTV-5体育(高清)", | ||
| 200 | "ext": "" | ||
| 201 | }, { | ||
| 202 | "UserChannelID": "407", | ||
| 203 | "ChannelNo": "1496", | ||
| 204 | "ChannelName": "收视指南.", | ||
| 205 | "ext": "" | ||
| 206 | }, { | ||
| 207 | "UserChannelID": "4", | ||
| 208 | "ChannelNo": "3334", | ||
| 209 | "ChannelName": "CCTV-4中文国际(高清)", | ||
| 210 | "ext": "" | ||
| 211 | }, { | ||
| 212 | "UserChannelID": "406", | ||
| 213 | "ChannelNo": "1595", | ||
| 214 | "ChannelName": "IPTV8+", | ||
| 215 | "ext": "" | ||
| 216 | }, { | ||
| 217 | "UserChannelID": "401", | ||
| 218 | "ChannelNo": "1499", | ||
| 219 | "ChannelName": "少儿动画.", | ||
| 220 | "ext": "" | ||
| 221 | }, { | ||
| 222 | "UserChannelID": "2021", | ||
| 223 | "ChannelNo": "4113", | ||
| 224 | "ChannelName": "自贡灯会慢直播", | ||
| 225 | "ext": "" | ||
| 226 | }, { | ||
| 227 | "UserChannelID": "400", | ||
| 228 | "ChannelNo": "2832", | ||
| 229 | "ChannelName": "重广融媒", | ||
| 230 | "ext": "" | ||
| 231 | }, { | ||
| 232 | "UserChannelID": "2020", | ||
| 233 | "ChannelNo": "4153", | ||
| 234 | "ChannelName": "2020测试", | ||
| 235 | "ext": "" | ||
| 236 | }, { | ||
| 237 | "UserChannelID": "9", | ||
| 238 | "ChannelNo": "2512", | ||
| 239 | "ChannelName": "CCTV-8电视剧(高清)", | ||
| 240 | "ext": "" | ||
| 241 | }, { | ||
| 242 | "UserChannelID": "403", | ||
| 243 | "ChannelNo": "1592", | ||
| 244 | "ChannelName": "IPTV3+", | ||
| 245 | "ext": "" | ||
| 246 | }, { | ||
| 247 | "UserChannelID": "2023", | ||
| 248 | "ChannelNo": "4133", | ||
| 249 | "ChannelName": "2023测试", | ||
| 250 | "ext": "" | ||
| 251 | }, { | ||
| 252 | "UserChannelID": "8", | ||
| 253 | "ChannelNo": "1474", | ||
| 254 | "ChannelName": "CCTV-7国防军事(高清)", | ||
| 255 | "ext": "" | ||
| 256 | }, { | ||
| 257 | "UserChannelID": "402", | ||
| 258 | "ChannelNo": "1495", | ||
| 259 | "ChannelName": "魅力时尚.", | ||
| 260 | "ext": "" | ||
| 261 | }, { | ||
| 262 | "UserChannelID": "2022", | ||
| 263 | "ChannelNo": "4135", | ||
| 264 | "ChannelName": "2022测试", | ||
| 265 | "ext": "" | ||
| 266 | }, { | ||
| 267 | "UserChannelID": "215", | ||
| 268 | "ChannelNo": "1472", | ||
| 269 | "ChannelName": "CCTV-2财经", | ||
| 270 | "ext": "" | ||
| 271 | }, { | ||
| 272 | "UserChannelID": "216", | ||
| 273 | "ChannelNo": "2495", | ||
| 274 | "ChannelName": "CCTV-3综艺", | ||
| 275 | "ext": "" | ||
| 276 | }, { | ||
| 277 | "UserChannelID": "19", | ||
| 278 | "ChannelNo": "1014", | ||
| 279 | "ChannelName": "重庆卫视(超高清)", | ||
| 280 | "ext": "" | ||
| 281 | }, { | ||
| 282 | "UserChannelID": "214", | ||
| 283 | "ChannelNo": "1435", | ||
| 284 | "ChannelName": "CCTV-1综合", | ||
| 285 | "ext": "" | ||
| 286 | }, { | ||
| 287 | "UserChannelID": "219", | ||
| 288 | "ChannelNo": "2498", | ||
| 289 | "ChannelName": "CCTV-6电影", | ||
| 290 | "ext": "" | ||
| 291 | }, { | ||
| 292 | "UserChannelID": "18", | ||
| 293 | "ChannelNo": "3754", | ||
| 294 | "ChannelName": "CCTV-17农业农村(高清)", | ||
| 295 | "ext": "" | ||
| 296 | }, { | ||
| 297 | "UserChannelID": "15", | ||
| 298 | "ChannelNo": "1475", | ||
| 299 | "ChannelName": "CCTV-少儿(高清)", | ||
| 300 | "ext": "" | ||
| 301 | }, { | ||
| 302 | "UserChannelID": "217", | ||
| 303 | "ChannelNo": "1734", | ||
| 304 | "ChannelName": "CCTV-4中文国际", | ||
| 305 | "ext": "" | ||
| 306 | }, { | ||
| 307 | "UserChannelID": "16", | ||
| 308 | "ChannelNo": "4294", | ||
| 309 | "ChannelName": "CCTV-15音乐(高清)", | ||
| 310 | "ext": "" | ||
| 311 | }, { | ||
| 312 | "UserChannelID": "218", | ||
| 313 | "ChannelNo": "2501", | ||
| 314 | "ChannelName": "CCTV-5体育", | ||
| 315 | "ext": "" | ||
| 316 | }, { | ||
| 317 | "UserChannelID": "13", | ||
| 318 | "ChannelNo": "1476", | ||
| 319 | "ChannelName": "CCTV-12社会与法(高清)", | ||
| 320 | "ext": "" | ||
| 321 | }, { | ||
| 322 | "UserChannelID": "14", | ||
| 323 | "ChannelNo": "4293", | ||
| 324 | "ChannelName": "CCTV-13新闻(高清)", | ||
| 325 | "ext": "" | ||
| 326 | }, { | ||
| 327 | "UserChannelID": "11", | ||
| 328 | "ChannelNo": "1477", | ||
| 329 | "ChannelName": "CCTV-10科教(高清)", | ||
| 330 | "ext": "" | ||
| 331 | }, { | ||
| 332 | "UserChannelID": "12", | ||
| 333 | "ChannelNo": "4313", | ||
| 334 | "ChannelName": "CCTV-11戏曲(高清)", | ||
| 335 | "ext": "" | ||
| 336 | }, { | ||
| 337 | "UserChannelID": "21", | ||
| 338 | "ChannelNo": "3534", | ||
| 339 | "ChannelName": "CQTV影视(超高清)", | ||
| 340 | "ext": "" | ||
| 341 | }, { | ||
| 342 | "UserChannelID": "418", | ||
| 343 | "ChannelNo": "3032", | ||
| 344 | "ChannelName": "地理(测试)", | ||
| 345 | "ext": "" | ||
| 346 | }, { | ||
| 347 | "UserChannelID": "20", | ||
| 348 | "ChannelNo": "3314", | ||
| 349 | "ChannelName": "CQTV新闻(超高清)", | ||
| 350 | "ext": "" | ||
| 351 | }, { | ||
| 352 | "UserChannelID": "417", | ||
| 353 | "ChannelNo": "3036", | ||
| 354 | "ChannelName": "音乐现场(测试)", | ||
| 355 | "ext": "" | ||
| 356 | }, { | ||
| 357 | "UserChannelID": "416", | ||
| 358 | "ChannelNo": "3038", | ||
| 359 | "ChannelName": "古装剧场(测试)", | ||
| 360 | "ext": "" | ||
| 361 | }, { | ||
| 362 | "UserChannelID": "415", | ||
| 363 | "ChannelNo": "3037", | ||
| 364 | "ChannelName": "军旅剧场(测试)", | ||
| 365 | "ext": "" | ||
| 366 | }, { | ||
| 367 | "UserChannelID": "419", | ||
| 368 | "ChannelNo": "3035", | ||
| 369 | "ChannelName": "美妆(测试)", | ||
| 370 | "ext": "" | ||
| 371 | }, { | ||
| 372 | "UserChannelID": "410", | ||
| 373 | "ChannelNo": "1554", | ||
| 374 | "ChannelName": "IPTV野外.", | ||
| 375 | "ext": "" | ||
| 376 | }, { | ||
| 377 | "UserChannelID": "414", | ||
| 378 | "ChannelNo": "2593", | ||
| 379 | "ChannelName": "开县本地电视1", | ||
| 380 | "ext": "" | ||
| 381 | }, { | ||
| 382 | "UserChannelID": "413", | ||
| 383 | "ChannelNo": "1497", | ||
| 384 | "ChannelName": "经典电影.", | ||
| 385 | "ext": "" | ||
| 386 | }, { | ||
| 387 | "UserChannelID": "412", | ||
| 388 | "ChannelNo": "1498", | ||
| 389 | "ChannelName": "热播剧场.", | ||
| 390 | "ext": "" | ||
| 391 | }, { | ||
| 392 | "UserChannelID": "411", | ||
| 393 | "ChannelNo": "1553", | ||
| 394 | "ChannelName": "IPTV法治.", | ||
| 395 | "ext": "" | ||
| 396 | }, { | ||
| 397 | "UserChannelID": "220", | ||
| 398 | "ChannelNo": "1436", | ||
| 399 | "ChannelName": "CCTV-7国防军事", | ||
| 400 | "ext": "" | ||
| 401 | }, { | ||
| 402 | "UserChannelID": "221", | ||
| 403 | "ChannelNo": "2496", | ||
| 404 | "ChannelName": "CCTV-8电视剧", | ||
| 405 | "ext": "" | ||
| 406 | }, { | ||
| 407 | "UserChannelID": "222", | ||
| 408 | "ChannelNo": "1453", | ||
| 409 | "ChannelName": "CCTV-9纪录", | ||
| 410 | "ext": "" | ||
| 411 | }, { | ||
| 412 | "UserChannelID": "223", | ||
| 413 | "ChannelNo": "1450", | ||
| 414 | "ChannelName": "CCTV-10科教", | ||
| 415 | "ext": "" | ||
| 416 | }, { | ||
| 417 | "UserChannelID": "1308", | ||
| 418 | "ChannelNo": "3253", | ||
| 419 | "ChannelName": "音乐直播(淘景立画)", | ||
| 420 | "ext": "" | ||
| 421 | }, { | ||
| 422 | "UserChannelID": "224", | ||
| 423 | "ChannelNo": "1473", | ||
| 424 | "ChannelName": "CCTV-11戏曲", | ||
| 425 | "ext": "" | ||
| 426 | }, { | ||
| 427 | "UserChannelID": "225", | ||
| 428 | "ChannelNo": "1471", | ||
| 429 | "ChannelName": "CCTV-12社会与法", | ||
| 430 | "ext": "" | ||
| 431 | }, { | ||
| 432 | "UserChannelID": "226", | ||
| 433 | "ChannelNo": "1469", | ||
| 434 | "ChannelName": "CCTV-13新闻", | ||
| 435 | "ext": "" | ||
| 436 | }, { | ||
| 437 | "UserChannelID": "227", | ||
| 438 | "ChannelNo": "1467", | ||
| 439 | "ChannelName": "CCTV-少儿", | ||
| 440 | "ext": "" | ||
| 441 | }, { | ||
| 442 | "UserChannelID": "228", | ||
| 443 | "ChannelNo": "1468", | ||
| 444 | "ChannelName": "CCTV-15音乐", | ||
| 445 | "ext": "" | ||
| 446 | }, { | ||
| 447 | "UserChannelID": "229", | ||
| 448 | "ChannelNo": "3753", | ||
| 449 | "ChannelName": "CCTV-17农业农村", | ||
| 450 | "ext": "" | ||
| 451 | }, { | ||
| 452 | "UserChannelID": "427", | ||
| 453 | "ChannelNo": "3000", | ||
| 454 | "ChannelName": "动画(测试)", | ||
| 455 | "ext": "" | ||
| 456 | }, { | ||
| 457 | "UserChannelID": "426", | ||
| 458 | "ChannelNo": "2999", | ||
| 459 | "ChannelName": "早教(测试)", | ||
| 460 | "ext": "" | ||
| 461 | }, { | ||
| 462 | "UserChannelID": "10", | ||
| 463 | "ChannelNo": "1478", | ||
| 464 | "ChannelName": "CCTV-9纪录(高清)", | ||
| 465 | "ext": "" | ||
| 466 | }, { | ||
| 467 | "UserChannelID": "429", | ||
| 468 | "ChannelNo": "3001", | ||
| 469 | "ChannelName": "鉴赏(测试)", | ||
| 470 | "ext": "" | ||
| 471 | }, { | ||
| 472 | "UserChannelID": "182", | ||
| 473 | "ChannelNo": "1094", | ||
| 474 | "ChannelName": "精彩导视", | ||
| 475 | "ext": "" | ||
| 476 | }, { | ||
| 477 | "UserChannelID": "428", | ||
| 478 | "ChannelNo": "3005", | ||
| 479 | "ChannelName": "好学生(测试)", | ||
| 480 | "ext": "" | ||
| 481 | }, { | ||
| 482 | "UserChannelID": "421", | ||
| 483 | "ChannelNo": "2994", | ||
| 484 | "ChannelName": "精选(测试)", | ||
| 485 | "ext": "" | ||
| 486 | }, { | ||
| 487 | "UserChannelID": "420", | ||
| 488 | "ChannelNo": "2995", | ||
| 489 | "ChannelName": "美人(测试)", | ||
| 490 | "ext": "" | ||
| 491 | }, { | ||
| 492 | "UserChannelID": "423", | ||
| 493 | "ChannelNo": "2996", | ||
| 494 | "ChannelName": "军事(测试)", | ||
| 495 | "ext": "" | ||
| 496 | }, { | ||
| 497 | "UserChannelID": "422", | ||
| 498 | "ChannelNo": "3039", | ||
| 499 | "ChannelName": "解密(测试)", | ||
| 500 | "ext": "" | ||
| 501 | }, { | ||
| 502 | "UserChannelID": "425", | ||
| 503 | "ChannelNo": "2998", | ||
| 504 | "ChannelName": "戏曲(测试)", | ||
| 505 | "ext": "" | ||
| 506 | }, { | ||
| 507 | "UserChannelID": "424", | ||
| 508 | "ChannelNo": "2997", | ||
| 509 | "ChannelName": "国学(测试)", | ||
| 510 | "ext": "" | ||
| 511 | }, { | ||
| 512 | "UserChannelID": "116", | ||
| 513 | "ChannelNo": "572965386", | ||
| 514 | "ChannelName": "世界地理HD", | ||
| 515 | "ext": "" | ||
| 516 | }, { | ||
| 517 | "UserChannelID": "79", | ||
| 518 | "ChannelNo": "1673", | ||
| 519 | "ChannelName": "CGTN中国国际电视台", | ||
| 520 | "ext": "" | ||
| 521 | }, { | ||
| 522 | "UserChannelID": "117", | ||
| 523 | "ChannelNo": "572965326", | ||
| 524 | "ChannelName": "女性时尚HD", | ||
| 525 | "ext": "" | ||
| 526 | }, { | ||
| 527 | "UserChannelID": "114", | ||
| 528 | "ChannelNo": "572965378", | ||
| 529 | "ChannelName": "风云音乐HD", | ||
| 530 | "ext": "" | ||
| 531 | }, { | ||
| 532 | "UserChannelID": "115", | ||
| 533 | "ChannelNo": "572964343", | ||
| 534 | "ChannelName": "第一剧场HD", | ||
| 535 | "ext": "" | ||
| 536 | }, { | ||
| 537 | "UserChannelID": "112", | ||
| 538 | "ChannelNo": "4353", | ||
| 539 | "ChannelName": "魅力足球HD", | ||
| 540 | "ext": "" | ||
| 541 | }, { | ||
| 542 | "UserChannelID": "113", | ||
| 543 | "ChannelNo": "576952605", | ||
| 544 | "ChannelName": "天元围棋HD", | ||
| 545 | "ext": "" | ||
| 546 | }, { | ||
| 547 | "UserChannelID": "110", | ||
| 548 | "ChannelNo": "4289", | ||
| 549 | "ChannelName": "游戏风云HD", | ||
| 550 | "ext": "" | ||
| 551 | }, { | ||
| 552 | "UserChannelID": "111", | ||
| 553 | "ChannelNo": "4290", | ||
| 554 | "ChannelName": "生活时尚HD", | ||
| 555 | "ext": "" | ||
| 556 | }, { | ||
| 557 | "UserChannelID": "118", | ||
| 558 | "ChannelNo": "572964340", | ||
| 559 | "ChannelName": "风云剧场HD", | ||
| 560 | "ext": "" | ||
| 561 | }, { | ||
| 562 | "UserChannelID": "119", | ||
| 563 | "ChannelNo": "572965329", | ||
| 564 | "ChannelName": "风云足球HD", | ||
| 565 | "ext": "" | ||
| 566 | }, { | ||
| 567 | "UserChannelID": "435", | ||
| 568 | "ChannelNo": "3008", | ||
| 569 | "ChannelName": "高网(测试)", | ||
| 570 | "ext": "" | ||
| 571 | }, { | ||
| 572 | "UserChannelID": "436", | ||
| 573 | "ChannelNo": "3009", | ||
| 574 | "ChannelName": "足球(测试)", | ||
| 575 | "ext": "" | ||
| 576 | }, { | ||
| 577 | "UserChannelID": "433", | ||
| 578 | "ChannelNo": "3010", | ||
| 579 | "ChannelName": "爱生活(测试)", | ||
| 580 | "ext": "" | ||
| 581 | }, { | ||
| 582 | "UserChannelID": "434", | ||
| 583 | "ChannelNo": "3007", | ||
| 584 | "ChannelName": "武术(测试)", | ||
| 585 | "ext": "" | ||
| 586 | }, { | ||
| 587 | "UserChannelID": "431", | ||
| 588 | "ChannelNo": "3003", | ||
| 589 | "ChannelName": "光影(测试)", | ||
| 590 | "ext": "" | ||
| 591 | }, { | ||
| 592 | "UserChannelID": "432", | ||
| 593 | "ChannelNo": "3004", | ||
| 594 | "ChannelName": "台球(测试)", | ||
| 595 | "ext": "" | ||
| 596 | }, { | ||
| 597 | "UserChannelID": "430", | ||
| 598 | "ChannelNo": "3002", | ||
| 599 | "ChannelName": "墨宝(测试)", | ||
| 600 | "ext": "" | ||
| 601 | }, { | ||
| 602 | "UserChannelID": "439", | ||
| 603 | "ChannelNo": "3012", | ||
| 604 | "ChannelName": "动作影院(测试)", | ||
| 605 | "ext": "" | ||
| 606 | }, { | ||
| 607 | "UserChannelID": "87", | ||
| 608 | "ChannelNo": "595279997", | ||
| 609 | "ChannelName": "先锋乒羽", | ||
| 610 | "ext": "" | ||
| 611 | }, { | ||
| 612 | "UserChannelID": "84", | ||
| 613 | "ChannelNo": "3793", | ||
| 614 | "ChannelName": "山东教育卫视.", | ||
| 615 | "ext": "" | ||
| 616 | }, { | ||
| 617 | "UserChannelID": "437", | ||
| 618 | "ChannelNo": "3006", | ||
| 619 | "ChannelName": "武侠剧场(测试)", | ||
| 620 | "ext": "" | ||
| 621 | }, { | ||
| 622 | "UserChannelID": "85", | ||
| 623 | "ChannelNo": "3813", | ||
| 624 | "ChannelName": "快乐垂钓(高清)", | ||
| 625 | "ext": "" | ||
| 626 | }, { | ||
| 627 | "UserChannelID": "438", | ||
| 628 | "ChannelNo": "3011", | ||
| 629 | "ChannelName": "喜剧影院(测试)", | ||
| 630 | "ext": "" | ||
| 631 | }, { | ||
| 632 | "UserChannelID": "67", | ||
| 633 | "ChannelNo": "1492", | ||
| 634 | "ChannelName": "嘉佳卡通.", | ||
| 635 | "ext": "" | ||
| 636 | }, { | ||
| 637 | "UserChannelID": "125", | ||
| 638 | "ChannelNo": "572964990", | ||
| 639 | "ChannelName": "央视文化精品HD", | ||
| 640 | "ext": "" | ||
| 641 | }, { | ||
| 642 | "UserChannelID": "66", | ||
| 643 | "ChannelNo": "1413", | ||
| 644 | "ChannelName": "金鹰卡通.", | ||
| 645 | "ext": "" | ||
| 646 | }, { | ||
| 647 | "UserChannelID": "126", | ||
| 648 | "ChannelNo": "572965325", | ||
| 649 | "ChannelName": "早期教育HD", | ||
| 650 | "ext": "" | ||
| 651 | }, { | ||
| 652 | "UserChannelID": "69", | ||
| 653 | "ChannelNo": "1441", | ||
| 654 | "ChannelName": "青海卫视.", | ||
| 655 | "ext": "" | ||
| 656 | }, { | ||
| 657 | "UserChannelID": "68", | ||
| 658 | "ChannelNo": "588989290", | ||
| 659 | "ChannelName": "陶瓷(高清)", | ||
| 660 | "ext": "" | ||
| 661 | }, { | ||
| 662 | "UserChannelID": "121", | ||
| 663 | "ChannelNo": "572965341", | ||
| 664 | "ChannelName": "兵器科技HD", | ||
| 665 | "ext": "" | ||
| 666 | }, { | ||
| 667 | "UserChannelID": "122", | ||
| 668 | "ChannelNo": "572964348", | ||
| 669 | "ChannelName": "央视台球HD", | ||
| 670 | "ext": "" | ||
| 671 | }, { | ||
| 672 | "UserChannelID": "123", | ||
| 673 | "ChannelNo": "572964980", | ||
| 674 | "ChannelName": "电视指南HD", | ||
| 675 | "ext": "" | ||
| 676 | }, { | ||
| 677 | "UserChannelID": "124", | ||
| 678 | "ChannelNo": "572965379", | ||
| 679 | "ChannelName": "高尔夫网球HD", | ||
| 680 | "ext": "" | ||
| 681 | }, { | ||
| 682 | "UserChannelID": "440", | ||
| 683 | "ChannelNo": "2979", | ||
| 684 | "ChannelName": "家庭影院(测试)", | ||
| 685 | "ext": "" | ||
| 686 | }, { | ||
| 687 | "UserChannelID": "441", | ||
| 688 | "ChannelNo": "3013", | ||
| 689 | "ChannelName": "星影(测试)", | ||
| 690 | "ext": "" | ||
| 691 | }, { | ||
| 692 | "UserChannelID": "442", | ||
| 693 | "ChannelNo": "3673", | ||
| 694 | "ChannelName": "爱上4K", | ||
| 695 | "ext": "" | ||
| 696 | }, { | ||
| 697 | "UserChannelID": "70", | ||
| 698 | "ChannelNo": "1440", | ||
| 699 | "ChannelName": "新疆卫视.", | ||
| 700 | "ext": "" | ||
| 701 | }, { | ||
| 702 | "UserChannelID": "71", | ||
| 703 | "ChannelNo": "1437", | ||
| 704 | "ChannelName": "西藏卫视.", | ||
| 705 | "ext": "" | ||
| 706 | }, { | ||
| 707 | "UserChannelID": "120", | ||
| 708 | "ChannelNo": "572965337", | ||
| 709 | "ChannelName": "怀旧剧场HD", | ||
| 710 | "ext": "" | ||
| 711 | }, { | ||
| 712 | "UserChannelID": "72", | ||
| 713 | "ChannelNo": "1597", | ||
| 714 | "ChannelName": "纪实(高清)", | ||
| 715 | "ext": "" | ||
| 716 | }, { | ||
| 717 | "UserChannelID": "59", | ||
| 718 | "ChannelNo": "512", | ||
| 719 | "ChannelName": "广东卫视(高清)", | ||
| 720 | "ext": "" | ||
| 721 | }, { | ||
| 722 | "UserChannelID": "58", | ||
| 723 | "ChannelNo": "1489", | ||
| 724 | "ChannelName": "湖南卫视(超高清)", | ||
| 725 | "ext": "" | ||
| 726 | }, { | ||
| 727 | "UserChannelID": "57", | ||
| 728 | "ChannelNo": "1439", | ||
| 729 | "ChannelName": "内蒙古卫视.", | ||
| 730 | "ext": "" | ||
| 731 | }, { | ||
| 732 | "UserChannelID": "56", | ||
| 733 | "ChannelNo": "1481", | ||
| 734 | "ChannelName": "辽宁卫视(高清)", | ||
| 735 | "ext": "" | ||
| 736 | }, { | ||
| 737 | "UserChannelID": "55", | ||
| 738 | "ChannelNo": "1446", | ||
| 739 | "ChannelName": "吉林卫视.", | ||
| 740 | "ext": "" | ||
| 741 | }, { | ||
| 742 | "UserChannelID": "64", | ||
| 743 | "ChannelNo": "589239514", | ||
| 744 | "ChannelName": "中华美食(高清)", | ||
| 745 | "ext": "" | ||
| 746 | }, { | ||
| 747 | "UserChannelID": "65", | ||
| 748 | "ChannelNo": "1432", | ||
| 749 | "ChannelName": "卡酷动画.", | ||
| 750 | "ext": "" | ||
| 751 | }, { | ||
| 752 | "UserChannelID": "62", | ||
| 753 | "ChannelNo": "1454", | ||
| 754 | "ChannelName": "宁夏卫视.", | ||
| 755 | "ext": "" | ||
| 756 | }, { | ||
| 757 | "UserChannelID": "63", | ||
| 758 | "ChannelNo": "1443", | ||
| 759 | "ChannelName": "甘肃卫视.", | ||
| 760 | "ext": "" | ||
| 761 | }, { | ||
| 762 | "UserChannelID": "60", | ||
| 763 | "ChannelNo": "1452", | ||
| 764 | "ChannelName": "河南卫视.", | ||
| 765 | "ext": "" | ||
| 766 | }, { | ||
| 767 | "UserChannelID": "61", | ||
| 768 | "ChannelNo": "3333", | ||
| 769 | "ChannelName": "河北卫视(高清)", | ||
| 770 | "ext": "" | ||
| 771 | }, { | ||
| 772 | "UserChannelID": "49", | ||
| 773 | "ChannelNo": "1438", | ||
| 774 | "ChannelName": "山西卫视.", | ||
| 775 | "ext": "" | ||
| 776 | }, { | ||
| 777 | "UserChannelID": "48", | ||
| 778 | "ChannelNo": "1480", | ||
| 779 | "ChannelName": "安徽卫视(超高清)", | ||
| 780 | "ext": "" | ||
| 781 | }, { | ||
| 782 | "UserChannelID": "145", | ||
| 783 | "ChannelNo": "1494", | ||
| 784 | "ChannelName": "财富天下.", | ||
| 785 | "ext": "" | ||
| 786 | }, { | ||
| 787 | "UserChannelID": "45", | ||
| 788 | "ChannelNo": "1672", | ||
| 789 | "ChannelName": "云南卫视.", | ||
| 790 | "ext": "" | ||
| 791 | }, { | ||
| 792 | "UserChannelID": "44", | ||
| 793 | "ChannelNo": "3352", | ||
| 794 | "ChannelName": "四川卫视(超高清)", | ||
| 795 | "ext": "" | ||
| 796 | }, { | ||
| 797 | "UserChannelID": "47", | ||
| 798 | "ChannelNo": "1488", | ||
| 799 | "ChannelName": "黑龙江卫视(超高清)", | ||
| 800 | "ext": "" | ||
| 801 | }, { | ||
| 802 | "UserChannelID": "46", | ||
| 803 | "ChannelNo": "1451", | ||
| 804 | "ChannelName": "广西卫视.", | ||
| 805 | "ext": "" | ||
| 806 | }, { | ||
| 807 | "UserChannelID": "51", | ||
| 808 | "ChannelNo": "1483", | ||
| 809 | "ChannelName": "湖北卫视(高清)", | ||
| 810 | "ext": "" | ||
| 811 | }, { | ||
| 812 | "UserChannelID": "52", | ||
| 813 | "ChannelNo": "4095", | ||
| 814 | "ChannelName": "海南卫视HD", | ||
| 815 | "ext": "" | ||
| 816 | }, { | ||
| 817 | "UserChannelID": "53", | ||
| 818 | "ChannelNo": "1448", | ||
| 819 | "ChannelName": "陕西卫视.", | ||
| 820 | "ext": "" | ||
| 821 | }, { | ||
| 822 | "UserChannelID": "54", | ||
| 823 | "ChannelNo": "3393", | ||
| 824 | "ChannelName": "东南卫视(超高清)", | ||
| 825 | "ext": "" | ||
| 826 | }, { | ||
| 827 | "UserChannelID": "50", | ||
| 828 | "ChannelNo": "3734", | ||
| 829 | "ChannelName": "江西卫视(超高清)", | ||
| 830 | "ext": "" | ||
| 831 | }, { | ||
| 832 | "UserChannelID": "1011", | ||
| 833 | "ChannelNo": "971", | ||
| 834 | "ChannelName": "直播室1", | ||
| 835 | "ext": "" | ||
| 836 | }, { | ||
| 837 | "UserChannelID": "109", | ||
| 838 | "ChannelNo": "588988872", | ||
| 839 | "ChannelName": "东方财经HD", | ||
| 840 | "ext": "" | ||
| 841 | }, { | ||
| 842 | "UserChannelID": "108", | ||
| 843 | "ChannelNo": "4288", | ||
| 844 | "ChannelName": "金色频道HD", | ||
| 845 | "ext": "" | ||
| 846 | }, { | ||
| 847 | "UserChannelID": "107", | ||
| 848 | "ChannelNo": "4282", | ||
| 849 | "ChannelName": "法治天地HD", | ||
| 850 | "ext": "" | ||
| 851 | }, { | ||
| 852 | "UserChannelID": "106", | ||
| 853 | "ChannelNo": "4283", | ||
| 854 | "ChannelName": "乐游HD", | ||
| 855 | "ext": "" | ||
| 856 | }, { | ||
| 857 | "UserChannelID": "105", | ||
| 858 | "ChannelNo": "4287", | ||
| 859 | "ChannelName": "动漫秀场HD", | ||
| 860 | "ext": "" | ||
| 861 | }, { | ||
| 862 | "UserChannelID": "104", | ||
| 863 | "ChannelNo": "4284", | ||
| 864 | "ChannelName": "都市剧场HD", | ||
| 865 | "ext": "" | ||
| 866 | }, { | ||
| 867 | "UserChannelID": "103", | ||
| 868 | "ChannelNo": "4286", | ||
| 869 | "ChannelName": "欢笑剧场4K", | ||
| 870 | "ext": "" | ||
| 871 | }, { | ||
| 872 | "UserChannelID": "102", | ||
| 873 | "ChannelNo": "3993", | ||
| 874 | "ChannelName": "中国交通", | ||
| 875 | "ext": "" | ||
| 876 | }, { | ||
| 877 | "UserChannelID": "101", | ||
| 878 | "ChannelNo": "3913", | ||
| 879 | "ChannelName": "CETV1(高清)", | ||
| 880 | "ext": "" | ||
| 881 | }, { | ||
| 882 | "UserChannelID": "100", | ||
| 883 | "ChannelNo": "3855", | ||
| 884 | "ChannelName": "CETV4", | ||
| 885 | "ext": "" | ||
| 886 | }, { | ||
| 887 | "UserChannelID": "97", | ||
| 888 | "ChannelNo": "4196", | ||
| 889 | "ChannelName": "求索纪录(4K)", | ||
| 890 | "ext": "" | ||
| 891 | }, { | ||
| 892 | "UserChannelID": "96", | ||
| 893 | "ChannelNo": "4195", | ||
| 894 | "ChannelName": "精彩影视(高清)", | ||
| 895 | "ext": "" | ||
| 896 | }, { | ||
| 897 | "UserChannelID": "95", | ||
| 898 | "ChannelNo": "4173", | ||
| 899 | "ChannelName": "CHC影迷电影(高清)", | ||
| 900 | "ext": "" | ||
| 901 | }, { | ||
| 902 | "UserChannelID": "94", | ||
| 903 | "ChannelNo": "4175", | ||
| 904 | "ChannelName": "CHC动作电影(高清)", | ||
| 905 | "ext": "" | ||
| 906 | }, { | ||
| 907 | "UserChannelID": "93", | ||
| 908 | "ChannelNo": "4174", | ||
| 909 | "ChannelName": "CHC家庭影院(高清)", | ||
| 910 | "ext": "" | ||
| 911 | }, { | ||
| 912 | "UserChannelID": "92", | ||
| 913 | "ChannelNo": "3933", | ||
| 914 | "ChannelName": "梨园", | ||
| 915 | "ext": "" | ||
| 916 | }, { | ||
| 917 | "UserChannelID": "91", | ||
| 918 | "ChannelNo": "3935", | ||
| 919 | "ChannelName": "书画", | ||
| 920 | "ext": "" | ||
| 921 | }, { | ||
| 922 | "UserChannelID": "90", | ||
| 923 | "ChannelNo": "3936", | ||
| 924 | "ChannelName": "茶频道(高清)", | ||
| 925 | "ext": "" | ||
| 926 | }, { | ||
| 927 | "UserChannelID": "88", | ||
| 928 | "ChannelNo": "595280747", | ||
| 929 | "ChannelName": "武术世界(高清)", | ||
| 930 | "ext": "" | ||
| 931 | }, { | ||
| 932 | "UserChannelID": "89", | ||
| 933 | "ChannelNo": "595278931", | ||
| 934 | "ChannelName": "文物宝库(高清)", | ||
| 935 | "ext": "" | ||
| 936 | }, { | ||
| 937 | "UserChannelID": "240", | ||
| 938 | "ChannelNo": "1463", | ||
| 939 | "ChannelName": "四川卫视.", | ||
| 940 | "ext": "" | ||
| 941 | }, { | ||
| 942 | "UserChannelID": "241", | ||
| 943 | "ChannelNo": "1461", | ||
| 944 | "ChannelName": "辽宁卫视.", | ||
| 945 | "ext": "" | ||
| 946 | }, { | ||
| 947 | "UserChannelID": "245", | ||
| 948 | "ChannelNo": "1457", | ||
| 949 | "ChannelName": "河北卫视.", | ||
| 950 | "ext": "" | ||
| 951 | }, { | ||
| 952 | "UserChannelID": "244", | ||
| 953 | "ChannelNo": "1444", | ||
| 954 | "ChannelName": "湖北卫视.", | ||
| 955 | "ext": "" | ||
| 956 | }, { | ||
| 957 | "UserChannelID": "243", | ||
| 958 | "ChannelNo": "1456", | ||
| 959 | "ChannelName": "贵州卫视.", | ||
| 960 | "ext": "" | ||
| 961 | }, { | ||
| 962 | "UserChannelID": "242", | ||
| 963 | "ChannelNo": "1458", | ||
| 964 | "ChannelName": "黑龙江卫视.", | ||
| 965 | "ext": "" | ||
| 966 | }, { | ||
| 967 | "UserChannelID": "246", | ||
| 968 | "ChannelNo": "1455", | ||
| 969 | "ChannelName": "东南卫视.", | ||
| 970 | "ext": "" | ||
| 971 | }, { | ||
| 972 | "UserChannelID": "230", | ||
| 973 | "ChannelNo": "1465", | ||
| 974 | "ChannelName": "江苏卫视.", | ||
| 975 | "ext": "" | ||
| 976 | }, { | ||
| 977 | "UserChannelID": "1037", | ||
| 978 | "ChannelNo": "595282174", | ||
| 979 | "ChannelName": "游戏竞技频道2", | ||
| 980 | "ext": "" | ||
| 981 | }, { | ||
| 982 | "UserChannelID": "1036", | ||
| 983 | "ChannelNo": "3474", | ||
| 984 | "ChannelName": "直播室221", | ||
| 985 | "ext": "" | ||
| 986 | }, { | ||
| 987 | "UserChannelID": "239", | ||
| 988 | "ChannelNo": "1445", | ||
| 989 | "ChannelName": "天津卫视.", | ||
| 990 | "ext": "" | ||
| 991 | }, { | ||
| 992 | "UserChannelID": "232", | ||
| 993 | "ChannelNo": "1459", | ||
| 994 | "ChannelName": "东方卫视.", | ||
| 995 | "ext": "" | ||
| 996 | }, { | ||
| 997 | "UserChannelID": "231", | ||
| 998 | "ChannelNo": "1466", | ||
| 999 | "ChannelName": "湖南卫视.", | ||
| 1000 | "ext": "" | ||
| 1001 | }, { | ||
| 1002 | "UserChannelID": "234", | ||
| 1003 | "ChannelNo": "1412", | ||
| 1004 | "ChannelName": "浙江卫视.", | ||
| 1005 | "ext": "" | ||
| 1006 | }, { | ||
| 1007 | "UserChannelID": "233", | ||
| 1008 | "ChannelNo": "1464", | ||
| 1009 | "ChannelName": "北京卫视.", | ||
| 1010 | "ext": "" | ||
| 1011 | }, { | ||
| 1012 | "UserChannelID": "236", | ||
| 1013 | "ChannelNo": "1460", | ||
| 1014 | "ChannelName": "安徽卫视.", | ||
| 1015 | "ext": "" | ||
| 1016 | }, { | ||
| 1017 | "UserChannelID": "235", | ||
| 1018 | "ChannelNo": "1433", | ||
| 1019 | "ChannelName": "深圳卫视.", | ||
| 1020 | "ext": "" | ||
| 1021 | }, { | ||
| 1022 | "UserChannelID": "238", | ||
| 1023 | "ChannelNo": "1447", | ||
| 1024 | "ChannelName": "广东卫视.", | ||
| 1025 | "ext": "" | ||
| 1026 | }, { | ||
| 1027 | "UserChannelID": "237", | ||
| 1028 | "ChannelNo": "1442", | ||
| 1029 | "ChannelName": "山东卫视.", | ||
| 1030 | "ext": "" | ||
| 1031 | }, { | ||
| 1032 | "UserChannelID": "2025", | ||
| 1033 | "ChannelNo": "4375", | ||
| 1034 | "ChannelName": "云阳慢直播", | ||
| 1035 | "ext": "" | ||
| 1036 | }, { | ||
| 1037 | "UserChannelID": "2024", | ||
| 1038 | "ChannelNo": "4134", | ||
| 1039 | "ChannelName": "2024测试", | ||
| 1040 | "ext": "" | ||
| 1041 | }, { | ||
| 1042 | "UserChannelID": "1017", | ||
| 1043 | "ChannelNo": "977", | ||
| 1044 | "ChannelName": "直播室7", | ||
| 1045 | "ext": "" | ||
| 1046 | }, { | ||
| 1047 | "UserChannelID": "1016", | ||
| 1048 | "ChannelNo": "976", | ||
| 1049 | "ChannelName": "直播室6", | ||
| 1050 | "ext": "" | ||
| 1051 | }, { | ||
| 1052 | "UserChannelID": "1013", | ||
| 1053 | "ChannelNo": "973", | ||
| 1054 | "ChannelName": "直播室3", | ||
| 1055 | "ext": "" | ||
| 1056 | }, { | ||
| 1057 | "UserChannelID": "1012", | ||
| 1058 | "ChannelNo": "972", | ||
| 1059 | "ChannelName": "直播室2", | ||
| 1060 | "ext": "" | ||
| 1061 | }, { | ||
| 1062 | "UserChannelID": "1015", | ||
| 1063 | "ChannelNo": "975", | ||
| 1064 | "ChannelName": "直播室5", | ||
| 1065 | "ext": "" | ||
| 1066 | }, { | ||
| 1067 | "UserChannelID": "1014", | ||
| 1068 | "ChannelNo": "974", | ||
| 1069 | "ChannelName": "直播室4", | ||
| 1070 | "ext": "" | ||
| 1071 | }] | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | package com.android.smart.terminal.iptv.aidl; | ||
| 2 | |||
| 3 | import android.os.Binder; | ||
| 4 | import android.os.IBinder; | ||
| 5 | import android.os.IInterface; | ||
| 6 | import android.os.Parcel; | ||
| 7 | import android.os.RemoteException; | ||
| 8 | //aidl接口 | ||
| 9 | public interface IServiceCfg extends IInterface { | ||
| 10 | |||
| 11 | boolean getBoolean(String key, boolean defValue) throws RemoteException; | ||
| 12 | int getInt(String key, int defValue) throws RemoteException; | ||
| 13 | String getString(String key, String defValue) throws RemoteException; | ||
| 14 | boolean putBoolean(String key, boolean value) throws RemoteException; | ||
| 15 | boolean putInt(String key, int value) throws RemoteException; | ||
| 16 | boolean putString(String key, String value) throws RemoteException; | ||
| 17 | |||
| 18 | abstract class Stub extends Binder implements IServiceCfg { | ||
| 19 | |||
| 20 | private static final String DESCRIPTOR = "com.android.smart.terminal.iptv.aidl.IServiceCfg"; | ||
| 21 | static final int TRANSACTION_getBoolean = 6; | ||
| 22 | static final int TRANSACTION_getInt = 5; | ||
| 23 | static final int TRANSACTION_getString = 4; | ||
| 24 | static final int TRANSACTION_putBoolean = 3; | ||
| 25 | static final int TRANSACTION_putInt = 2; | ||
| 26 | static final int TRANSACTION_putString = 1; | ||
| 27 | |||
| 28 | public Stub() { | ||
| 29 | this.attachInterface(this, DESCRIPTOR); | ||
| 30 | } | ||
| 31 | |||
| 32 | @Override | ||
| 33 | public IBinder asBinder() { | ||
| 34 | return this; | ||
| 35 | } | ||
| 36 | |||
| 37 | public static IServiceCfg asInterface(IBinder obj) { | ||
| 38 | if (obj == null) return null; | ||
| 39 | IInterface iin = obj.queryLocalInterface(DESCRIPTOR); | ||
| 40 | return (iin instanceof IServiceCfg) ? (IServiceCfg) iin : new Proxy(obj); | ||
| 41 | } | ||
| 42 | |||
| 43 | @Override | ||
| 44 | public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { | ||
| 45 | switch (code) { | ||
| 46 | case TRANSACTION_putString: | ||
| 47 | data.enforceInterface(DESCRIPTOR); | ||
| 48 | boolean resultPutString = putString(data.readString(), data.readString()); | ||
| 49 | reply.writeNoException(); | ||
| 50 | reply.writeInt(resultPutString ? 1 : 0); | ||
| 51 | return true; | ||
| 52 | |||
| 53 | case TRANSACTION_putInt: | ||
| 54 | data.enforceInterface(DESCRIPTOR); | ||
| 55 | boolean resultPutInt = putInt(data.readString(), data.readInt()); | ||
| 56 | reply.writeNoException(); | ||
| 57 | reply.writeInt(resultPutInt ? 1 : 0); | ||
| 58 | return true; | ||
| 59 | |||
| 60 | case TRANSACTION_putBoolean: | ||
| 61 | data.enforceInterface(DESCRIPTOR); | ||
| 62 | boolean resultPutBoolean = putBoolean(data.readString(), data.readInt() != 0); | ||
| 63 | reply.writeNoException(); | ||
| 64 | reply.writeInt(resultPutBoolean ? 1 : 0); | ||
| 65 | return true; | ||
| 66 | |||
| 67 | case TRANSACTION_getString: | ||
| 68 | data.enforceInterface(DESCRIPTOR); | ||
| 69 | String resultGetString = getString(data.readString(), data.readString()); | ||
| 70 | reply.writeNoException(); | ||
| 71 | reply.writeString(resultGetString); | ||
| 72 | return true; | ||
| 73 | |||
| 74 | case TRANSACTION_getInt: | ||
| 75 | data.enforceInterface(DESCRIPTOR); | ||
| 76 | int resultGetInt = getInt(data.readString(), data.readInt()); | ||
| 77 | reply.writeNoException(); | ||
| 78 | reply.writeInt(resultGetInt); | ||
| 79 | return true; | ||
| 80 | |||
| 81 | case TRANSACTION_getBoolean: | ||
| 82 | data.enforceInterface(DESCRIPTOR); | ||
| 83 | boolean resultGetBoolean = getBoolean(data.readString(), data.readInt() != 0); | ||
| 84 | reply.writeNoException(); | ||
| 85 | reply.writeInt(resultGetBoolean ? 1 : 0); | ||
| 86 | return true; | ||
| 87 | |||
| 88 | case 1598968902: // Interface descriptor | ||
| 89 | reply.writeString(DESCRIPTOR); | ||
| 90 | return true; | ||
| 91 | |||
| 92 | default: | ||
| 93 | return super.onTransact(code, data, reply, flags); | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | private static class Proxy implements IServiceCfg { | ||
| 98 | private final IBinder mRemote; | ||
| 99 | |||
| 100 | Proxy(IBinder remote) { | ||
| 101 | mRemote = remote; | ||
| 102 | } | ||
| 103 | |||
| 104 | @Override | ||
| 105 | public IBinder asBinder() { | ||
| 106 | return mRemote; | ||
| 107 | } | ||
| 108 | |||
| 109 | @Override | ||
| 110 | public boolean getBoolean(String key, boolean defValue) throws RemoteException { | ||
| 111 | Parcel data = Parcel.obtain(); | ||
| 112 | Parcel reply = Parcel.obtain(); | ||
| 113 | boolean result; | ||
| 114 | try { | ||
| 115 | data.writeInterfaceToken(DESCRIPTOR); | ||
| 116 | data.writeString(key); | ||
| 117 | data.writeInt(defValue ? 1 : 0); | ||
| 118 | mRemote.transact(TRANSACTION_getBoolean, data, reply, 0); | ||
| 119 | reply.readException(); | ||
| 120 | result = reply.readInt() != 0; | ||
| 121 | } finally { | ||
| 122 | reply.recycle(); | ||
| 123 | data.recycle(); | ||
| 124 | } | ||
| 125 | return result; | ||
| 126 | } | ||
| 127 | |||
| 128 | @Override | ||
| 129 | public int getInt(String key, int defValue) throws RemoteException { | ||
| 130 | Parcel data = Parcel.obtain(); | ||
| 131 | Parcel reply = Parcel.obtain(); | ||
| 132 | int result; | ||
| 133 | try { | ||
| 134 | data.writeInterfaceToken(DESCRIPTOR); | ||
| 135 | data.writeString(key); | ||
| 136 | data.writeInt(defValue); | ||
| 137 | mRemote.transact(TRANSACTION_getInt, data, reply, 0); | ||
| 138 | reply.readException(); | ||
| 139 | result = reply.readInt(); | ||
| 140 | } finally { | ||
| 141 | reply.recycle(); | ||
| 142 | data.recycle(); | ||
| 143 | } | ||
| 144 | return result; | ||
| 145 | } | ||
| 146 | |||
| 147 | @Override | ||
| 148 | public String getString(String key, String defValue) throws RemoteException { | ||
| 149 | Parcel data = Parcel.obtain(); | ||
| 150 | Parcel reply = Parcel.obtain(); | ||
| 151 | String result; | ||
| 152 | try { | ||
| 153 | data.writeInterfaceToken(DESCRIPTOR); | ||
| 154 | data.writeString(key); | ||
| 155 | data.writeString(defValue); | ||
| 156 | mRemote.transact(TRANSACTION_getString, data, reply, 0); | ||
| 157 | reply.readException(); | ||
| 158 | result = reply.readString(); | ||
| 159 | } finally { | ||
| 160 | reply.recycle(); | ||
| 161 | data.recycle(); | ||
| 162 | } | ||
| 163 | return result; | ||
| 164 | } | ||
| 165 | |||
| 166 | @Override | ||
| 167 | public boolean putBoolean(String key, boolean value) throws RemoteException { | ||
| 168 | Parcel data = Parcel.obtain(); | ||
| 169 | Parcel reply = Parcel.obtain(); | ||
| 170 | boolean result; | ||
| 171 | try { | ||
| 172 | data.writeInterfaceToken(DESCRIPTOR); | ||
| 173 | data.writeString(key); | ||
| 174 | data.writeInt(value ? 1 : 0); | ||
| 175 | mRemote.transact(TRANSACTION_putBoolean, data, reply, 0); | ||
| 176 | reply.readException(); | ||
| 177 | result = reply.readInt() != 0; | ||
| 178 | } finally { | ||
| 179 | reply.recycle(); | ||
| 180 | data.recycle(); | ||
| 181 | } | ||
| 182 | return result; | ||
| 183 | } | ||
| 184 | |||
| 185 | @Override | ||
| 186 | public boolean putInt(String key, int value) throws RemoteException { | ||
| 187 | Parcel data = Parcel.obtain(); | ||
| 188 | Parcel reply = Parcel.obtain(); | ||
| 189 | boolean result; | ||
| 190 | try { | ||
| 191 | data.writeInterfaceToken(DESCRIPTOR); | ||
| 192 | data.writeString(key); | ||
| 193 | data.writeInt(value); | ||
| 194 | mRemote.transact(TRANSACTION_putInt, data, reply, 0); | ||
| 195 | reply.readException(); | ||
| 196 | result = reply.readInt() != 0; | ||
| 197 | } finally { | ||
| 198 | reply.recycle(); | ||
| 199 | data.recycle(); | ||
| 200 | } | ||
| 201 | return result; | ||
| 202 | } | ||
| 203 | |||
| 204 | @Override | ||
| 205 | public boolean putString(String key, String value) throws RemoteException { | ||
| 206 | Parcel data = Parcel.obtain(); | ||
| 207 | Parcel reply = Parcel.obtain(); | ||
| 208 | boolean result; | ||
| 209 | try { | ||
| 210 | data.writeInterfaceToken(DESCRIPTOR); | ||
| 211 | data.writeString(key); | ||
| 212 | data.writeString(value); | ||
| 213 | mRemote.transact(TRANSACTION_putString, data, reply, 0); | ||
| 214 | reply.readException(); | ||
| 215 | result = reply.readInt() != 0; | ||
| 216 | } finally { | ||
| 217 | reply.recycle(); | ||
| 218 | data.recycle(); | ||
| 219 | } | ||
| 220 | return result; | ||
| 221 | } | ||
| 222 | } | ||
| 223 | } | ||
| 224 | } |
| 1 | package com.android.smart.terminal.iptv.aidl; | ||
| 2 | |||
| 3 | import android.app.Service; | ||
| 4 | import android.content.Intent; | ||
| 5 | import android.os.IBinder; | ||
| 6 | import android.os.RemoteException; | ||
| 7 | import android.text.TextUtils; | ||
| 8 | import android.util.Log; | ||
| 9 | import org.json.JSONArray; | ||
| 10 | import org.json.JSONException; | ||
| 11 | import org.json.JSONObject; | ||
| 12 | import com.android.smart.terminal.iptv.aidl.IServiceCfg.Stub; | ||
| 13 | import com.topdraw.iptvlaunchertest.IptvConfig; | ||
| 14 | import com.topdraw.iptvlaunchertest.TestConfig; | ||
| 15 | |||
| 16 | public class ServiceCfg extends Service { | ||
| 17 | private static final String TAG = "ServiceCfg"; | ||
| 18 | private final Stub mBinder; | ||
| 19 | private IptvConfig mConfig; | ||
| 20 | |||
| 21 | public ServiceCfg() { | ||
| 22 | this.mConfig = null; | ||
| 23 | this.mBinder = new Stub() { | ||
| 24 | @Override | ||
| 25 | public boolean getBoolean(String key, boolean defValue) throws RemoteException { | ||
| 26 | Log.d(TAG, "getBoolean() key = " + key + ", defValue = " + defValue); | ||
| 27 | return defValue; | ||
| 28 | } | ||
| 29 | |||
| 30 | @Override | ||
| 31 | public int getInt(String key, int defValue) throws RemoteException { | ||
| 32 | Log.d(TAG, "getInt() key = " + key + ", defValue = " + defValue); | ||
| 33 | return defValue; | ||
| 34 | } | ||
| 35 | |||
| 36 | @Override | ||
| 37 | public String getString(String key, String defValue) throws RemoteException { | ||
| 38 | String value = defValue; | ||
| 39 | if (TextUtils.isEmpty(key)) { | ||
| 40 | return value; | ||
| 41 | } | ||
| 42 | |||
| 43 | switch (key.toLowerCase()) { | ||
| 44 | case "service/serviceinfo/iptvauthurl": | ||
| 45 | value = mConfig.getAuthAddress(); | ||
| 46 | break; | ||
| 47 | case "service/serviceinfo/iptvaccount": | ||
| 48 | case "service/serviceinfo/userid": | ||
| 49 | value = mConfig.getBusinessUserId(); | ||
| 50 | break; | ||
| 51 | case "service/serviceinfo/iptvpassword": | ||
| 52 | value = mConfig.getBusinessPasswd(); | ||
| 53 | break; | ||
| 54 | case "service/serviceinfo/stbid": | ||
| 55 | value = mConfig.getStbID(); | ||
| 56 | break; | ||
| 57 | case "service/serviceinfo/usertoken": | ||
| 58 | value = mConfig.getValue("usertoken"); | ||
| 59 | break; | ||
| 60 | case "service/serviceinfo/epgdomain": | ||
| 61 | case "service/serviceinfo/epginfo": | ||
| 62 | value = mConfig.getValue("epgdomain"); | ||
| 63 | break; | ||
| 64 | case "service/serviceinfo/epggroupnmb": | ||
| 65 | value = mConfig.getEPGGroupNMB(); | ||
| 66 | break; | ||
| 67 | case "service/serviceinfo/usergroupnmb": | ||
| 68 | value = mConfig.getUserGroupNMB(); | ||
| 69 | break; | ||
| 70 | case "service/serviceinfo/productmodel": | ||
| 71 | case "service/serviceinfo/terminaltype": | ||
| 72 | value = IptvConfig.getStbType(); | ||
| 73 | break; | ||
| 74 | case "service/serviceinfo/areaid": | ||
| 75 | value = mConfig.getValue("areaid"); | ||
| 76 | break; | ||
| 77 | case "service/serviceinfo/countyid": | ||
| 78 | value = mConfig.getValue("countyid"); | ||
| 79 | break; | ||
| 80 | case "service/serviceinfo/romversion": | ||
| 81 | case "service/serviceinfo/terminalversion": | ||
| 82 | value = IptvConfig.getSoftVersion(); | ||
| 83 | break; | ||
| 84 | case "service/serviceinfo/platforminfo": | ||
| 85 | value = getPlatform(); | ||
| 86 | break; | ||
| 87 | case "service/serviceinfo/manufacturerinfo": | ||
| 88 | value = "Fiberhome"; | ||
| 89 | break; | ||
| 90 | case "service/serviceinfo/mac": | ||
| 91 | value = mConfig.getMac(); | ||
| 92 | break; | ||
| 93 | case "service/serviceinfo/livechannels": | ||
| 94 | value = mConfig.getValue("livechannels"); | ||
| 95 | break; | ||
| 96 | case "service/serviceinfo/stbhdflag": | ||
| 97 | value = "HD"; | ||
| 98 | break; | ||
| 99 | case "service/serviceinfo/adshowstatus": | ||
| 100 | value = getADShowStatus(); | ||
| 101 | break; | ||
| 102 | case "service/serviceinfo/iptvstate": | ||
| 103 | value = mConfig.getIPTVState(); | ||
| 104 | break; | ||
| 105 | case "service/serviceinfo/ottcp": | ||
| 106 | value = mConfig.getOttCp(); | ||
| 107 | break; | ||
| 108 | default: | ||
| 109 | Log.e(TAG, "getString() unknown key = " + key); | ||
| 110 | break; | ||
| 111 | } | ||
| 112 | |||
| 113 | Log.d(TAG, "getString() key = " + key + ", value = " + value); | ||
| 114 | return value; | ||
| 115 | } | ||
| 116 | |||
| 117 | @Override | ||
| 118 | public boolean putBoolean(String key, boolean value) throws RemoteException { | ||
| 119 | Log.d(TAG, "putBoolean() key = " + key + ", value = " + value); | ||
| 120 | return false; | ||
| 121 | } | ||
| 122 | |||
| 123 | @Override | ||
| 124 | public boolean putInt(String key, int value) throws RemoteException { | ||
| 125 | Log.d(TAG, "putInt() key = " + key + ", value = " + value); | ||
| 126 | return false; | ||
| 127 | } | ||
| 128 | |||
| 129 | @Override | ||
| 130 | public boolean putString(String key, String value) throws RemoteException { | ||
| 131 | Log.d(TAG, "putString() key = " + key + ", value = " + value); | ||
| 132 | return false; | ||
| 133 | } | ||
| 134 | }; | ||
| 135 | } | ||
| 136 | |||
| 137 | private String getADShowStatus() { | ||
| 138 | boolean logoStatus = false; | ||
| 139 | boolean anmiStatus = false; | ||
| 140 | boolean authStatus = false; | ||
| 141 | |||
| 142 | try { | ||
| 143 | JSONObject jsonData = new JSONObject(); | ||
| 144 | JSONArray arrayName = new JSONArray(); | ||
| 145 | JSONArray arrayValue = new JSONArray(); | ||
| 146 | |||
| 147 | arrayName.put("logo"); | ||
| 148 | arrayValue.put(logoStatus ? "1" : "2"); | ||
| 149 | |||
| 150 | arrayName.put("anmi"); | ||
| 151 | arrayValue.put(anmiStatus ? "1" : "2"); | ||
| 152 | |||
| 153 | arrayName.put("auth"); | ||
| 154 | arrayValue.put(authStatus ? "1" : "2"); | ||
| 155 | |||
| 156 | jsonData.put("adtype", arrayName); | ||
| 157 | jsonData.put("advalue", arrayValue); | ||
| 158 | |||
| 159 | String status = jsonData.toString(); | ||
| 160 | Log.d(TAG, "getADShowStatus() status = " + status); | ||
| 161 | return status; | ||
| 162 | } catch (JSONException e) { | ||
| 163 | Log.e(TAG, "getADShowStatus() failed to generate JSON", e); | ||
| 164 | return null; | ||
| 165 | } | ||
| 166 | } | ||
| 167 | |||
| 168 | private String getPlatform() { | ||
| 169 | Log.d(TAG, "getPlatform() platform = " + TestConfig.platform); | ||
| 170 | return TestConfig.platform; | ||
| 171 | } | ||
| 172 | |||
| 173 | @Override | ||
| 174 | public IBinder onBind(Intent intent) { | ||
| 175 | Log.d(TAG, "service on bind"); | ||
| 176 | return mBinder; | ||
| 177 | } | ||
| 178 | |||
| 179 | @Override | ||
| 180 | public void onCreate() { | ||
| 181 | super.onCreate(); | ||
| 182 | Log.d(TAG, "onCreate"); | ||
| 183 | mConfig = IptvConfig.getInstance(this); | ||
| 184 | } | ||
| 185 | |||
| 186 | @Override | ||
| 187 | public void onDestroy() { | ||
| 188 | super.onDestroy(); | ||
| 189 | Log.d(TAG, "onDestroy"); | ||
| 190 | } | ||
| 191 | |||
| 192 | @Override | ||
| 193 | public void onRebind(Intent intent) { | ||
| 194 | Log.d(TAG, "service on rebind"); | ||
| 195 | super.onRebind(intent); | ||
| 196 | } | ||
| 197 | |||
| 198 | @Override | ||
| 199 | public void onStart(Intent intent, int startId) { | ||
| 200 | Log.d(TAG, "service start id=" + startId); | ||
| 201 | } | ||
| 202 | |||
| 203 | @Override | ||
| 204 | public boolean onUnbind(Intent intent) { | ||
| 205 | Log.d(TAG, "service on unbind"); | ||
| 206 | return super.onUnbind(intent); | ||
| 207 | } | ||
| 208 | } |
| 1 | package com.topdraw.iptvlaunchertest; | ||
| 2 | |||
| 3 | import android.content.Context; | ||
| 4 | import android.util.Log; | ||
| 5 | import com.topdraw.iptvlaunchertest.common.JsonReader; | ||
| 6 | import org.json.JSONArray; | ||
| 7 | import org.json.JSONObject; | ||
| 8 | import java.util.HashMap; | ||
| 9 | import java.util.Iterator; | ||
| 10 | import java.util.Map; | ||
| 11 | |||
| 12 | /** | ||
| 13 | * iptv 参数 | ||
| 14 | */ | ||
| 15 | public class IptvConfig { | ||
| 16 | private static final String TAG = IptvConfig.class.getSimpleName(); | ||
| 17 | private static final Map<String,String> iptvConfigMap = new HashMap<>(); | ||
| 18 | private static volatile IptvConfig instance = null; | ||
| 19 | |||
| 20 | public static final String IPTV_AUTH_URL = "iptvauthurl"; | ||
| 21 | public static final String IPTV_ACCOUNT = "iptvaccount"; | ||
| 22 | public static final String USER_ID = "userid"; | ||
| 23 | public static final String IPTV_PASSWORD = "iptvpassword"; | ||
| 24 | public static final String STB_ID = "stbid"; | ||
| 25 | public static final String USER_TOEKN = "usertoken"; | ||
| 26 | public static final String EPG_DOMAIN = "epgdomain"; | ||
| 27 | public static final String EPG_INFO = "epginfo"; | ||
| 28 | public static final String EPG_GROUP_NMB = "epggroupnmb"; | ||
| 29 | public static final String USER_GROUP_NMB = "usergroupnmb"; | ||
| 30 | public static final String PRODUCT_MODEL = "productmodel"; | ||
| 31 | public static final String TERMINAL_TYPE = "terminaltype"; | ||
| 32 | public static final String AREA_ID = "areaid"; | ||
| 33 | public static final String COUNTY_ID = "countyid"; | ||
| 34 | public static final String ROM_VERSION = "romversion"; | ||
| 35 | public static final String TERMINAL_VERSION = "terminalversion"; | ||
| 36 | public static final String MAC = "mac"; | ||
| 37 | public static final String IPTV_STATE = "iptvstate"; | ||
| 38 | public static final String OT_TCP = "ottcp"; | ||
| 39 | public static final String LIVE_CHANNELS = "LiveChannels"; | ||
| 40 | |||
| 41 | private IptvConfig(Context context){ | ||
| 42 | JSONObject param = JsonReader.readJsonFromAssets(context,"iptv_param.json"); | ||
| 43 | JSONArray channels = JsonReader.readJsonArrFromAssets(context,"livechannels.json"); | ||
| 44 | Log.d(TAG, "IptvConfig param:"+param.toString()); | ||
| 45 | Log.d(TAG, "IptvConfig channels:"+channels.toString()); | ||
| 46 | for (Iterator<String> it = param.keys(); it.hasNext(); ) { | ||
| 47 | String key = it.next(); | ||
| 48 | iptvConfigMap.put(key,param.optString(key,"")); | ||
| 49 | } | ||
| 50 | iptvConfigMap.put("LiveChannels",channels.toString()); | ||
| 51 | } | ||
| 52 | |||
| 53 | public static IptvConfig getInstance(Context context) { | ||
| 54 | if(instance == null){ | ||
| 55 | synchronized (IptvConfig.class){ | ||
| 56 | if(instance==null){ | ||
| 57 | instance = new IptvConfig(context); | ||
| 58 | } | ||
| 59 | } | ||
| 60 | } | ||
| 61 | return instance; | ||
| 62 | } | ||
| 63 | |||
| 64 | public static String getStbType() { | ||
| 65 | return TestConfig.stbType; | ||
| 66 | } | ||
| 67 | |||
| 68 | public static String getSoftVersion() { | ||
| 69 | return "1"; | ||
| 70 | } | ||
| 71 | |||
| 72 | public String getAuthAddress() { | ||
| 73 | return iptvConfigMap.get(IPTV_AUTH_URL); | ||
| 74 | } | ||
| 75 | |||
| 76 | public String getBusinessUserId() { | ||
| 77 | return iptvConfigMap.get(IPTV_ACCOUNT); | ||
| 78 | } | ||
| 79 | |||
| 80 | public String getBusinessPasswd() { | ||
| 81 | return iptvConfigMap.get(IPTV_PASSWORD); | ||
| 82 | } | ||
| 83 | |||
| 84 | public String getStbID() { | ||
| 85 | return iptvConfigMap.get(STB_ID); | ||
| 86 | } | ||
| 87 | |||
| 88 | public String getValue(String key) { | ||
| 89 | return iptvConfigMap.get(key); | ||
| 90 | } | ||
| 91 | |||
| 92 | public String getEPGGroupNMB() { | ||
| 93 | return iptvConfigMap.get(EPG_GROUP_NMB); | ||
| 94 | } | ||
| 95 | |||
| 96 | public String getUserGroupNMB() { | ||
| 97 | return iptvConfigMap.get(USER_GROUP_NMB); | ||
| 98 | } | ||
| 99 | |||
| 100 | public String getMac() { | ||
| 101 | return iptvConfigMap.get(MAC); | ||
| 102 | } | ||
| 103 | |||
| 104 | public String getIPTVState() { | ||
| 105 | return iptvConfigMap.get(IPTV_STATE); | ||
| 106 | } | ||
| 107 | |||
| 108 | public String getOttCp() { | ||
| 109 | return iptvConfigMap.get(OT_TCP); | ||
| 110 | } | ||
| 111 | } |
| 1 | package com.topdraw.iptvlaunchertest; | 1 | package com.topdraw.iptvlaunchertest; |
| 2 | 2 | ||
| 3 | import android.Manifest; | 3 | import android.Manifest; |
| 4 | import android.content.Intent; | ||
| 4 | import android.os.Build; | 5 | import android.os.Build; |
| 5 | import android.os.Bundle; | 6 | import android.os.Bundle; |
| 6 | import android.webkit.WebSettings; | 7 | import android.webkit.WebSettings; |
| ... | @@ -12,6 +13,9 @@ import androidx.core.graphics.Insets; | ... | @@ -12,6 +13,9 @@ import androidx.core.graphics.Insets; |
| 12 | import androidx.core.view.ViewCompat; | 13 | import androidx.core.view.ViewCompat; |
| 13 | import androidx.core.view.WindowInsetsCompat; | 14 | import androidx.core.view.WindowInsetsCompat; |
| 14 | 15 | ||
| 16 | import com.android.smart.terminal.iptv.aidl.ServiceCfg; | ||
| 17 | import com.topdraw.iptvlaunchertest.common.Authentication; | ||
| 18 | |||
| 15 | public class MainActivity extends AppCompatActivity { | 19 | public class MainActivity extends AppCompatActivity { |
| 16 | private WebView webView; | 20 | private WebView webView; |
| 17 | 21 | ||
| ... | @@ -23,6 +27,7 @@ public class MainActivity extends AppCompatActivity { | ... | @@ -23,6 +27,7 @@ public class MainActivity extends AppCompatActivity { |
| 23 | @Override | 27 | @Override |
| 24 | protected void onCreate(Bundle savedInstanceState) { | 28 | protected void onCreate(Bundle savedInstanceState) { |
| 25 | super.onCreate(savedInstanceState); | 29 | super.onCreate(savedInstanceState); |
| 30 | startService(new Intent(this, ServiceCfg.class)); | ||
| 26 | EdgeToEdge.enable(this); | 31 | EdgeToEdge.enable(this); |
| 27 | setContentView(R.layout.activity_main); | 32 | setContentView(R.layout.activity_main); |
| 28 | ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { | 33 | ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { |
| ... | @@ -32,10 +37,10 @@ public class MainActivity extends AppCompatActivity { | ... | @@ -32,10 +37,10 @@ public class MainActivity extends AppCompatActivity { |
| 32 | }); | 37 | }); |
| 33 | webView = findViewById(R.id.webview); | 38 | webView = findViewById(R.id.webview); |
| 34 | initWeb(); | 39 | initWeb(); |
| 35 | initObject(); | ||
| 36 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | 40 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
| 37 | requestPermissions(permissions,0); | 41 | requestPermissions(permissions,0); |
| 38 | } | 42 | } |
| 43 | initObject(); | ||
| 39 | webView.loadUrl(TestConfig.homeUrl); | 44 | webView.loadUrl(TestConfig.homeUrl); |
| 40 | } | 45 | } |
| 41 | 46 | ||
| ... | @@ -51,6 +56,7 @@ public class MainActivity extends AppCompatActivity { | ... | @@ -51,6 +56,7 @@ public class MainActivity extends AppCompatActivity { |
| 51 | 56 | ||
| 52 | //注册接口 | 57 | //注册接口 |
| 53 | private void initObject(){ | 58 | private void initObject(){ |
| 59 | webView.addJavascriptInterface(new Authentication(MainActivity.this),"Authentication"); | ||
| 54 | if(TestConfig.testDist==TestConfig.Skyworth){ | 60 | if(TestConfig.testDist==TestConfig.Skyworth){ |
| 55 | webView.addJavascriptInterface(new com.topdraw.iptvlaunchertest.sky.STBAppManager(this),"STBAppManager"); | 61 | webView.addJavascriptInterface(new com.topdraw.iptvlaunchertest.sky.STBAppManager(this),"STBAppManager"); |
| 56 | }else if(TestConfig.testDist==TestConfig.FiberHome){ | 62 | }else if(TestConfig.testDist==TestConfig.FiberHome){ | ... | ... |
| ... | @@ -9,6 +9,11 @@ public class TestConfig { | ... | @@ -9,6 +9,11 @@ public class TestConfig { |
| 9 | //测试目标盒子 | 9 | //测试目标盒子 |
| 10 | public static int testDist = FiberHome; | 10 | public static int testDist = FiberHome; |
| 11 | 11 | ||
| 12 | //测试平台 | ||
| 13 | public static final String platform = "HUAWEI";//"ZTE" | ||
| 14 | //设备名称 | ||
| 15 | public static final String stbType = "IPTV-TEST"; | ||
| 16 | |||
| 12 | //启动页地址 | 17 | //启动页地址 |
| 13 | public static final String homeUrl = "http://139.196.145.150:8060/JsAppLaunch/JsAppStartUp.html"; | 18 | public static final String homeUrl = "http://172.23.51.26:8070/AppEngine/apps/startApp/jsview.html"; |
| 14 | } | 19 | } | ... | ... |
| 1 | package com.topdraw.iptvlaunchertest.common; | ||
| 2 | |||
| 3 | import android.content.Context; | ||
| 4 | import android.webkit.JavascriptInterface; | ||
| 5 | |||
| 6 | import com.topdraw.iptvlaunchertest.IptvConfig; | ||
| 7 | import java.util.HashMap; | ||
| 8 | |||
| 9 | public class Authentication { | ||
| 10 | private static final HashMap<String,String> valueMap = new HashMap<>(); | ||
| 11 | public static final String UserID = "UserID"; | ||
| 12 | public static final String STBType = "STBType"; | ||
| 13 | public static final String STBVersion = "STBVersion"; | ||
| 14 | public static final String STBID = "STBID"; | ||
| 15 | public static final String EPGDomain = "EPGDomain"; | ||
| 16 | public static final String UserToken = "UserToken"; | ||
| 17 | public static final String SessionID = "SessionID"; | ||
| 18 | |||
| 19 | |||
| 20 | public Authentication(Context context) { | ||
| 21 | valueMap.put(UserID,IptvConfig.getInstance(context).getValue(IptvConfig.USER_ID)); | ||
| 22 | valueMap.put(STBType, IptvConfig.getStbType()); | ||
| 23 | valueMap.put(STBVersion, IptvConfig.getSoftVersion()); | ||
| 24 | valueMap.put(STBID, IptvConfig.getInstance(context).getStbID()); | ||
| 25 | valueMap.put(EPGDomain, IptvConfig.getInstance(context).getValue("epgdomain")); | ||
| 26 | valueMap.put(UserToken, IptvConfig.getInstance(context).getValue("usertoken")); | ||
| 27 | valueMap.put(SessionID, IptvConfig.getInstance(context).getValue("sessionid")); | ||
| 28 | } | ||
| 29 | |||
| 30 | @JavascriptInterface | ||
| 31 | public String CTCGetConfig(String encryToken){ | ||
| 32 | return valueMap.get(encryToken); | ||
| 33 | } | ||
| 34 | |||
| 35 | @JavascriptInterface | ||
| 36 | public String CTCSetConfig(String key,String value){ | ||
| 37 | return valueMap.put(key,value); | ||
| 38 | } | ||
| 39 | } |
| 1 | package com.topdraw.iptvlaunchertest.common; | ||
| 2 | |||
| 3 | import android.content.Context; | ||
| 4 | import android.content.res.AssetManager; | ||
| 5 | |||
| 6 | import org.json.JSONArray; | ||
| 7 | import org.json.JSONObject; | ||
| 8 | |||
| 9 | import java.io.BufferedReader; | ||
| 10 | import java.io.IOException; | ||
| 11 | import java.io.InputStream; | ||
| 12 | import java.io.InputStreamReader; | ||
| 13 | |||
| 14 | public class JsonReader { | ||
| 15 | |||
| 16 | public static JSONObject readJsonFromAssets(Context context, String jsonFileName) { | ||
| 17 | AssetManager assetManager = context.getAssets(); | ||
| 18 | JSONObject jsonObject = null; | ||
| 19 | |||
| 20 | try (InputStream inputStream = assetManager.open(jsonFileName); | ||
| 21 | BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { | ||
| 22 | |||
| 23 | StringBuilder stringBuilder = new StringBuilder(); | ||
| 24 | String line; | ||
| 25 | while ((line = reader.readLine()) != null) { | ||
| 26 | stringBuilder.append(line); | ||
| 27 | } | ||
| 28 | |||
| 29 | // 将 JSON 字符串转换为 JSONObject | ||
| 30 | jsonObject = new JSONObject(stringBuilder.toString()); | ||
| 31 | |||
| 32 | } catch (IOException | org.json.JSONException e) { | ||
| 33 | e.printStackTrace(); | ||
| 34 | } | ||
| 35 | |||
| 36 | return jsonObject; | ||
| 37 | } | ||
| 38 | |||
| 39 | public static JSONArray readJsonArrFromAssets(Context context, String jsonFileName) { | ||
| 40 | AssetManager assetManager = context.getAssets(); | ||
| 41 | JSONArray jsonArray = null; | ||
| 42 | |||
| 43 | try (InputStream inputStream = assetManager.open(jsonFileName); | ||
| 44 | BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { | ||
| 45 | |||
| 46 | StringBuilder stringBuilder = new StringBuilder(); | ||
| 47 | String line; | ||
| 48 | while ((line = reader.readLine()) != null) { | ||
| 49 | stringBuilder.append(line); | ||
| 50 | } | ||
| 51 | |||
| 52 | // 将 JSON 字符串转换为 JSONObject | ||
| 53 | jsonArray = new JSONArray(stringBuilder.toString()); | ||
| 54 | |||
| 55 | } catch (IOException | org.json.JSONException e) { | ||
| 56 | e.printStackTrace(); | ||
| 57 | } | ||
| 58 | |||
| 59 | return jsonArray; | ||
| 60 | } | ||
| 61 | } |
-
Please register or sign in to post a comment