Repository: wangdaye078/AntiZhaPian Branch: main Commit: 0510148c7df4 Files: 357 Total size: 2.4 MB Directory structure: gitextract_lth18jm5/ ├── .gitignore ├── .idea/ │ ├── .gitignore │ ├── .name │ ├── codeStyles/ │ │ ├── Project.xml │ │ └── codeStyleConfig.xml │ ├── compiler.xml │ ├── deploymentTargetDropDown.xml │ ├── gradle.xml │ ├── jarRepositories.xml │ ├── misc.xml │ └── vcs.xml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ ├── release/ │ │ └── output-metadata.json │ └── src/ │ └── main/ │ ├── AndroidManifest.xml │ ├── assets/ │ │ ├── DIN-Medium.otf │ │ ├── EvidenceType.txt │ │ ├── address.txt │ │ ├── bander.txt │ │ ├── casecategorys.txt │ │ ├── lottie_off.json │ │ ├── lottie_on.json │ │ ├── noticelist.txt │ │ ├── paymenttypes.txt │ │ ├── positions.txt │ │ ├── qalist.txt │ │ ├── socialaccounttypes.txt │ │ └── xccasecategorys.txt │ ├── java/ │ │ ├── com/ │ │ │ ├── demo/ │ │ │ │ └── antizha/ │ │ │ │ ├── ITimerState.kt │ │ │ │ ├── OnWebListener.kt │ │ │ │ ├── UserInfoBean.kt │ │ │ │ ├── WebViewFrag.kt │ │ │ │ ├── adapter/ │ │ │ │ │ ├── AppDeleteAdapter.kt │ │ │ │ │ ├── HRecyclerViewAdapter.kt │ │ │ │ │ ├── HeadFootAdapter.kt │ │ │ │ │ ├── HomeNewCaseAdapter.kt │ │ │ │ │ ├── NoteListAdapte.kt │ │ │ │ │ ├── PictureSelectAdapter.kt │ │ │ │ │ ├── SmsDeleteAdapter.kt │ │ │ │ │ └── SocialAccAdapter.kt │ │ │ │ ├── interfaces/ │ │ │ │ │ ├── IApiResult.kt │ │ │ │ │ ├── IClickListener.kt │ │ │ │ │ ├── IEditAfterListener.kt │ │ │ │ │ └── IHandler.kt │ │ │ │ ├── md/ │ │ │ │ │ └── JniHandStamp.kt │ │ │ │ ├── newwork/ │ │ │ │ │ ├── DictionaryUtils.kt │ │ │ │ │ ├── FileUtil.kt │ │ │ │ │ ├── HookDns.kt │ │ │ │ │ ├── HttpGetData.kt │ │ │ │ │ ├── RequestParamInterceptor.kt │ │ │ │ │ └── UpdateUtil.kt │ │ │ │ ├── ui/ │ │ │ │ │ ├── BaseDialog.kt │ │ │ │ │ ├── DownTimer.kt │ │ │ │ │ ├── HiCore.kt │ │ │ │ │ ├── HiEdittext.kt │ │ │ │ │ ├── HiWebView.kt │ │ │ │ │ ├── ProgressDialogBar.kt │ │ │ │ │ ├── RefreshUIEvent.kt │ │ │ │ │ ├── SwipBackLayout.java │ │ │ │ │ ├── activity/ │ │ │ │ │ │ ├── AboutUsActivity.kt │ │ │ │ │ │ ├── AppActivity.kt │ │ │ │ │ │ ├── AppSelectedActivity.kt │ │ │ │ │ │ ├── AudioActivity.kt │ │ │ │ │ │ ├── BaseActivity.kt │ │ │ │ │ │ ├── BaseUploadActivity.kt │ │ │ │ │ │ ├── CallActivity.kt │ │ │ │ │ │ ├── CheckFraudActivity.kt │ │ │ │ │ │ ├── CheckFraudResultActivity.kt │ │ │ │ │ │ ├── CheckIDActivity.kt │ │ │ │ │ │ ├── EvidenceDiscActivity.kt │ │ │ │ │ │ ├── FeedbackDetailActivity.kt │ │ │ │ │ │ ├── FeedbackHelpActivity.kt │ │ │ │ │ │ ├── LoginActivity.kt │ │ │ │ │ │ ├── MainActivity.kt │ │ │ │ │ │ ├── MinePersonalActivity.kt │ │ │ │ │ │ ├── NoteDetailActivity.kt │ │ │ │ │ │ ├── NoteListActivity.kt │ │ │ │ │ │ ├── OneKeyScreenRecordActivity.kt │ │ │ │ │ │ ├── PersonalInfoAddActivity.kt │ │ │ │ │ │ ├── PictureActivity.kt │ │ │ │ │ │ ├── PreviewPictureActivity.kt │ │ │ │ │ │ ├── PromosWebDetActivity.kt │ │ │ │ │ │ ├── ReportNewActivity.kt │ │ │ │ │ │ ├── ReporterAidActivity.kt │ │ │ │ │ │ ├── SettingActivity.kt │ │ │ │ │ │ ├── SmsActivity.kt │ │ │ │ │ │ ├── SmsAddActivity.kt │ │ │ │ │ │ ├── SocialAccountActivity.kt │ │ │ │ │ │ ├── SocialAccountEditActivity.kt │ │ │ │ │ │ ├── TagFlowLayoutActivity.kt │ │ │ │ │ │ ├── TradAccountActivity.kt │ │ │ │ │ │ ├── TradAccountEditActivity.kt │ │ │ │ │ │ ├── VirusKillingActivity.kt │ │ │ │ │ │ ├── WarnPrimessActivity.kt │ │ │ │ │ │ ├── WarnSettingActivity.kt │ │ │ │ │ │ ├── WebActivity.kt │ │ │ │ │ │ ├── WebsiteActivity.kt │ │ │ │ │ │ └── WelcomeActivity.kt │ │ │ │ │ ├── dialog/ │ │ │ │ │ │ └── HiShareDialog.kt │ │ │ │ │ ├── fragment/ │ │ │ │ │ │ ├── home/ │ │ │ │ │ │ │ ├── HomeFragment.kt │ │ │ │ │ │ │ └── HomeViewModel.kt │ │ │ │ │ │ ├── mine/ │ │ │ │ │ │ │ ├── MineFragment.kt │ │ │ │ │ │ │ └── MineViewModel.kt │ │ │ │ │ │ └── web/ │ │ │ │ │ │ ├── WebFragment.kt │ │ │ │ │ │ └── WebViewModel.kt │ │ │ │ │ └── view/ │ │ │ │ │ ├── BottomBar.kt │ │ │ │ │ └── BottomBarTab.kt │ │ │ │ └── util/ │ │ │ │ ├── AESUtil.kt │ │ │ │ ├── AddressBean.kt │ │ │ │ ├── AnimUtils.kt │ │ │ │ ├── AppUtil.kt │ │ │ │ ├── CRC64.kt │ │ │ │ ├── DataCleanManager.kt │ │ │ │ ├── DecoderException.java │ │ │ │ ├── DialogUtils.kt │ │ │ │ ├── EditUtil.kt │ │ │ │ ├── Encoder.java │ │ │ │ ├── EncoderException.java │ │ │ │ ├── GlideEngine.java │ │ │ │ ├── Hex.java │ │ │ │ ├── HexEncoder.java │ │ │ │ ├── LogUtils.kt │ │ │ │ ├── MD5Utils.kt │ │ │ │ ├── NotchUtils.java │ │ │ │ ├── Parameters.kt │ │ │ │ ├── PictureUtil.kt │ │ │ │ ├── RegisterBody.kt │ │ │ │ ├── ResponseData.kt │ │ │ │ ├── ResponseDataTypeAdaptor.java │ │ │ │ ├── SpUtils.kt │ │ │ │ ├── StringList.java │ │ │ │ ├── Strings.java │ │ │ │ ├── SystemProperties.kt │ │ │ │ ├── SystemUtils.kt │ │ │ │ ├── UTF8.java │ │ │ │ ├── UrlAES.kt │ │ │ │ ├── UrlUtils.kt │ │ │ │ └── Utils.kt │ │ │ └── openssl/ │ │ │ └── md/ │ │ │ └── JniHand.kt │ │ └── qiu/ │ │ └── niorgai/ │ │ ├── StatusBarCompat.java │ │ ├── StatusBarCompatKitKat.java │ │ ├── StatusBarCompatLollipop.java │ │ └── StatusBarView.java │ └── res/ │ ├── anim/ │ │ ├── anim_bottom_in.xml │ │ ├── picture_anim_enter.xml │ │ ├── picture_anim_exit.xml │ │ ├── picture_anim_fade_in.xml │ │ ├── scan_app_anim.xml │ │ ├── slide_right_in.xml │ │ └── slide_right_out.xml │ ├── drawable/ │ │ ├── bg_corner_white_bottom.xml │ │ ├── bg_crop_blue.xml │ │ ├── bg_crop_blue2.xml │ │ ├── bg_dialog_update.xml │ │ ├── bg_feedback.xml │ │ ├── bg_fraud_radio_up.xml │ │ ├── bg_gray_crop.xml │ │ ├── bg_honor_title.xml │ │ ├── bg_oval_red.xml │ │ ├── bg_record_now.xml │ │ ├── bg_red.xml │ │ ├── bg_shadow.xml │ │ ├── bg_survey.xml │ │ ├── bg_white_crop.xml │ │ ├── bg_white_crop_foot.xml │ │ ├── bg_white_crop_foot_8dp.xml │ │ ├── bg_white_crop_head.xml │ │ ├── bg_white_crop_head_8dp.xml │ │ ├── bg_white_crop_shap.xml │ │ ├── bnav_setting.xml │ │ ├── button_bg.xml │ │ ├── button_bg_blue_dark.xml │ │ ├── button_bg_blue_gradient.xml │ │ ├── button_bg_blue_ligth.xml │ │ ├── button_bg_blue_ligth_1.xml │ │ ├── button_bg_gray.xml │ │ ├── button_bg_gray_light_25.xml │ │ ├── button_bg_red_dark.xml │ │ ├── button_bg_red_feedback.xml │ │ ├── button_bg_them.xml │ │ ├── button_textcolor.xml │ │ ├── card_corner_white_bg.xml │ │ ├── check_left_btn.xml │ │ ├── check_right_btn.xml │ │ ├── check_update_bg.xml │ │ ├── dialog_corner_bg.xml │ │ ├── dialog_corner_black_bg.xml │ │ ├── font_blue_color.xml │ │ ├── id_var_bg.xml │ │ ├── layer_white_bg.xml │ │ ├── left_btn.xml │ │ ├── left_btn_select.xml │ │ ├── loading_corner.xml │ │ ├── picture_image_placeholder.xml │ │ ├── progress_bg.xml │ │ ├── record_radio_bg_right.xml │ │ ├── record_radio_style.xml │ │ ├── red_corner.xml │ │ ├── right_btn.xml │ │ ├── right_btn_select.xml │ │ ├── selected_tag_type.xml │ │ ├── set_progress.xml │ │ ├── shadow_shape.xml │ │ ├── shape_app_update.xml │ │ ├── shape_blue_25.xml │ │ ├── shape_blue_3.xml │ │ ├── shape_gray_3.xml │ │ ├── shape_line.xml │ │ ├── shape_nor_tag_type.xml │ │ ├── shape_red_white.xml │ │ ├── shape_sed_tag_type.xml │ │ ├── share_bg_style.xml │ │ ├── splash_bg.xml │ │ ├── swip_left_shadow.xml │ │ ├── switch_record_yj.xml │ │ ├── varify_box_select.xml │ │ ├── web_view_loading.xml │ │ └── white_corner.xml │ ├── drawable-nodpi/ │ │ └── ic_baseline_loop.xml │ ├── font/ │ │ └── phone_font.otf │ ├── layout/ │ │ ├── activity_about_us.xml │ │ ├── activity_aid_report.xml │ │ ├── activity_app_selected.xml │ │ ├── activity_audio.xml │ │ ├── activity_call.xml │ │ ├── activity_call_add.xml │ │ ├── activity_check_fraud.xml │ │ ├── activity_check_fraud_result.xml │ │ ├── activity_evidence.xml │ │ ├── activity_feedback_help.xml │ │ ├── activity_feedback_question.xml │ │ ├── activity_id_check.xml │ │ ├── activity_industry_list.xml │ │ ├── activity_login.xml │ │ ├── activity_main.xml │ │ ├── activity_mine_personal.xml │ │ ├── activity_note_detail.xml │ │ ├── activity_note_list.xml │ │ ├── activity_one_key_screen_record.xml │ │ ├── activity_persona_infol.xml │ │ ├── activity_picture.xml │ │ ├── activity_prom_web_det.xml │ │ ├── activity_report_new.xml │ │ ├── activity_setting.xml │ │ ├── activity_social_acc_edit.xml │ │ ├── activity_social_account.xml │ │ ├── activity_tagflow.xml │ │ ├── activity_trad_acc_edit.xml │ │ ├── activity_virus_killing.xml │ │ ├── activity_warn_primess.xml │ │ ├── activity_warn_setting.xml │ │ ├── activity_web.xml │ │ ├── activity_weburl.xml │ │ ├── app_select_tip.xml │ │ ├── background_splash.xml │ │ ├── custom_bt_dialog.xml │ │ ├── custom_bt_title_dialog.xml │ │ ├── custom_dialog_one.xml │ │ ├── custom_dialog_one_time.xml │ │ ├── custom_iv_h_dialog.xml │ │ ├── dialog_preview_picture.xml │ │ ├── dialog_update.xml │ │ ├── fragment_dashboard.xml │ │ ├── fragment_home.xml │ │ ├── fragment_home_head.xml │ │ ├── fragment_mine.xml │ │ ├── fragment_web.xml │ │ ├── home_case_head.xml │ │ ├── item_home_new_case.xml │ │ ├── item_hrecyclerview.xml │ │ ├── item_industry.xml │ │ ├── item_more_case.xml │ │ ├── item_note_list.xml │ │ ├── item_qa.xml │ │ ├── item_social_acc.xml │ │ ├── layout_complete.xml │ │ ├── layout_elec_app.xml │ │ ├── layout_elec_audio.xml │ │ ├── layout_elec_call.xml │ │ ├── layout_elec_contact.xml │ │ ├── layout_elec_deal.xml │ │ ├── layout_elec_line.xml │ │ ├── layout_elec_picture.xml │ │ ├── layout_elec_sms.xml │ │ ├── layout_elec_url.xml │ │ ├── layout_elec_video.xml │ │ ├── layout_network_no.xml │ │ ├── layout_no_data.xml │ │ ├── layout_qa.xml │ │ ├── layout_risk_btn_blue.xml │ │ ├── layout_select.xml │ │ ├── layout_select_input.xml │ │ ├── layout_tag_flow.xml │ │ ├── pic_item_view.xml │ │ ├── pic_preview.xml │ │ ├── progress_layout.xml │ │ ├── recyclerview_app_record_select.xml │ │ ├── recyclerview_app_scan.xml │ │ ├── recyclerview_app_select.xml │ │ ├── recyclerview_picture.xml │ │ ├── recyclerview_sms_record_select.xml │ │ ├── recyclerview_url_select.xml │ │ ├── rl_title_with_back.xml │ │ ├── rl_title_with_back_feedback.xml │ │ ├── rl_title_with_back_white.xml │ │ ├── rl_title_with_white.xml │ │ ├── share_dlg.xml │ │ ├── tab_bottom_bar.xml │ │ ├── tag_flow_item.xml │ │ ├── tool_item.xml │ │ └── web_page_error.xml │ ├── menu/ │ │ └── bottom_nav_menu.xml │ ├── navigation/ │ │ └── mobile_navigation.xml │ ├── values/ │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── drawables.xml │ │ ├── integers.xml │ │ ├── strings.xml │ │ └── styles.xml │ ├── values-sw300dp/ │ │ └── dimens.xml │ ├── values-sw310dp/ │ │ └── dimens.xml │ ├── values-sw320dp/ │ │ └── dimens.xml │ ├── values-sw330dp/ │ │ └── dimens.xml │ ├── values-sw340dp/ │ │ └── dimens.xml │ ├── values-sw350dp/ │ │ └── dimens.xml │ ├── values-sw360dp/ │ │ └── dimens.xml │ ├── values-sw370dp/ │ │ └── dimens.xml │ ├── values-sw380dp/ │ │ └── dimens.xml │ ├── values-sw390dp/ │ │ └── dimens.xml │ ├── values-sw391dp/ │ │ └── dimens.xml │ ├── values-sw392dp/ │ │ └── dimens.xml │ ├── values-sw393dp/ │ │ └── dimens.xml │ ├── values-sw400dp/ │ │ └── dimens.xml │ ├── values-sw410dp/ │ │ └── dimens.xml │ ├── values-sw420dp/ │ │ └── dimens.xml │ ├── values-sw430dp/ │ │ └── dimens.xml │ ├── values-sw440dp/ │ │ └── dimens.xml │ ├── values-sw450dp/ │ │ └── dimens.xml │ ├── values-sw460dp/ │ │ └── dimens.xml │ ├── values-sw470dp/ │ │ └── dimens.xml │ ├── values-sw480dp/ │ │ └── dimens.xml │ ├── values-sw490dp/ │ │ └── dimens.xml │ ├── values-sw600dp/ │ │ ├── dimens.xml │ │ ├── integers.xml │ │ └── styles.xml │ └── xml/ │ └── network_security_config.xml ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ *.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 ================================================ FILE: .idea/.gitignore ================================================ # Default ignored files /shelf/ /workspace.xml ================================================ FILE: .idea/.name ================================================ 国家反诈中心 ================================================ FILE: .idea/codeStyles/Project.xml ================================================ ================================================ FILE: .idea/codeStyles/codeStyleConfig.xml ================================================ ================================================ FILE: .idea/compiler.xml ================================================ ================================================ FILE: .idea/deploymentTargetDropDown.xml ================================================ ================================================ FILE: .idea/gradle.xml ================================================ ================================================ FILE: .idea/jarRepositories.xml ================================================ ================================================ FILE: .idea/misc.xml ================================================ ================================================ FILE: .idea/vcs.xml ================================================ ================================================ FILE: CHANGELOG.md ================================================ ## 2022.7.20 UTC 1.因为官方修改了获取最新版本的方法,导致启动时会崩溃,而且用了腾讯最新的加固,暂时没办法解决,所以在个人编辑页增加了版本号设置,取消了自动获取 ## 2022.6.20 UTC 1.官方轮播信息更新 ## 2022.2.9 UTC 1.增加登陆界面 ## 2022.2.7 UTC 1.最低版本改成27,2017年12月5日发布的,应该绝大多数手机都支持吧,一些更新的函数也做了针对性处理 ## 2022.2.6 UTC 1.风险查询页可模拟查询 ## 2022.2.4 UTC 1.我要举报的图片选择可以模拟工作了 ## 2022.2.3 UTC 1.我要举报的APP选择可以模拟工作了,当然上传就不用考虑了,估计也没人会让你上传试试 2.设置TOKEN文件后在关于界面点检查更新,可更新一些官方配置文件,下次重启会优先使用,如果格式有变化,则会导致问题 ## 2022.2.2 UTC 1.年初二,很2的日子,首页右上的公告可以打开了,好像一层界面已经都可以点了。 ## 2022.1.30 UTC 1.使用手册可以查看了 2.反馈与帮助可以查看了 3.从官方获取最新版本号,让程序可以一直显示最新版本 ## 2022.1.29 UTC 1.我要举报页可以添加社交账号和交易账号了 ## 2022.1.28 UTC 1.设置和关于窗口可以打开 2.因为新颁系统的Toast不能居中显示,所以用了一个开源库替代 ## 2022.1.25 UTC 1.我要举报页所有选择都可打开下一级窗口,上面3个窗口可以操作,下面的只有电话和网址可做不需要权限的操作 2.水滴屏的模块改了下,不知道会不会有改善 ## 2022.1.23 UTC 1.放弃klaxon,全部使用GSON 2.写了个伪造登陆TOKEN的函数,算法应该差不多了,但是没有正确的加密种子. ## 2022.1.21 UTC 1.为网络访问加上header,如果会操作,就可以使用官方登陆的信息记录来访问某些信息,当然可能会产生不必要的危险 ## 2022.1.20 UTC 1.首页工具栏的四个工具都可以点击打开了,不过内部逻辑都没有实现 2.APP自检和风险查询也可以打开了,APP自检可以模拟自检过程 3.官方轮播信息的获取需要登录了,所以先用以前获取的数据模拟显示 ## 2022.1.19 UTC 1.首页工具栏的来电预警页可点击开启 2.欢迎页现在终于全屏显示并且隐藏状态栏 ## 2022.1.18 UTC 1.增加轮播控件点击事件,如果官方在轮播信息上加上链接,就能直接打开,但是现在没配置,所以看不出效果 ## 2022.1.17 UTC 1.用轮播控件替换固定图片,因为官方只有一个图片,所以暂时看不出效果变化 ## 2022.1.16 UTC 1.首页的最新动态可以点击打开二级页面了,虽然软件是垃圾,但是案例还是可以看下的 2.改进一些外观,比如图片圆角,外观和官方更像 ## 2022.1.15 UTC 1.骗局曝光页可以打开二级页面了 ## 2022.1.14 UTC 1.骗局曝光页可以显示网络数据了,不过不能进入二级页面查看案例的具体内容 ## 2022.1.13 UTC 1.加入了账号和IMEI的设置,为骗局曝光页的网络更新做装备 2.修改主窗口的处理,避免每次切换页的时候,显示的页需要重新创建 ## 2022.1.12 UTC 1.去掉了专门的设置页,改在个人信息页中修改,和官方一致 2.使用AndroidPicker做地区选择,官方版本也是用的这个,但是他们用的应该是1.5.6版本,本项目直接用的是最新的4.X版本,显示效果有点不一样 3.之前的更新日志就不写了,新的从这开始 ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2021 wangdaye Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # AntiZhaPian 伪·国家反诈中心 最原始的代码来自 https://github.com/XJP-GIT/AntiZhaPian https://github.com/zhanghua000/AntiZhaPian 的作者增加了一些自定义属性 最后我反编译了官方包,使用官方程序的布局,尽量保证各个页面的显示效果和官方一致 本人不会安卓编程,也不懂kotlin语法,完全是瞎蒙,所以有问题和建议尽管提,但是不保证会改。 # [更新日志](https://github.com/wangdaye078/AntiZhaPian/blob/main/CHANGELOG.md) # 使用方法 点击```我的---点击查看个人信息 >```即可查看和更新个人信息 设置名字后,```我的```页的多余的信息就会隐藏 # 注意事项 为了和官方APP更像,本程序会尽量使用官方的数据,但是如果官方在提供这些数据的时候必须登录, 那么我们就不可能始终保持最新,所以,那些依赖网络数据的功能可能就无法保证一直和官方一致, 如果要更新这些数据,可以找到官方程序登陆后保存的note_national.xml文件,然后放到本程序指定 的位置(具体哪找文件,放哪,自己想办法和看代码,如果你都不会,那也就不适合做这些操作), 然后启动程序,在关于页,点击获取更新按钮,就可以更新资料,如果资料格式有变化,可能导致程 序无法正常使用。当然本功能也不能保证一直能用。 使用某些功能会需要某些权限,比如媒体和应用统计,打开后可以通过假的实名认证页关闭, 关闭的时候会打开设置页,由用户手动关闭(用户可以自己在系统设置中关闭),但是关闭一些权限 会导致程序重启,所以可能需要多次在认证页点击关闭按钮,直到提示已经全部关闭即可。 本程序不包含任何实用功能,比如病毒扫描、诈骗举报等,如果需要那些功能,就安装官方包吧。 即使不装官方程序,你的电话等也是会被监控的,比如接了某些电话就可能会被96110回访,所以安装 本程序也只是心理安慰,防止你手机上装的一些APP,比如翻墙VPN被官方程序上报。但是如果微信什 么的偷偷上报,你也不知道是不是。 ================================================ FILE: app/.gitignore ================================================ /build ================================================ FILE: app/build.gradle ================================================ plugins { id 'com.android.application' id 'kotlin-android' } android { compileSdkVersion 31 defaultConfig { applicationId "com.hicorenational.antifraud" minSdkVersion 27 targetSdkVersion 31 versionCode 144 versionName "2.0.8" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" applicationIdSuffix 'fork' buildConfigField "String", "RELEASE_H5_URL", "\"https://fzapph5.gjfzpt.cn\"" buildConfigField "String", "RELEASE_API_URL", "\"https://fzapp.gjfzpt.cn/hicore\"" buildConfigField "String", "RELEASE_OSS_DOWNLOAD", "\"https://oss.gjfzpt.cn/preventfraud-static/\"" //buildConfigField "String", "RELEASE_API_URL", "\"http://192.168.2.101/hicore\"" buildConfigField "Long", "BUILD_TIME", System.currentTimeMillis() + "L" ndk { abiFilters "armeabi", "arm64-v8a", "armeabi-v7a", "x86_64" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding = true } packagingOptions { exclude 'META-INF/INDEX.LIST' } sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs', 'libs'] } } ndkVersion '23.0.7599858' buildToolsVersion '31.0.0' namespace 'com.demo.antizha' } dependencies { implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1' implementation 'androidx.navigation:navigation-ui-ktx:2.4.1' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1' //HTTP网络接口 implementation "com.squareup.okhttp3:okhttp:3.11.0" //图片加载 implementation 'com.github.bumptech.glide:glide:4.13.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0' //Observable等事件处理,网络线程和UI线程同步 //implementation 'io.reactivex.rxjava2:rxjava:2.2.6' //implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' //不同地方发出的nsg可以在一个地方集中处理 implementation "org.greenrobot:eventbus:3.3.1" //智能下拉刷新框架 implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.3' //地址选取 implementation 'com.github.gzu-liyujiang.AndroidPicker:WheelPicker:1.5.6' //设置页用的按钮 implementation 'com.github.zcweng:switch-button:0.0.3@aar' //webFragment用的浏览窗口 implementation 'com.github.Justson.AgentWeb:agentweb-core:v4.1.9' //homeFragment上的来回切换的横幅 implementation 'io.github.youth5201314:banner:2.2.2' //预警窗口中使用,播放JSON格式的动画 implementation 'com.airbnb.android:lottie:4.2.1' // implementation 'com.google.code.gson:gson:2.8.9' //用在举报社交等几个窗口 implementation 'com.nex3z:flow-layout:1.3.3' //强大而灵活的RecyclerView Adapter,在多个窗口使用, implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.7' //不能使用最新的pictureselector版本 implementation 'io.github.lucksiege:pictureselector:v2.6.1' //用于提示消息的显示 implementation 'com.github.getActivity:ToastUtils:10.3' //卡顿检测工具 //implementation 'io.github.knight-zxw:blockcanary:0.0.5' //implementation 'io.github.knight-zxw:blockcanary-ui:0.0.5' } ================================================ FILE: app/proguard-rules.pro ================================================ # Add project specific ProGuard rules here. # You can control the set of applied configuration files using the # proguardFiles setting in build.gradle. # # For more details, see # http://developer.android.com/guide/developing/tools/proguard.html # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} # Uncomment this to preserve the line number information for # debugging stack traces. #-keepattributes SourceFile,LineNumberTable # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile ================================================ FILE: app/release/output-metadata.json ================================================ { "version": 3, "artifactType": { "type": "APK", "kind": "Directory" }, "applicationId": "com.hicorenational.antifraud.fork", "variantName": "release", "elements": [ { "type": "SINGLE", "filters": [], "attributes": [], "versionCode": 144, "versionName": "2.0.8", "outputFile": "app-release.apk" } ], "elementType": "File" } ================================================ FILE: app/src/main/AndroidManifest.xml ================================================ ================================================ FILE: app/src/main/assets/EvidenceType.txt ================================================ {"data":[{"clusterID":1,"code":1,"name":"冒充电商物流客服类","icon":null,"iconSelected":null,"children":[{"clusterID":2,"code":2,"name":"冒充电商客服","icon":null,"iconSelected":null,"children":[]},{"clusterID":3,"code":3,"name":"冒充物流客服","icon":null,"iconSelected":null,"children":[]},{"clusterID":4,"code":4,"name":"其他","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":5,"code":5,"name":"冒充公检法及政府机关类","icon":null,"iconSelected":null,"children":[{"clusterID":6,"code":6,"name":"冒充公检法","icon":null,"iconSelected":null,"children":[]},{"clusterID":7,"code":7,"name":"冒充其他单位组织","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":8,"code":8,"name":"刷单返利类","icon":null,"iconSelected":null,"children":[{"clusterID":9,"code":9,"name":"刷单返利类","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":10,"code":10,"name":"贷款、代办信用卡类","icon":null,"iconSelected":null,"children":[{"clusterID":11,"code":11,"name":"虚假贷款","icon":null,"iconSelected":null,"children":[]},{"clusterID":12,"code":12,"name":"虚假代办信用卡","icon":null,"iconSelected":null,"children":[]},{"clusterID":13,"code":13,"name":"虚假提额套现","icon":null,"iconSelected":null,"children":[]},{"clusterID":14,"code":14,"name":"其他","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":15,"code":15,"name":"冒充军警购物类","icon":null,"iconSelected":null,"children":[{"clusterID":16,"code":16,"name":"冒充军警购物诈骗","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":17,"code":17,"name":"虚假网络投资理财类","icon":null,"iconSelected":null,"children":[{"clusterID":18,"code":18,"name":"虚假网络投资理财","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":21,"code":21,"name":"虚假购物、服务类","icon":null,"iconSelected":null,"children":[{"clusterID":22,"code":22,"name":"虚假购物","icon":null,"iconSelected":null,"children":[]},{"clusterID":23,"code":23,"name":"虚假服务","icon":null,"iconSelected":null,"children":[]},{"clusterID":24,"code":24,"name":"其他","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":25,"code":25,"name":"网络婚恋、交友类(非虚假网络投资理财类)","icon":null,"iconSelected":null,"children":[{"clusterID":26,"code":26,"name":"冒充外国军人","icon":null,"iconSelected":null,"children":[]},{"clusterID":27,"code":27,"name":"网络婚恋","icon":null,"iconSelected":null,"children":[]},{"clusterID":28,"code":28,"name":"网络交友","icon":null,"iconSelected":null,"children":[]},{"clusterID":29,"code":29,"name":"其他","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":30,"code":30,"name":"虚假征信类","icon":null,"iconSelected":null,"children":[{"clusterID":31,"code":31,"name":"消除校园贷记录","icon":null,"iconSelected":null,"children":[]},{"clusterID":32,"code":32,"name":"消除不良记录","icon":null,"iconSelected":null,"children":[]},{"clusterID":33,"code":33,"name":"其他","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":34,"code":34,"name":"冒充领导、熟人等特定身份类","icon":null,"iconSelected":null,"children":[{"clusterID":35,"code":35,"name":"冒充领导","icon":null,"iconSelected":null,"children":[]},{"clusterID":36,"code":36,"name":"冒充熟人","icon":null,"iconSelected":null,"children":[]},{"clusterID":37,"code":37,"name":"冒充公众人物","icon":null,"iconSelected":null,"children":[]},{"clusterID":38,"code":38,"name":"冒充其他身份","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":39,"code":39,"name":"网络游戏产品虚假交易类","icon":null,"iconSelected":null,"children":[{"clusterID":40,"code":40,"name":"游戏币、点卡虚假充值","icon":null,"iconSelected":null,"children":[]},{"clusterID":41,"code":41,"name":"游戏账号、装备虚假交易","icon":null,"iconSelected":null,"children":[]},{"clusterID":42,"code":42,"name":"其他","icon":null,"iconSelected":null,"children":[]}]},{"clusterID":43,"code":43,"name":"其他类型诈骗","icon":null,"iconSelected":null,"children":[{"clusterID":44,"code":44,"name":"虚假中奖诈骗","icon":null,"iconSelected":null,"children":[]},{"clusterID":45,"code":45,"name":"虚假招聘","icon":null,"iconSelected":null,"children":[]},{"clusterID":46,"code":46,"name":"充值(红包)返利","icon":null,"iconSelected":null,"children":[]},{"clusterID":47,"code":47,"name":"机票退、改签诈骗","icon":null,"iconSelected":null,"children":[]},{"clusterID":48,"code":48,"name":"PS图片诈骗","icon":null,"iconSelected":null,"children":[]},{"clusterID":49,"code":49,"name":"重金求子(慈善捐款)","icon":null,"iconSelected":null,"children":[]},{"clusterID":50,"code":50,"name":"其他","icon":null,"iconSelected":null,"children":[]}]}],"code":0,"msg":"成功"} ================================================ FILE: app/src/main/assets/address.txt ================================================ [ { "code": "11", "name": "北京市", "cityList": [ { "code": "1101", "name": "北京市", "townList": [ { "code": "110101", "name": "东城区", "longitude": "116.422400978", "latitude": "39.9348272724" }, { "code": "110102", "name": "西城区", "longitude": "116.372513581", "latitude": "39.9181236058" }, { "code": "110105", "name": "朝阳区", "longitude": "116.44955873", "latitude": "39.9263745231" }, { "code": "110106", "name": "丰台区", "longitude": "116.292401887", "latitude": "39.8649371976" }, { "code": "110107", "name": "石景山区", "longitude": "116.229612668", "latitude": "39.9113538088" }, { "code": "110108", "name": "海淀区", "longitude": "116.305434054", "latitude": "39.9654898411" }, { "code": "110109", "name": "门头沟区", "longitude": "116.107603556", "latitude": "39.94614672" }, { "code": "110111", "name": "房山区", "longitude": "116.149443752", "latitude": "39.7543258398" }, { "code": "110112", "name": "通州区", "longitude": "116.663415358", "latitude": "39.9160171224" }, { "code": "110113", "name": "顺义区", "longitude": "116.661424264", "latitude": "40.1363507622" }, { "code": "110114", "name": "昌平区", "longitude": "116.237617917", "latitude": "40.2264133716" }, { "code": "110115", "name": "大兴区", "longitude": "116.348625212", "latitude": "39.7325552366" }, { "code": "110116", "name": "怀柔区", "longitude": "116.638385871", "latitude": "40.3226184043" }, { "code": "110117", "name": "平谷区", "longitude": "117.127379105", "latitude": "40.1469507358" }, { "code": "110118", "name": "密云区", "longitude": "116.849547044", "latitude": "40.3821756581" }, { "code": "110119", "name": "延庆区", "longitude": "115.981631569", "latitude": "40.4621689738" } ] } ] }, { "code": "12", "name": "天津市", "cityList": [ { "code": "1201", "name": "天津市", "townList": [ { "code": "120101", "name": "和平区", "longitude": "117.221466995", "latitude": "39.1233902533" }, { "code": "120102", "name": "河东区", "longitude": "117.258412953", "latitude": "39.134487326" }, { "code": "120103", "name": "河西区", "longitude": "117.22941628", "latitude": "39.1157180822" }, { "code": "120104", "name": "南开区", "longitude": "117.156515374", "latitude": "39.1441052798" }, { "code": "120105", "name": "河北区", "longitude": "117.203592781", "latitude": "39.1534851447" }, { "code": "120106", "name": "红桥区", "longitude": "117.157517883", "latitude": "39.1732856466" }, { "code": "120110", "name": "东丽区", "longitude": "117.320568508", "latitude": "39.0923323428" }, { "code": "120111", "name": "西青区", "longitude": "117.01441018", "latitude": "39.148726609" }, { "code": "120112", "name": "津南区", "longitude": "117.363386779", "latitude": "38.9441485681" }, { "code": "120113", "name": "北辰区", "longitude": "117.141402732", "latitude": "39.2303439099" }, { "code": "120114", "name": "武清区", "longitude": "117.05059716", "latitude": "39.3898712288" }, { "code": "120115", "name": "宝坻区", "longitude": "117.316600692", "latitude": "39.7231944829" }, { "code": "120116", "name": "滨海新区", "longitude": "117.81477655", "latitude": "39.249995749" }, { "code": "120117", "name": "宁河区", "longitude": "117.832393343", "latitude": "39.3369564312" }, { "code": "120118", "name": "静海区", "longitude": "116.980468605", "latitude": "38.9533706892" }, { "code": "120119", "name": "蓟州区", "longitude": "117.414578695", "latitude": "40.0515087864" } ] } ] }, { "code": "13", "name": "河北省", "cityList": [ { "code": "1301", "name": "石家庄市", "townList": [ { "code": "130102", "name": "长安区", "longitude": "114.54561161", "latitude": "38.0432561365" }, { "code": "130104", "name": "桥西区", "longitude": "114.456600044", "latitude": "38.0311546546" }, { "code": "130105", "name": "新华区", "longitude": "114.469438446", "latitude": "38.0571195392" }, { "code": "130107", "name": "井陉矿区", "longitude": "114.068631865", "latitude": "38.0705658345" }, { "code": "130108", "name": "裕华区", "longitude": "114.537582914", "latitude": "38.0120876863" }, { "code": "130109", "name": "藁城区", "longitude": "114.853377904", "latitude": "38.0278165553" }, { "code": "130110", "name": "鹿泉区", "longitude": "114.320597578", "latitude": "38.0917494576" }, { "code": "130111", "name": "栾城区", "longitude": "114.654575619", "latitude": "37.9058163642" }, { "code": "130121", "name": "井陉县", "longitude": "114.151462999", "latitude": "38.0383862149" }, { "code": "130123", "name": "正定县", "longitude": "114.577481064", "latitude": "38.151713728" }, { "code": "130125", "name": "行唐县", "longitude": "114.55960676", "latitude": "38.4442387477" }, { "code": "130126", "name": "灵寿县", "longitude": "114.389477758", "latitude": "38.31462937" }, { "code": "130127", "name": "高邑县", "longitude": "114.618413073", "latitude": "37.6218795616" }, { "code": "130128", "name": "深泽县", "longitude": "115.207403699", "latitude": "38.1904512031" }, { "code": "130129", "name": "赞皇县", "longitude": "114.392463546", "latitude": "37.6716670613" }, { "code": "130130", "name": "无极县", "longitude": "114.982439343", "latitude": "38.1854361703" }, { "code": "130131", "name": "平山县", "longitude": "114.202331974", "latitude": "38.2536625199" }, { "code": "130132", "name": "元氏县", "longitude": "114.532565519", "latitude": "37.7723385539" }, { "code": "130133", "name": "赵县", "longitude": "114.782596551", "latitude": "37.7618585229" }, { "code": "130181", "name": "辛集市", "longitude": "115.224450843", "latitude": "37.9493090432" }, { "code": "130183", "name": "晋州市", "longitude": "115.050529015", "latitude": "38.0394913097" }, { "code": "130184", "name": "新乐市", "longitude": "114.690532183", "latitude": "38.349292648" }, { "code": "130185", "name": "高新区", "longitude": "114.665735358", "latitude": "38.2416235296" }, { "code": "130186", "name": "循环化工园区", "longitude": "114.701219324", "latitude": "38.0028373744" } ] }, { "code": "1302", "name": "唐山市", "townList": [ { "code": "130202", "name": "路南区", "longitude": "118.160606689", "latitude": "39.6310428536" }, { "code": "130203", "name": "路北区", "longitude": "118.206399249", "latitude": "39.6306607991" }, { "code": "130204", "name": "古冶区", "longitude": "118.453400926", "latitude": "39.7397359148" }, { "code": "130205", "name": "开平区", "longitude": "118.268607624", "latitude": "39.6771436359" }, { "code": "130207", "name": "丰南区", "longitude": "118.090365576", "latitude": "39.5815404851" }, { "code": "130208", "name": "丰润区", "longitude": "118.168541331", "latitude": "39.8383534309" }, { "code": "130209", "name": "曹妃甸区", "longitude": "118.466459862", "latitude": "39.2792839963" }, { "code": "130224", "name": "滦南县", "longitude": "118.680405243", "latitude": "39.5100447025" }, { "code": "130225", "name": "乐亭县", "longitude": "118.919384063", "latitude": "39.4319313201" }, { "code": "130227", "name": "迁西县", "longitude": "118.320383978", "latitude": "40.1478371514" }, { "code": "130229", "name": "玉田县", "longitude": "117.745434406", "latitude": "39.9065923482" }, { "code": "130281", "name": "遵化市", "longitude": "117.972375213", "latitude": "40.195533204" }, { "code": "130283", "name": "迁安市", "longitude": "118.706457361", "latitude": "40.0041839249" }, { "code": "130284", "name": "滦州市", "longitude": "118.710480062", "latitude": "39.7471157655" } ] }, { "code": "1303", "name": "秦皇岛市", "townList": [ { "code": "130302", "name": "海港区", "longitude": "119.571196517", "latitude": "39.9533046425" }, { "code": "130303", "name": "山海关区", "longitude": "119.782435214", "latitude": "39.9844456418" }, { "code": "130304", "name": "北戴河区", "longitude": "119.491526071", "latitude": "39.8410056679" }, { "code": "130306", "name": "抚宁区", "longitude": "119.251549144", "latitude": "39.8814135694" }, { "code": "130321", "name": "青龙满族自治县", "longitude": "118.956481296", "latitude": "40.4127937023" }, { "code": "130322", "name": "昌黎县", "longitude": "119.206094167", "latitude": "39.7067622908" }, { "code": "130324", "name": "卢龙县", "longitude": "118.899489111", "latitude": "39.8979584661" } ] }, { "code": "1304", "name": "邯郸市", "townList": [ { "code": "130402", "name": "邯山区", "longitude": "114.537619385", "latitude": "36.6001197701" }, { "code": "130403", "name": "丛台区", "longitude": "114.499432598", "latitude": "36.642672566" }, { "code": "130404", "name": "复兴区", "longitude": "114.468585685", "latitude": "36.6453760668" }, { "code": "130406", "name": "峰峰矿区", "longitude": "114.219483321", "latitude": "36.4256536144" }, { "code": "130407", "name": "肥乡区", "longitude": "114.806547082", "latitude": "36.5538252537" }, { "code": "130408", "name": "永年区", "longitude": "114.550625142", "latitude": "36.7475693896" }, { "code": "130423", "name": "临漳县", "longitude": "114.626426946", "latitude": "36.3407659806" }, { "code": "130424", "name": "成安县", "longitude": "114.676576558", "latitude": "36.449796209" }, { "code": "130425", "name": "大名县", "longitude": "115.15461253", "latitude": "36.2912884662" }, { "code": "130426", "name": "涉县", "longitude": "113.697584349", "latitude": "36.5906916632" }, { "code": "130427", "name": "磁县", "longitude": "114.380431731", "latitude": "36.3803589409" }, { "code": "130430", "name": "邱县", "longitude": "115.193395164", "latitude": "36.8173624171" }, { "code": "130431", "name": "鸡泽县", "longitude": "114.896585771", "latitude": "36.9163982064" }, { "code": "130432", "name": "广平县", "longitude": "114.954414906", "latitude": "36.4897799956" }, { "code": "130433", "name": "馆陶县", "longitude": "115.288536766", "latitude": "36.5539567287" }, { "code": "130434", "name": "魏县", "longitude": "114.945450446", "latitude": "36.3661564544" }, { "code": "130435", "name": "曲周县", "longitude": "114.963404429", "latitude": "36.7715448313" }, { "code": "130481", "name": "武安市", "longitude": "114.210516076", "latitude": "36.7024882863" } ] }, { "code": "1305", "name": "邢台市", "townList": [ { "code": "130502", "name": "襄都区", "longitude": "114.513471137", "latitude": "37.0737499597" }, { "code": "130503", "name": "信都区", "longitude": "114.4743935", "latitude": "37.0661724157" }, { "code": "130505", "name": "任泽区", "longitude": "114.67860601", "latitude": "37.1267267835" }, { "code": "130506", "name": "南和区", "longitude": "114.690547724", "latitude": "37.0109979706" }, { "code": "130522", "name": "临城县", "longitude": "114.50544334", "latitude": "37.4507885484" }, { "code": "130523", "name": "内丘县", "longitude": "114.518492934", "latitude": "37.292857912" }, { "code": "130524", "name": "柏乡县", "longitude": "114.699497362", "latitude": "37.4887587272" }, { "code": "130525", "name": "隆尧县", "longitude": "114.776616082", "latitude": "37.3559080063" }, { "code": "130528", "name": "宁晋县", "longitude": "114.925561693", "latitude": "37.6256122799" }, { "code": "130529", "name": "巨鹿县", "longitude": "115.043587359", "latitude": "37.2270883289" }, { "code": "130530", "name": "新河县", "longitude": "115.248547169", "latitude": "37.5345906015" }, { "code": "130531", "name": "广宗县", "longitude": "115.149604746", "latitude": "37.0804571222" }, { "code": "130532", "name": "平乡县", "longitude": "115.036581744", "latitude": "37.069096393" }, { "code": "130533", "name": "威县", "longitude": "115.273617619", "latitude": "36.9815816087" }, { "code": "130534", "name": "清河县", "longitude": "115.674393568", "latitude": "37.0463754016" }, { "code": "130535", "name": "临西县", "longitude": "115.507629438", "latitude": "36.8767599665" }, { "code": "130581", "name": "南宫市", "longitude": "115.414529055", "latitude": "37.3640694027" }, { "code": "130582", "name": "沙河市", "longitude": "114.509473857", "latitude": "36.8611273411" } ] }, { "code": "1306", "name": "保定市", "townList": [ { "code": "130602", "name": "竞秀区", "longitude": "115.465434142", "latitude": "38.8837879617" }, { "code": "130606", "name": "莲池区", "longitude": "115.535487688", "latitude": "38.860675807" }, { "code": "130607", "name": "满城区", "longitude": "115.328375089", "latitude": "38.9554412087" }, { "code": "130608", "name": "清苑区", "longitude": "115.509032322", "latitude": "38.772678631" }, { "code": "130609", "name": "徐水区", "longitude": "115.662479521", "latitude": "39.0247125838" }, { "code": "130623", "name": "涞水县", "longitude": "115.720543025", "latitude": "39.4003341985" }, { "code": "130624", "name": "阜平县", "longitude": "114.201563474", "latitude": "38.8553514448" }, { "code": "130626", "name": "定兴县", "longitude": "115.814410112", "latitude": "39.2694235285" }, { "code": "130627", "name": "唐县", "longitude": "114.989447115", "latitude": "38.7540199251" }, { "code": "130628", "name": "高阳县", "longitude": "115.785447215", "latitude": "38.7062577341" }, { "code": "130629", "name": "容城县", "longitude": "115.868631293", "latitude": "39.0485594354" }, { "code": "130630", "name": "涞源县", "longitude": "114.700475617", "latitude": "39.3662716915" }, { "code": "130631", "name": "望都县", "longitude": "115.161587603", "latitude": "38.7001576455" }, { "code": "130632", "name": "安新县", "longitude": "115.942426283", "latitude": "38.9417342986" }, { "code": "130633", "name": "易县", "longitude": "115.503606646", "latitude": "39.35505447" }, { "code": "130634", "name": "曲阳县", "longitude": "114.751454814", "latitude": "38.6283841041" }, { "code": "130635", "name": "蠡县", "longitude": "115.59044548", "latitude": "38.4942009632" }, { "code": "130636", "name": "顺平县", "longitude": "115.141597431", "latitude": "38.8432613704" }, { "code": "130637", "name": "博野县", "longitude": "115.470466988", "latitude": "38.463408005" }, { "code": "130638", "name": "雄县", "longitude": "116.114601446", "latitude": "39.0001801195" }, { "code": "130681", "name": "涿州市", "longitude": "115.981619711", "latitude": "39.491065832" }, { "code": "130682", "name": "定州市", "longitude": "114.996496208", "latitude": "38.5221988401" }, { "code": "130683", "name": "安国市", "longitude": "115.333408025", "latitude": "38.4248283187" }, { "code": "130684", "name": "高碑店市", "longitude": "115.880569055", "latitude": "39.3323354475" }, { "code": "130685", "name": "白沟", "longitude": "116.030601346", "latitude": "39.1268156037" }, { "code": "130686", "name": "高新区", "longitude": "115.501692537", "latitude": "38.8747715343" } ] }, { "code": "1307", "name": "张家口市", "townList": [ { "code": "130702", "name": "桥东区", "longitude": "114.900605778", "latitude": "40.7942684374" }, { "code": "130703", "name": "桥西区", "longitude": "114.876516098", "latitude": "40.825605695" }, { "code": "130705", "name": "宣化区", "longitude": "115.105444407", "latitude": "40.6145918883" }, { "code": "130706", "name": "下花园区", "longitude": "115.293516882", "latitude": "40.5081451827" }, { "code": "130708", "name": "万全区", "longitude": "114.744356314", "latitude": "40.8673428837" }, { "code": "130709", "name": "崇礼区", "longitude": "115.289549336", "latitude": "40.9804778859" }, { "code": "130722", "name": "张北县", "longitude": "114.726375112", "latitude": "41.16494362" }, { "code": "130723", "name": "康保县", "longitude": "114.606355837", "latitude": "41.8586368845" }, { "code": "130724", "name": "沽源县", "longitude": "115.695407449", "latitude": "41.6760158761" }, { "code": "130725", "name": "尚义县", "longitude": "113.975809418", "latitude": "41.0822156398" }, { "code": "130726", "name": "蔚县", "longitude": "114.595400552", "latitude": "39.8470886364" }, { "code": "130727", "name": "阳原县", "longitude": "114.157524136", "latitude": "40.1095883887" }, { "code": "130728", "name": "怀安县", "longitude": "114.392469115", "latitude": "40.6803693431" }, { "code": "130730", "name": "怀来县", "longitude": "115.524552885", "latitude": "40.4202898904" }, { "code": "130731", "name": "涿鹿县", "longitude": "115.211383462", "latitude": "40.385834075" }, { "code": "130732", "name": "赤城县", "longitude": "115.8385059", "latitude": "40.9187612168" } ] }, { "code": "1308", "name": "承德市", "townList": [ { "code": "130802", "name": "双桥区", "longitude": "117.949427909", "latitude": "40.9808244774" }, { "code": "130803", "name": "双滦区", "longitude": "117.806578289", "latitude": "40.9647291482" }, { "code": "130804", "name": "鹰手营子矿区", "longitude": "117.665609092", "latitude": "40.5520432336" }, { "code": "130821", "name": "承德县", "longitude": "118.180455737", "latitude": "40.7743671949" }, { "code": "130822", "name": "兴隆县", "longitude": "117.507427373", "latitude": "40.4234540296" }, { "code": "130824", "name": "滦平县", "longitude": "117.339497871", "latitude": "40.9475609629" }, { "code": "130825", "name": "隆化县", "longitude": "117.745451024", "latitude": "41.319898805" }, { "code": "130826", "name": "丰宁满族自治县", "longitude": "116.6523927", "latitude": "41.21533638" }, { "code": "130827", "name": "宽城满族自治县", "longitude": "118.491594361", "latitude": "40.6171515078" }, { "code": "130828", "name": "围场满族蒙古族自治县", "longitude": "117.76666397", "latitude": "41.9442831978" }, { "code": "130881", "name": "平泉市", "longitude": "118.707426722", "latitude": "41.0237556259" } ] }, { "code": "1309", "name": "沧州市", "townList": [ { "code": "130902", "name": "新华区", "longitude": "116.872433174", "latitude": "38.3203667195" }, { "code": "130903", "name": "运河区", "longitude": "116.838611971", "latitude": "38.3165227375" }, { "code": "130921", "name": "沧县", "longitude": "116.884397795", "latitude": "38.2994527434" }, { "code": "130922", "name": "青县", "longitude": "116.810574778", "latitude": "38.5884647586" }, { "code": "130923", "name": "东光县", "longitude": "116.543409557", "latitude": "37.8945139067" }, { "code": "130924", "name": "海兴县", "longitude": "117.504418049", "latitude": "38.1494025165" }, { "code": "130925", "name": "盐山县", "longitude": "117.237413624", "latitude": "38.0643183996" }, { "code": "130926", "name": "肃宁县", "longitude": "115.83651768", "latitude": "38.4289059197" }, { "code": "130927", "name": "南皮县", "longitude": "116.715601159", "latitude": "38.045187887" }, { "code": "130928", "name": "吴桥县", "longitude": "116.397392062", "latitude": "37.6339087556" }, { "code": "130929", "name": "献县", "longitude": "116.129560029", "latitude": "38.195981438" }, { "code": "130930", "name": "孟村回族自治县", "longitude": "117.110436075", "latitude": "38.0598391279" }, { "code": "130981", "name": "泊头市", "longitude": "116.584628036", "latitude": "38.0892569154" }, { "code": "130982", "name": "任丘市", "longitude": "116.091278201", "latitude": "38.6920321318" }, { "code": "130983", "name": "黄骅市", "longitude": "117.336481092", "latitude": "38.3774939007" }, { "code": "130984", "name": "河间市", "longitude": "116.105628092", "latitude": "38.4513565151" }, { "code": "130985", "name": "渤海新区", "longitude": "117.762068958", "latitude": "38.2823733169" } ] }, { "code": "1310", "name": "廊坊市", "townList": [ { "code": "131002", "name": "安次区", "longitude": "116.709633266", "latitude": "39.526159764" }, { "code": "131003", "name": "广阳区", "longitude": "116.717614261", "latitude": "39.5286114473" }, { "code": "131022", "name": "固安县", "longitude": "116.305420041", "latitude": "39.4444848553" }, { "code": "131023", "name": "永清县", "longitude": "116.50542929", "latitude": "39.3278529986" }, { "code": "131024", "name": "香河县", "longitude": "117.012402108", "latitude": "39.7679391885" }, { "code": "131025", "name": "大城县", "longitude": "116.660409178", "latitude": "38.71085864" }, { "code": "131026", "name": "文安县", "longitude": "116.464609479", "latitude": "38.8789504931" }, { "code": "131028", "name": "大厂回族自治县", "longitude": "116.996409126", "latitude": "39.8922083941" }, { "code": "131081", "name": "霸州市", "longitude": "116.398397266", "latitude": "39.130920597" }, { "code": "131082", "name": "三河市", "longitude": "117.084587872", "latitude": "39.9880995524" } ] }, { "code": "1311", "name": "衡水市", "townList": [ { "code": "131102", "name": "桃城区", "longitude": "115.68139532", "latitude": "37.7416367517" }, { "code": "131103", "name": "冀州区", "longitude": "115.585429881", "latitude": "37.5570860258" }, { "code": "131121", "name": "枣强县", "longitude": "115.730562904", "latitude": "37.5193636898" }, { "code": "131122", "name": "武邑县", "longitude": "115.894513631", "latitude": "37.8077642769" }, { "code": "131123", "name": "武强县", "longitude": "115.989613912", "latitude": "38.0468568052" }, { "code": "131124", "name": "饶阳县", "longitude": "115.732571605", "latitude": "38.2410375254" }, { "code": "131125", "name": "安平县", "longitude": "115.525549285", "latitude": "38.2405069222" }, { "code": "131126", "name": "故城县", "longitude": "115.972602161", "latitude": "37.3533475525" }, { "code": "131127", "name": "景县", "longitude": "116.277410785", "latitude": "37.6988145514" }, { "code": "131128", "name": "阜城县", "longitude": "116.182421535", "latitude": "37.8687324579" }, { "code": "131182", "name": "深州市", "longitude": "115.566369276", "latitude": "38.0069412349" } ] } ] }, { "code": "14", "name": "山西省", "cityList": [ { "code": "1401", "name": "太原市", "townList": [ { "code": "140105", "name": "小店区", "longitude": "112.572396242", "latitude": "37.7423225286" }, { "code": "140106", "name": "迎泽区", "longitude": "112.569384672", "latitude": "37.8695324842" }, { "code": "140107", "name": "杏花岭区", "longitude": "112.576383011", "latitude": "37.9001862468" }, { "code": "140108", "name": "尖草坪区", "longitude": "112.493604967", "latitude": "37.9459433545" }, { "code": "140109", "name": "万柏林区", "longitude": "112.522576757", "latitude": "37.8649744104" }, { "code": "140110", "name": "晋源区", "longitude": "112.484564241", "latitude": "37.7211688578" }, { "code": "140121", "name": "清徐县", "longitude": "112.364557631", "latitude": "37.6130668382" }, { "code": "140122", "name": "阳曲县", "longitude": "112.679408952", "latitude": "38.0646208194" }, { "code": "140123", "name": "娄烦县", "longitude": "111.803590634", "latitude": "38.0731953689" }, { "code": "140181", "name": "古交市", "longitude": "112.182452869", "latitude": "37.912999961" } ] }, { "code": "1402", "name": "大同市", "townList": [ { "code": "140212", "name": "新荣区", "longitude": "113.146443735", "latitude": "40.2619712193" }, { "code": "140213", "name": "平城区", "longitude": "113.304425222", "latitude": "40.081998375" }, { "code": "140214", "name": "云冈区", "longitude": "113.162401504", "latitude": "39.9968388113" }, { "code": "140215", "name": "云州区", "longitude": "113.618471032", "latitude": "40.0462298865" }, { "code": "140221", "name": "阳高县", "longitude": "113.755414203", "latitude": "40.3673918425" }, { "code": "140222", "name": "天镇县", "longitude": "114.097477533", "latitude": "40.4264121987" }, { "code": "140223", "name": "广灵县", "longitude": "114.288586371", "latitude": "39.7660042171" }, { "code": "140224", "name": "灵丘县", "longitude": "114.241368199", "latitude": "39.4488251281" }, { "code": "140225", "name": "浑源县", "longitude": "113.698729509", "latitude": "39.7117241539" }, { "code": "140226", "name": "左云县", "longitude": "112.70946329", "latitude": "40.019623449" } ] }, { "code": "1403", "name": "阳泉市", "townList": [ { "code": "140302", "name": "城区", "longitude": "113.606568214", "latitude": "37.8534334207" }, { "code": "140303", "name": "矿区", "longitude": "113.561521247", "latitude": "37.8744091509" }, { "code": "140311", "name": "郊区", "longitude": "113.600602837", "latitude": "37.9503528929" }, { "code": "140321", "name": "平定县", "longitude": "113.664421155", "latitude": "37.7927963836" }, { "code": "140322", "name": "盂县", "longitude": "113.418420461", "latitude": "38.0919796302" } ] }, { "code": "1404", "name": "长治市", "townList": [ { "code": "140403", "name": "潞州区", "longitude": "113.129520917", "latitude": "36.2094724813" }, { "code": "140404", "name": "上党区", "longitude": "113.05741609", "latitude": "36.0592864793" }, { "code": "140405", "name": "屯留区", "longitude": "112.898474764", "latitude": "36.3216308431" }, { "code": "140406", "name": "潞城区", "longitude": "113.235578459", "latitude": "36.3396912676" }, { "code": "140423", "name": "襄垣县", "longitude": "113.057412586", "latitude": "36.5416858212" }, { "code": "140425", "name": "平顺县", "longitude": "113.442516967", "latitude": "36.2059894594" }, { "code": "140426", "name": "黎城县", "longitude": "113.393432476", "latitude": "36.5086699014" }, { "code": "140427", "name": "壶关县", "longitude": "113.213579855", "latitude": "36.1213346042" }, { "code": "140428", "name": "长子县", "longitude": "112.88456585", "latitude": "36.1280015578" }, { "code": "140429", "name": "武乡县", "longitude": "112.870605644", "latitude": "36.8431679493" }, { "code": "140430", "name": "沁县", "longitude": "112.705458015", "latitude": "36.7621899386" }, { "code": "140431", "name": "沁源县", "longitude": "112.344452027", "latitude": "36.5061033509" } ] }, { "code": "1405", "name": "晋城市", "townList": [ { "code": "140502", "name": "城区", "longitude": "112.859583795", "latitude": "35.5072789246" }, { "code": "140521", "name": "沁水县", "longitude": "112.19342621", "latitude": "35.6963644625" }, { "code": "140522", "name": "阳城县", "longitude": "112.421453787", "latitude": "35.4921813204" }, { "code": "140524", "name": "陵川县", "longitude": "113.287406555", "latitude": "35.7817436395" }, { "code": "140525", "name": "泽州县", "longitude": "112.79440122", "latitude": "35.5997697295" }, { "code": "140581", "name": "高平市", "longitude": "112.930412399", "latitude": "35.8043367986" } ] }, { "code": "1406", "name": "朔州市", "townList": [ { "code": "140602", "name": "朔城区", "longitude": "112.438376426", "latitude": "39.3253027125" }, { "code": "140603", "name": "平鲁区", "longitude": "112.295525009", "latitude": "39.5173891042" }, { "code": "140621", "name": "山阴县", "longitude": "112.822431945", "latitude": "39.534030498" }, { "code": "140622", "name": "应县", "longitude": "113.197493539", "latitude": "39.5600778524" }, { "code": "140623", "name": "右玉县", "longitude": "112.473500081", "latitude": "39.9948595554" }, { "code": "140681", "name": "怀仁市", "longitude": "113.106608467", "latitude": "39.8337568895" } ] }, { "code": "1407", "name": "晋中市", "townList": [ { "code": "140702", "name": "榆次区", "longitude": "112.714503502", "latitude": "37.7039404868" }, { "code": "140703", "name": "太谷区", "longitude": "112.557384119", "latitude": "37.4273955773" }, { "code": "140721", "name": "榆社县", "longitude": "112.981598566", "latitude": "37.0763696687" }, { "code": "140722", "name": "左权县", "longitude": "113.38545184", "latitude": "37.0885551472" }, { "code": "140723", "name": "和顺县", "longitude": "113.576605683", "latitude": "37.3348077387" }, { "code": "140724", "name": "昔阳县", "longitude": "113.713612904", "latitude": "37.617884043" }, { "code": "140725", "name": "寿阳县", "longitude": "113.183410175", "latitude": "37.901307607" }, { "code": "140727", "name": "祁县", "longitude": "112.342442428", "latitude": "37.3641312835" }, { "code": "140728", "name": "平遥县", "longitude": "112.182455564", "latitude": "37.1956006907" }, { "code": "140729", "name": "灵石县", "longitude": "111.785617876", "latitude": "36.8533675013" }, { "code": "140781", "name": "介休市", "longitude": "111.923563197", "latitude": "37.0326864036" } ] }, { "code": "1408", "name": "运城市", "townList": [ { "code": "140802", "name": "盐湖区", "longitude": "111.004377115", "latitude": "35.0214253278" }, { "code": "140821", "name": "临猗县", "longitude": "110.780407004", "latitude": "35.1495422426" }, { "code": "140822", "name": "万荣县", "longitude": "110.84457611", "latitude": "35.4211088005" }, { "code": "140823", "name": "闻喜县", "longitude": "111.231410358", "latitude": "35.3629311964" }, { "code": "140824", "name": "稷山县", "longitude": "110.989414579", "latitude": "35.6104035696" }, { "code": "140825", "name": "新绛县", "longitude": "111.231406495", "latitude": "35.6226301031" }, { "code": "140826", "name": "绛县", "longitude": "111.575486521", "latitude": "35.4972763739" }, { "code": "140827", "name": "垣曲县", "longitude": "111.676606706", "latitude": "35.3030145174" }, { "code": "140828", "name": "夏县", "longitude": "111.226431499", "latitude": "35.1474617798" }, { "code": "140829", "name": "平陆县", "longitude": "111.223480476", "latitude": "34.8429251546" }, { "code": "140830", "name": "芮城县", "longitude": "110.700611513", "latitude": "34.6993881106" }, { "code": "140881", "name": "永济市", "longitude": "110.454577671", "latitude": "34.8728297147" }, { "code": "140882", "name": "河津市", "longitude": "110.718572144", "latitude": "35.6019265753" } ] }, { "code": "1409", "name": "忻州市", "townList": [ { "code": "140902", "name": "忻府区", "longitude": "112.752613664", "latitude": "38.4098798176" }, { "code": "140921", "name": "定襄县", "longitude": "112.963528612", "latitude": "38.4799743058" }, { "code": "140922", "name": "五台县", "longitude": "113.261451095", "latitude": "38.7341815906" }, { "code": "140923", "name": "代县", "longitude": "112.966551949", "latitude": "39.0727283464" }, { "code": "140924", "name": "繁峙县", "longitude": "113.271408273", "latitude": "39.1952374307" }, { "code": "140925", "name": "宁武县", "longitude": "112.326398242", "latitude": "39.0243423814" }, { "code": "140926", "name": "静乐县", "longitude": "111.945431906", "latitude": "38.3651470884" }, { "code": "140927", "name": "神池县", "longitude": "112.21738276", "latitude": "39.0968758249" }, { "code": "140928", "name": "五寨县", "longitude": "111.853409939", "latitude": "38.9170199097" }, { "code": "140929", "name": "岢岚县", "longitude": "111.579477782", "latitude": "38.7101510389" }, { "code": "140930", "name": "河曲县", "longitude": "111.144448635", "latitude": "39.3907024887" }, { "code": "140931", "name": "保德县", "longitude": "111.092541758", "latitude": "39.0283369324" }, { "code": "140932", "name": "偏关县", "longitude": "111.51447352", "latitude": "39.4422300904" }, { "code": "140981", "name": "原平市", "longitude": "112.717487134", "latitude": "38.7364758976" } ] }, { "code": "1410", "name": "临汾市", "townList": [ { "code": "141002", "name": "尧都区", "longitude": "111.586430217", "latitude": "36.0845622302" }, { "code": "141021", "name": "曲沃县", "longitude": "111.482396378", "latitude": "35.647327336" }, { "code": "141022", "name": "翼城县", "longitude": "111.725375532", "latitude": "35.744429075" }, { "code": "141023", "name": "襄汾县", "longitude": "111.448540052", "latitude": "35.8820626707" }, { "code": "141024", "name": "洪洞县", "longitude": "111.681589427", "latitude": "36.2594670794" }, { "code": "141025", "name": "古县", "longitude": "111.926573149", "latitude": "36.2723380648" }, { "code": "141026", "name": "安泽县", "longitude": "112.25661284", "latitude": "36.1535143805" }, { "code": "141027", "name": "浮山县", "longitude": "111.855384953", "latitude": "35.9743927539" }, { "code": "141028", "name": "吉县", "longitude": "110.688546372", "latitude": "36.103999062" }, { "code": "141029", "name": "乡宁县", "longitude": "110.853497901", "latitude": "35.9764416655" }, { "code": "141030", "name": "大宁县", "longitude": "110.759384409", "latitude": "36.4713056871" }, { "code": "141031", "name": "隰县", "longitude": "110.947591271", "latitude": "36.6990613832" }, { "code": "141032", "name": "永和县", "longitude": "110.638415894", "latitude": "36.7659086739" }, { "code": "141033", "name": "蒲县", "longitude": "111.102474053", "latitude": "36.4180054292" }, { "code": "141034", "name": "汾西县", "longitude": "111.569546296", "latitude": "36.6587822642" }, { "code": "141081", "name": "侯马市", "longitude": "111.378396585", "latitude": "35.6253648163" }, { "code": "141082", "name": "霍州市", "longitude": "111.761509422", "latitude": "36.5746069507" } ] }, { "code": "1411", "name": "吕梁市", "townList": [ { "code": "141102", "name": "离石区", "longitude": "111.157490774", "latitude": "37.5235774759" }, { "code": "141121", "name": "文水县", "longitude": "112.035598693", "latitude": "37.4443000827" }, { "code": "141122", "name": "交城县", "longitude": "112.162567709", "latitude": "37.5577722363" }, { "code": "141123", "name": "兴县", "longitude": "111.134392105", "latitude": "38.468803781" }, { "code": "141124", "name": "临县", "longitude": "110.998414881", "latitude": "37.9572106723" }, { "code": "141125", "name": "柳林县", "longitude": "110.895389839", "latitude": "37.4354929649" }, { "code": "141126", "name": "石楼县", "longitude": "110.841595532", "latitude": "37.004470503" }, { "code": "141127", "name": "岚县", "longitude": "111.67859223", "latitude": "38.2850287889" }, { "code": "141128", "name": "方山县", "longitude": "111.250370443", "latitude": "37.9010202392" }, { "code": "141129", "name": "中阳县", "longitude": "111.185629565", "latitude": "37.3628727924" }, { "code": "141130", "name": "交口县", "longitude": "111.187628205", "latitude": "36.9878726666" }, { "code": "141181", "name": "孝义市", "longitude": "111.785606018", "latitude": "37.1510633191" }, { "code": "141182", "name": "汾阳市", "longitude": "111.794596619", "latitude": "37.2712917945" } ] } ] }, { "code": "15", "name": "内蒙古自治区", "cityList": [ { "code": "1501", "name": "呼和浩特市", "townList": [ { "code": "150102", "name": "新城区", "longitude": "111.671620122", "latitude": "40.8638770212" }, { "code": "150103", "name": "回民区", "longitude": "111.630470184", "latitude": "40.8145063629" }, { "code": "150104", "name": "玉泉区", "longitude": "111.681575144", "latitude": "40.7580589686" }, { "code": "150105", "name": "赛罕区", "longitude": "111.708420645", "latitude": "40.798394237" }, { "code": "150121", "name": "土默特左旗", "longitude": "111.169586727", "latitude": "40.7352937118" }, { "code": "150122", "name": "托克托县", "longitude": "111.200574943", "latitude": "40.283146729" }, { "code": "150123", "name": "和林格尔县", "longitude": "111.828430218", "latitude": "40.3847977443" }, { "code": "150124", "name": "清水河县", "longitude": "111.653576488", "latitude": "39.9263338544" }, { "code": "150125", "name": "武川县", "longitude": "111.457497056", "latitude": "41.1024187238" } ] }, { "code": "1502", "name": "包头市", "townList": [ { "code": "150202", "name": "东河区", "longitude": "110.050394809", "latitude": "40.5822280383" }, { "code": "150203", "name": "昆都仑区", "longitude": "109.845538303", "latitude": "40.6476441069" }, { "code": "150204", "name": "青山区", "longitude": "109.907416012", "latitude": "40.6494730688" }, { "code": "150205", "name": "石拐区", "longitude": "110.067676859", "latitude": "40.6829991177" }, { "code": "150206", "name": "白云鄂博矿区", "longitude": "109.979625762", "latitude": "41.7749952342" }, { "code": "150207", "name": "九原区", "longitude": "109.969588006", "latitude": "40.6133965894" }, { "code": "150221", "name": "土默特右旗", "longitude": "110.530389267", "latitude": "40.5751274291" }, { "code": "150222", "name": "固阳县", "longitude": "110.066432616", "latitude": "41.0401628527" }, { "code": "150223", "name": "达尔罕茂明安联合旗", "longitude": "110.439520903", "latitude": "41.704548551" } ] }, { "code": "1503", "name": "乌海市", "townList": [ { "code": "150302", "name": "海勃湾区", "longitude": "106.829438567", "latitude": "39.6969079935" }, { "code": "150303", "name": "海南区", "longitude": "106.89847101", "latitude": "39.4468275151" }, { "code": "150304", "name": "乌达区", "longitude": "106.732606354", "latitude": "39.5114689161" } ] }, { "code": "1504", "name": "赤峰市", "townList": [ { "code": "150402", "name": "红山区", "longitude": "118.963563537", "latitude": "42.2704784353" }, { "code": "150403", "name": "元宝山区", "longitude": "119.295404509", "latitude": "42.0451247156" }, { "code": "150404", "name": "松山区", "longitude": "118.939413851", "latitude": "42.2924815727" }, { "code": "150421", "name": "阿鲁科尔沁旗", "longitude": "120.072613855", "latitude": "43.8779534122" }, { "code": "150422", "name": "巴林左旗", "longitude": "119.386443281", "latitude": "43.9763825946" }, { "code": "150423", "name": "巴林右旗", "longitude": "118.670394257", "latitude": "43.5401315531" }, { "code": "150424", "name": "林西县", "longitude": "118.062461422", "latitude": "43.6242102593" }, { "code": "150425", "name": "克什克腾旗", "longitude": "117.551620411", "latitude": "43.2707575919" }, { "code": "150426", "name": "翁牛特旗", "longitude": "119.01250888", "latitude": "42.9420192622" }, { "code": "150428", "name": "喀喇沁旗", "longitude": "118.710473684", "latitude": "41.9322143356" }, { "code": "150429", "name": "宁城县", "longitude": "119.350608976", "latitude": "41.6002451483" }, { "code": "150430", "name": "敖汉旗", "longitude": "119.927577939", "latitude": "42.2965070852" } ] }, { "code": "1505", "name": "通辽市", "townList": [ { "code": "150502", "name": "科尔沁区", "longitude": "122.262457034", "latitude": "43.6287124888" }, { "code": "150521", "name": "科尔沁左翼中旗", "longitude": "123.318588534", "latitude": "44.1322942283" }, { "code": "150522", "name": "科尔沁左翼后旗", "longitude": "122.363562576", "latitude": "42.939562494" }, { "code": "150523", "name": "开鲁县", "longitude": "121.325385688", "latitude": "43.6063694314" }, { "code": "150524", "name": "库伦旗", "longitude": "121.817405762", "latitude": "42.7412111002" }, { "code": "150525", "name": "奈曼旗", "longitude": "120.664646413", "latitude": "42.8718465467" }, { "code": "150526", "name": "扎鲁特旗", "longitude": "120.918625857", "latitude": "44.5622131331" }, { "code": "150581", "name": "霍林郭勒市", "longitude": "119.670465914", "latitude": "45.5375133206" } ] }, { "code": "1506", "name": "鄂尔多斯市", "townList": [ { "code": "150602", "name": "东胜区", "longitude": "109.969560069", "latitude": "39.8279869844" }, { "code": "150603", "name": "康巴什区", "longitude": "109.869627354", "latitude": "39.6163781468" }, { "code": "150621", "name": "达拉特旗", "longitude": "110.040366126", "latitude": "40.4189071544" }, { "code": "150622", "name": "准格尔旗", "longitude": "111.246398405", "latitude": "39.870540265" }, { "code": "150623", "name": "鄂托克前旗", "longitude": "107.484584723", "latitude": "38.1882167413" }, { "code": "150624", "name": "鄂托克旗", "longitude": "107.98244495", "latitude": "39.0952934136" }, { "code": "150625", "name": "杭锦旗", "longitude": "108.742412939", "latitude": "39.8388157688" }, { "code": "150626", "name": "乌审旗", "longitude": "108.824434969", "latitude": "38.6100265212" }, { "code": "150627", "name": "伊金霍洛旗", "longitude": "109.75459044", "latitude": "39.5700928152" } ] }, { "code": "1507", "name": "呼伦贝尔市", "townList": [ { "code": "150702", "name": "海拉尔区", "longitude": "119.74246537", "latitude": "49.2182157994" }, { "code": "150703", "name": "扎赉诺尔区", "longitude": "117.694532273", "latitude": "49.4677701836" }, { "code": "150721", "name": "阿荣旗", "longitude": "123.465440005", "latitude": "48.131971245" }, { "code": "150722", "name": "莫力达瓦达斡尔族自治旗", "longitude": "124.525476619", "latitude": "48.483463826" }, { "code": "150723", "name": "鄂伦春自治旗", "longitude": "123.732345077", "latitude": "50.5979479281" }, { "code": "150724", "name": "鄂温克族自治旗", "longitude": "119.761351255", "latitude": "49.153044764" }, { "code": "150725", "name": "陈巴尔虎旗", "longitude": "119.430462487", "latitude": "49.3349142889" }, { "code": "150726", "name": "新巴尔虎左旗", "longitude": "118.276608373", "latitude": "48.22378676" }, { "code": "150727", "name": "新巴尔虎右旗", "longitude": "116.830632404", "latitude": "48.6770535991" }, { "code": "150781", "name": "满洲里市", "longitude": "117.385435858", "latitude": "49.6040988549" }, { "code": "150782", "name": "牙克石市", "longitude": "120.718346837", "latitude": "49.2920236932" }, { "code": "150783", "name": "扎兰屯市", "longitude": "122.744453715", "latitude": "48.0199555201" }, { "code": "150784", "name": "额尔古纳市", "longitude": "120.186633697", "latitude": "50.2481317586" }, { "code": "150785", "name": "根河市", "longitude": "121.527585266", "latitude": "50.7861404343" } ] }, { "code": "1508", "name": "巴彦淖尔市", "townList": [ { "code": "150802", "name": "临河区", "longitude": "107.369533796", "latitude": "40.7566807258" }, { "code": "150821", "name": "五原县", "longitude": "108.273491354", "latitude": "41.0944548215" }, { "code": "150822", "name": "磴口县", "longitude": "107.01452247", "latitude": "40.3364701771" }, { "code": "150823", "name": "乌拉特前旗", "longitude": "108.658615138", "latitude": "40.7421035129" }, { "code": "150824", "name": "乌拉特中旗", "longitude": "108.51951244", "latitude": "41.5933462637" }, { "code": "150825", "name": "乌拉特后旗", "longitude": "107.081546122", "latitude": "41.0894222693" }, { "code": "150826", "name": "杭锦后旗", "longitude": "107.157372449", "latitude": "40.8921794198" } ] }, { "code": "1509", "name": "乌兰察布市", "townList": [ { "code": "150902", "name": "集宁区", "longitude": "113.120586999", "latitude": "41.0411461718" }, { "code": "150921", "name": "卓资县", "longitude": "112.584409551", "latitude": "40.9002918378" }, { "code": "150922", "name": "化德县", "longitude": "114.016408784", "latitude": "41.9096025871" }, { "code": "150923", "name": "商都县", "longitude": "113.584639229", "latitude": "41.5675666372" }, { "code": "150924", "name": "兴和县", "longitude": "113.840578866", "latitude": "40.8793417989" }, { "code": "150925", "name": "凉城县", "longitude": "112.510600189", "latitude": "40.5371631252" }, { "code": "150926", "name": "察哈尔右翼前旗", "longitude": "113.221605317", "latitude": "40.7912673026" }, { "code": "150927", "name": "察哈尔右翼中旗", "longitude": "112.642580402", "latitude": "41.2832729433" }, { "code": "150928", "name": "察哈尔右翼后旗", "longitude": "113.198530902", "latitude": "41.4417709997" }, { "code": "150929", "name": "四子王旗", "longitude": "111.712419272", "latitude": "41.5393533499" }, { "code": "150981", "name": "丰镇市", "longitude": "113.116601218", "latitude": "40.4418048088" } ] }, { "code": "1522", "name": "兴安盟", "townList": [ { "code": "152201", "name": "乌兰浩特市", "longitude": "122.099622352", "latitude": "46.0786543436" }, { "code": "152202", "name": "阿尔山市", "longitude": "119.950653152", "latitude": "47.1830541537" }, { "code": "152221", "name": "科尔沁右翼前旗", "longitude": "121.95909027", "latitude": "46.0856856296" }, { "code": "152222", "name": "科尔沁右翼中旗", "longitude": "121.483547815", "latitude": "45.0664709934" }, { "code": "152223", "name": "扎赉特旗", "longitude": "122.906444429", "latitude": "46.7291895394" }, { "code": "152224", "name": "突泉县", "longitude": "121.60054537", "latitude": "45.3878303426" } ] }, { "code": "1525", "name": "锡林郭勒盟", "townList": [ { "code": "152501", "name": "二连浩特市", "longitude": "111.958363193", "latitude": "43.6488001841" }, { "code": "152502", "name": "锡林浩特市", "longitude": "116.093613885", "latitude": "43.9383338014" }, { "code": "152522", "name": "阿巴嘎旗", "longitude": "114.957367098", "latitude": "44.028101587" }, { "code": "152523", "name": "苏尼特左旗", "longitude": "113.673479937", "latitude": "43.8655536578" }, { "code": "152524", "name": "苏尼特右旗", "longitude": "112.648569045", "latitude": "42.7473689225" }, { "code": "152525", "name": "东乌珠穆沁旗", "longitude": "116.97850436", "latitude": "45.5157433053" }, { "code": "152526", "name": "西乌珠穆沁旗", "longitude": "117.616377009", "latitude": "44.593802912" }, { "code": "152527", "name": "太仆寺旗", "longitude": "115.290535316", "latitude": "41.882291746" }, { "code": "152528", "name": "镶黄旗", "longitude": "113.854505386", "latitude": "42.2376612853" }, { "code": "152529", "name": "正镶白旗", "longitude": "115.036621718", "latitude": "42.2926054292" }, { "code": "152530", "name": "正蓝旗", "longitude": "115.998603884", "latitude": "42.2471188442" }, { "code": "152531", "name": "多伦县", "longitude": "116.492508782", "latitude": "42.2089208642" } ] }, { "code": "1529", "name": "阿拉善盟", "townList": [ { "code": "152921", "name": "阿拉善左旗", "longitude": "105.672598665", "latitude": "38.8390941374" }, { "code": "152922", "name": "阿拉善右旗", "longitude": "101.673463896", "latitude": "39.2222409699" }, { "code": "152923", "name": "额济纳旗", "longitude": "101.062403341", "latitude": "41.9602976118" } ] } ] }, { "code": "21", "name": "辽宁省", "cityList": [ { "code": "2101", "name": "沈阳市", "townList": [ { "code": "210102", "name": "和平区", "longitude": "123.426644266", "latitude": "41.7952360529" }, { "code": "210103", "name": "沈河区", "longitude": "123.465461035", "latitude": "41.8022741388" }, { "code": "210104", "name": "大东区", "longitude": "123.476404732", "latitude": "41.8114251745" }, { "code": "210105", "name": "皇姑区", "longitude": "123.431620789", "latitude": "41.8260421203" }, { "code": "210106", "name": "铁西区", "longitude": "123.383435951", "latitude": "41.8090378322" }, { "code": "210111", "name": "苏家屯区", "longitude": "123.350434632", "latitude": "41.671253645" }, { "code": "210112", "name": "浑南区", "longitude": "123.455989931", "latitude": "41.7209156689" }, { "code": "210113", "name": "沈北新区", "longitude": "123.590774834", "latitude": "41.9198641989" }, { "code": "210114", "name": "于洪区", "longitude": "123.314633025", "latitude": "41.7996682556" }, { "code": "210115", "name": "辽中区", "longitude": "122.77237836", "latitude": "41.5231490818" }, { "code": "210123", "name": "康平县", "longitude": "123.337511249", "latitude": "42.7499254957" }, { "code": "210124", "name": "法库县", "longitude": "123.414621076", "latitude": "42.5096065499" }, { "code": "210181", "name": "新民市", "longitude": "122.842528654", "latitude": "41.9915132916" } ] }, { "code": "2102", "name": "大连市", "townList": [ { "code": "210202", "name": "中山区", "longitude": "121.651547394", "latitude": "38.9245111155" }, { "code": "210203", "name": "西岗区", "longitude": "121.618625126", "latitude": "38.9204726893" }, { "code": "210204", "name": "沙河口区", "longitude": "121.594506701", "latitude": "38.913544291" }, { "code": "210211", "name": "甘井子区", "longitude": "121.531518955", "latitude": "38.9580021629" }, { "code": "210212", "name": "旅顺口区", "longitude": "121.26859688", "latitude": "38.8568322229" }, { "code": "210213", "name": "金州区", "longitude": "121.789435583", "latitude": "39.0564329917" }, { "code": "210214", "name": "普兰店区", "longitude": "121.946459835", "latitude": "39.3980891452" }, { "code": "210224", "name": "长海县", "longitude": "122.594626516", "latitude": "39.2782702172" }, { "code": "210281", "name": "瓦房店市", "longitude": "121.985637543", "latitude": "39.6327407474" }, { "code": "210283", "name": "庄河市", "longitude": "122.974495483", "latitude": "39.6869560789" } ] }, { "code": "2103", "name": "鞍山市", "townList": [ { "code": "210302", "name": "铁东区", "longitude": "122.997399668", "latitude": "41.0963318705" }, { "code": "210303", "name": "铁西区", "longitude": "122.975490266", "latitude": "41.1254752596" }, { "code": "210304", "name": "立山区", "longitude": "123.035484139", "latitude": "41.1561161211" }, { "code": "210311", "name": "千山区", "longitude": "122.967574218", "latitude": "41.0809386089" }, { "code": "210321", "name": "台安县", "longitude": "122.442550041", "latitude": "41.4185903711" }, { "code": "210323", "name": "岫岩满族自治县", "longitude": "123.287546778", "latitude": "40.2958923964" }, { "code": "210381", "name": "海城市", "longitude": "122.691569401", "latitude": "40.8876339471" } ] }, { "code": "2104", "name": "抚顺市", "townList": [ { "code": "210402", "name": "新抚区", "longitude": "123.919582318", "latitude": "41.8678058586" }, { "code": "210403", "name": "东洲区", "longitude": "124.045549724", "latitude": "41.8591909366" }, { "code": "210404", "name": "望花区", "longitude": "123.790604152", "latitude": "41.8590303627" }, { "code": "210411", "name": "顺城区", "longitude": "123.951414043", "latitude": "41.8891637885" }, { "code": "210421", "name": "抚顺县", "longitude": "123.921590121", "latitude": "41.8870374754" }, { "code": "210422", "name": "新宾满族自治县", "longitude": "125.046356204", "latitude": "41.7399687751" }, { "code": "210423", "name": "清原满族自治县", "longitude": "124.930360259", "latitude": "42.1067609926" } ] }, { "code": "2105", "name": "本溪市", "townList": [ { "code": "210502", "name": "平山区", "longitude": "123.774614224", "latitude": "41.3016041818" }, { "code": "210503", "name": "溪湖区", "longitude": "123.774610541", "latitude": "41.3348029314" }, { "code": "210504", "name": "明山区", "longitude": "123.823474498", "latitude": "41.3149393689" }, { "code": "210505", "name": "南芬区", "longitude": "123.751467137", "latitude": "41.1070957232" }, { "code": "210521", "name": "本溪满族自治县", "longitude": "124.127584869", "latitude": "41.3079028814" }, { "code": "210522", "name": "桓仁满族自治县", "longitude": "125.367544351", "latitude": "41.272925301" } ] }, { "code": "2106", "name": "丹东市", "townList": [ { "code": "210602", "name": "元宝区", "longitude": "124.402584033", "latitude": "40.1422514631" }, { "code": "210603", "name": "振兴区", "longitude": "124.366578511", "latitude": "40.1107194722" }, { "code": "210604", "name": "振安区", "longitude": "124.434386923", "latitude": "40.1646970257" }, { "code": "210624", "name": "宽甸满族自治县", "longitude": "124.790426629", "latitude": "40.7375532005" }, { "code": "210681", "name": "东港市", "longitude": "124.159610359", "latitude": "39.8677161873" }, { "code": "210682", "name": "凤城市", "longitude": "124.072421724", "latitude": "40.4591804825" } ] }, { "code": "2107", "name": "锦州市", "townList": [ { "code": "210702", "name": "古塔区", "longitude": "121.134584969", "latitude": "41.1229009259" }, { "code": "210703", "name": "凌河区", "longitude": "121.157590034", "latitude": "41.1206906145" }, { "code": "210711", "name": "太和区", "longitude": "121.110453249", "latitude": "41.1151093071" }, { "code": "210726", "name": "黑山县", "longitude": "122.132925781", "latitude": "41.659497251" }, { "code": "210727", "name": "义县", "longitude": "121.245568549", "latitude": "41.5389388623" }, { "code": "210781", "name": "凌海市", "longitude": "121.362538796", "latitude": "41.1664876286" }, { "code": "210782", "name": "北镇市", "longitude": "121.783447298", "latitude": "41.5944280968" } ] }, { "code": "2108", "name": "营口市", "townList": [ { "code": "210802", "name": "站前区", "longitude": "122.265437432", "latitude": "40.6787641259" }, { "code": "210803", "name": "西市区", "longitude": "122.213582387", "latitude": "40.6721109263" }, { "code": "210804", "name": "鲅鱼圈区", "longitude": "122.127573497", "latitude": "40.2323398508" }, { "code": "210811", "name": "老边区", "longitude": "122.386439184", "latitude": "40.6863836198" }, { "code": "210881", "name": "盖州市", "longitude": "122.355591283", "latitude": "40.4061674573" }, { "code": "210882", "name": "大石桥市", "longitude": "122.515379531", "latitude": "40.6508021648" } ] }, { "code": "2109", "name": "阜新市", "townList": [ { "code": "210902", "name": "海州区", "longitude": "121.669435711", "latitude": "42.0237347894" }, { "code": "210903", "name": "新邱区", "longitude": "121.799363386", "latitude": "42.0939345148" }, { "code": "210904", "name": "太平区", "longitude": "121.685384137", "latitude": "42.0169678541" }, { "code": "210905", "name": "清河门区", "longitude": "121.42247895", "latitude": "41.789318551" }, { "code": "210911", "name": "细河区", "longitude": "121.686392305", "latitude": "42.0318712459" }, { "code": "210921", "name": "阜新蒙古族自治县", "longitude": "121.763573996", "latitude": "42.0713681538" }, { "code": "210922", "name": "彰武县", "longitude": "122.54544932", "latitude": "42.3927065344" } ] }, { "code": "2110", "name": "辽阳市", "townList": [ { "code": "211002", "name": "白塔区", "longitude": "123.181156684", "latitude": "41.27604732" }, { "code": "211003", "name": "文圣区", "longitude": "123.238003523", "latitude": "41.2899987357" }, { "code": "211004", "name": "宏伟区", "longitude": "123.203580186", "latitude": "41.2233681084" }, { "code": "211005", "name": "弓长岭区", "longitude": "123.426615431", "latitude": "41.1573270427" }, { "code": "211011", "name": "太子河区", "longitude": "123.188456584", "latitude": "41.2592539036" }, { "code": "211021", "name": "辽阳县", "longitude": "123.112421221", "latitude": "41.2116787718" }, { "code": "211081", "name": "灯塔市", "longitude": "123.345462151", "latitude": "41.4324741259" } ] }, { "code": "2111", "name": "盘锦市", "townList": [ { "code": "211102", "name": "双台子区", "longitude": "122.046392999", "latitude": "41.2060716175" }, { "code": "211103", "name": "兴隆台区", "longitude": "122.076498541", "latitude": "41.1644994324" }, { "code": "211104", "name": "大洼区", "longitude": "122.088554789", "latitude": "41.008178789" }, { "code": "211122", "name": "盘山县", "longitude": "122.003560355", "latitude": "41.2482636826" } ] }, { "code": "2112", "name": "铁岭市", "townList": [ { "code": "211202", "name": "银州区", "longitude": "123.848386396", "latitude": "42.2925736814" }, { "code": "211204", "name": "清河区", "longitude": "124.16556298", "latitude": "42.5524947935" }, { "code": "211221", "name": "铁岭县", "longitude": "123.735372377", "latitude": "42.229225608" }, { "code": "211223", "name": "西丰县", "longitude": "124.733615093", "latitude": "42.7440144424" }, { "code": "211224", "name": "昌图县", "longitude": "124.117500671", "latitude": "42.7921783718" }, { "code": "211281", "name": "调兵山市", "longitude": "123.573508683", "latitude": "42.4737380121" }, { "code": "211282", "name": "开原市", "longitude": "124.044568864", "latitude": "42.5520790748" } ] }, { "code": "2113", "name": "朝阳市", "townList": [ { "code": "211302", "name": "双塔区", "longitude": "120.460486903", "latitude": "41.5717795009" }, { "code": "211303", "name": "龙城区", "longitude": "120.443566869", "latitude": "41.598468523" }, { "code": "211321", "name": "朝阳县", "longitude": "120.396189698", "latitude": "41.5037454426" }, { "code": "211322", "name": "建平县", "longitude": "119.649380358", "latitude": "41.409455511" }, { "code": "211324", "name": "喀喇沁左翼蒙古族自治县", "longitude": "119.747414055", "latitude": "41.1336891198" }, { "code": "211381", "name": "北票市", "longitude": "120.777627734", "latitude": "41.8064825689" }, { "code": "211382", "name": "凌源市", "longitude": "119.407358079", "latitude": "41.2516512971" } ] }, { "code": "2114", "name": "葫芦岛市", "townList": [ { "code": "211402", "name": "连山区", "longitude": "120.876481674", "latitude": "40.7808938084" }, { "code": "211403", "name": "龙港区", "longitude": "120.90062076", "latitude": "40.7410566012" }, { "code": "211404", "name": "南票区", "longitude": "120.756493121", "latitude": "41.1130975958" }, { "code": "211421", "name": "绥中县", "longitude": "120.350424535", "latitude": "40.3318434754" }, { "code": "211422", "name": "建昌县", "longitude": "119.843595267", "latitude": "40.8303799538" }, { "code": "211481", "name": "兴城市", "longitude": "120.764558467", "latitude": "40.616555664" } ] } ] }, { "code": "22", "name": "吉林省", "cityList": [ { "code": "2201", "name": "长春市", "townList": [ { "code": "220102", "name": "南关区", "longitude": "125.356609817", "latitude": "43.8698730252" }, { "code": "220103", "name": "宽城区", "longitude": "125.334624508", "latitude": "43.9495022398" }, { "code": "220104", "name": "朝阳区", "longitude": "125.295401256", "latitude": "43.840641475" }, { "code": "220105", "name": "二道区", "longitude": "125.380467554", "latitude": "43.8712765243" }, { "code": "220106", "name": "绿园区", "longitude": "125.262442606", "latitude": "43.8868104039" }, { "code": "220112", "name": "双阳区", "longitude": "125.671447932", "latitude": "43.5310913091" }, { "code": "220113", "name": "九台区", "longitude": "125.845564423", "latitude": "44.1577918539" }, { "code": "220122", "name": "农安县", "longitude": "125.191484107", "latitude": "44.4389039513" }, { "code": "220182", "name": "榆树市", "longitude": "126.539609363", "latitude": "44.8454397277" }, { "code": "220183", "name": "德惠市", "longitude": "125.734515177", "latitude": "44.5271610666" }, { "code": "220184", "name": "公主岭市", "longitude": "124.829448661", "latitude": "43.5108326632" } ] }, { "code": "2202", "name": "吉林市", "townList": [ { "code": "220202", "name": "昌邑区", "longitude": "126.581448661", "latitude": "43.8879924747" }, { "code": "220203", "name": "龙潭区", "longitude": "126.568544592", "latitude": "43.9163425536" }, { "code": "220204", "name": "船营区", "longitude": "126.547649737", "latitude": "43.8399274023" }, { "code": "220211", "name": "丰满区", "longitude": "126.568570464", "latitude": "43.8271515768" }, { "code": "220221", "name": "永吉县", "longitude": "126.50441573", "latitude": "43.678720677" }, { "code": "220281", "name": "蛟河市", "longitude": "127.351480187", "latitude": "43.7300038705" }, { "code": "220282", "name": "桦甸市", "longitude": "126.752484234", "latitude": "42.9779827799" }, { "code": "220283", "name": "舒兰市", "longitude": "126.971377032", "latitude": "44.4122700283" }, { "code": "220284", "name": "磐石市", "longitude": "126.066616299", "latitude": "42.9518175001" } ] }, { "code": "2203", "name": "四平市", "townList": [ { "code": "220302", "name": "铁西区", "longitude": "124.35246676", "latitude": "43.1525753918" }, { "code": "220303", "name": "铁东区", "longitude": "124.416482706", "latitude": "43.1679939932" }, { "code": "220322", "name": "梨树县", "longitude": "124.342401247", "latitude": "43.3133455156" }, { "code": "220323", "name": "伊通满族自治县", "longitude": "125.311484608", "latitude": "43.3511036668" }, { "code": "220382", "name": "双辽市", "longitude": "123.509437761", "latitude": "43.5245273822" } ] }, { "code": "2204", "name": "辽源市", "townList": [ { "code": "220402", "name": "龙山区", "longitude": "125.14345243", "latitude": "42.9076340121" }, { "code": "220403", "name": "西安区", "longitude": "125.155373303", "latitude": "42.9333084206" }, { "code": "220421", "name": "东丰县", "longitude": "125.537377901", "latitude": "42.6833107786" }, { "code": "220422", "name": "东辽县", "longitude": "124.997589444", "latitude": "42.9318791018" } ] }, { "code": "2205", "name": "通化市", "townList": [ { "code": "220502", "name": "东昌区", "longitude": "125.93359459", "latitude": "41.7084053848" }, { "code": "220503", "name": "二道江区", "longitude": "126.049591703", "latitude": "41.7799661745" }, { "code": "220521", "name": "通化县", "longitude": "125.765391914", "latitude": "41.6856822381" }, { "code": "220523", "name": "辉南县", "longitude": "126.053581257", "latitude": "42.6906998819" }, { "code": "220524", "name": "柳河县", "longitude": "125.751423982", "latitude": "42.2908712151" }, { "code": "220581", "name": "梅河口市", "longitude": "125.71760781", "latitude": "42.5448838903" }, { "code": "220582", "name": "集安市", "longitude": "126.199577372", "latitude": "41.131299724" } ] }, { "code": "2206", "name": "白山市", "townList": [ { "code": "220602", "name": "浑江区", "longitude": "126.423619527", "latitude": "41.9504237282" }, { "code": "220605", "name": "江源区", "longitude": "126.597390979", "latitude": "42.0629393721" }, { "code": "220621", "name": "抚松县", "longitude": "127.455371195", "latitude": "42.2273352726" }, { "code": "220622", "name": "靖宇县", "longitude": "126.819498993", "latitude": "42.3947657346" }, { "code": "220623", "name": "长白朝鲜族自治县", "longitude": "128.207584202", "latitude": "41.4258958126" }, { "code": "220681", "name": "临江市", "longitude": "126.924581514", "latitude": "41.817678644" } ] }, { "code": "2207", "name": "松原市", "townList": [ { "code": "220702", "name": "宁江区", "longitude": "124.823422548", "latitude": "45.1780394387" }, { "code": "220721", "name": "前郭尔罗斯蒙古族自治县", "longitude": "124.830455562", "latitude": "45.1234160929" }, { "code": "220722", "name": "长岭县", "longitude": "123.974374103", "latitude": "44.2816382801" }, { "code": "220723", "name": "乾安县", "longitude": "124.047563805", "latitude": "45.0084343216" }, { "code": "220781", "name": "扶余市", "longitude": "126.056606211", "latitude": "44.9941684212" } ] }, { "code": "2208", "name": "白城市", "townList": [ { "code": "220802", "name": "洮北区", "longitude": "122.857509775", "latitude": "45.6275246865" }, { "code": "220821", "name": "镇赉县", "longitude": "123.206575756", "latitude": "45.8531166354" }, { "code": "220822", "name": "通榆县", "longitude": "123.094520777", "latitude": "44.8189637359" }, { "code": "220881", "name": "洮南市", "longitude": "122.794467683", "latitude": "45.3411318726" }, { "code": "220882", "name": "大安市", "longitude": "124.298504281", "latitude": "45.5130451496" } ] }, { "code": "2224", "name": "延边朝鲜族自治州", "townList": [ { "code": "222401", "name": "延吉市", "longitude": "129.520520137", "latitude": "42.9127170099" }, { "code": "222402", "name": "图们市", "longitude": "129.850381514", "latitude": "42.9742834991" }, { "code": "222403", "name": "敦化市", "longitude": "128.238612393", "latitude": "43.3782912745" }, { "code": "222404", "name": "珲春市", "longitude": "130.372613219", "latitude": "42.8685151152" }, { "code": "222405", "name": "龙井市", "longitude": "129.432634777", "latitude": "42.7715348683" }, { "code": "222406", "name": "和龙市", "longitude": "129.017387126", "latitude": "42.5523225684" }, { "code": "222424", "name": "汪清县", "longitude": "129.777608796", "latitude": "43.3184508339" }, { "code": "222426", "name": "安图县", "longitude": "128.905448468", "latitude": "43.1179169549" } ] } ] }, { "code": "23", "name": "黑龙江省", "cityList": [ { "code": "2301", "name": "哈尔滨市", "townList": [ { "code": "230102", "name": "道里区", "longitude": "126.623431588", "latitude": "45.7618444788" }, { "code": "230103", "name": "南岗区", "longitude": "126.6756385", "latitude": "45.7658661638" }, { "code": "230104", "name": "道外区", "longitude": "126.655604041", "latitude": "45.7977762204" }, { "code": "230108", "name": "平房区", "longitude": "126.643547074", "latitude": "45.6038622956" }, { "code": "230109", "name": "松北区", "longitude": "126.516482568", "latitude": "45.8085925614" }, { "code": "230110", "name": "香坊区", "longitude": "126.669624344", "latitude": "45.7136196454" }, { "code": "230111", "name": "呼兰区", "longitude": "126.594398983", "latitude": "45.8952097809" }, { "code": "230112", "name": "阿城区", "longitude": "126.964356496", "latitude": "45.5542753044" }, { "code": "230113", "name": "双城区", "longitude": "126.319623138", "latitude": "45.3881115224" }, { "code": "230123", "name": "依兰县", "longitude": "129.574519697", "latitude": "46.3312602891" }, { "code": "230124", "name": "方正县", "longitude": "128.835633681", "latitude": "45.8577584401" }, { "code": "230125", "name": "宾县", "longitude": "127.473497014", "latitude": "45.7524653867" }, { "code": "230126", "name": "巴彦县", "longitude": "127.410547986", "latitude": "46.0912826578" }, { "code": "230127", "name": "木兰县", "longitude": "128.050356205", "latitude": "45.9568713194" }, { "code": "230128", "name": "通河县", "longitude": "128.752416276", "latitude": "45.9963925909" }, { "code": "230129", "name": "延寿县", "longitude": "128.338605824", "latitude": "45.4576411957" }, { "code": "230183", "name": "尚志市", "longitude": "128.015488207", "latitude": "45.2154739419" }, { "code": "230184", "name": "五常市", "longitude": "127.17352883", "latitude": "44.9378428558" } ] }, { "code": "2302", "name": "齐齐哈尔市", "townList": [ { "code": "230202", "name": "龙沙区", "longitude": "123.964376223", "latitude": "47.3235769774" }, { "code": "230203", "name": "建华区", "longitude": "123.961350101", "latitude": "47.360554871" }, { "code": "230204", "name": "铁锋区", "longitude": "123.984415712", "latitude": "47.3470188638" }, { "code": "230205", "name": "昂昂溪区", "longitude": "123.829406269", "latitude": "47.1613322436" }, { "code": "230206", "name": "富拉尔基区", "longitude": "123.636509803", "latitude": "47.2155040828" }, { "code": "230207", "name": "碾子山区", "longitude": "122.894366801", "latitude": "47.5232362981" }, { "code": "230208", "name": "梅里斯达斡尔族区", "longitude": "123.759540917", "latitude": "47.3155495741" }, { "code": "230221", "name": "龙江县", "longitude": "123.211538983", "latitude": "47.3436057402" }, { "code": "230223", "name": "依安县", "longitude": "125.312482166", "latitude": "47.8994836514" }, { "code": "230224", "name": "泰来县", "longitude": "123.423626309", "latitude": "46.3978292852" }, { "code": "230225", "name": "甘南县", "longitude": "123.512485882", "latitude": "47.9268840695" }, { "code": "230227", "name": "富裕县", "longitude": "124.480542479", "latitude": "47.7802280633" }, { "code": "230229", "name": "克山县", "longitude": "125.881378327", "latitude": "48.0431723607" }, { "code": "230230", "name": "克东县", "longitude": "126.255386748", "latitude": "48.0482441605" }, { "code": "230231", "name": "拜泉县", "longitude": "126.10542147", "latitude": "47.601867302" }, { "code": "230281", "name": "讷河市", "longitude": "124.889167822", "latitude": "48.472528044" } ] }, { "code": "2303", "name": "鸡西市", "townList": [ { "code": "230302", "name": "鸡冠区", "longitude": "130.987631609", "latitude": "45.3098063443" }, { "code": "230303", "name": "恒山区", "longitude": "130.911385233", "latitude": "45.2169718832" }, { "code": "230304", "name": "滴道区", "longitude": "130.850580461", "latitude": "45.3544336172" }, { "code": "230305", "name": "梨树区", "longitude": "130.703396067", "latitude": "45.098241781" }, { "code": "230306", "name": "城子河区", "longitude": "131.01846864", "latitude": "45.3444351939" }, { "code": "230307", "name": "麻山区", "longitude": "130.484536416", "latitude": "45.2179349968" }, { "code": "230321", "name": "鸡东县", "longitude": "131.130558483", "latitude": "45.2661845608" }, { "code": "230381", "name": "虎林市", "longitude": "132.943465663", "latitude": "45.7689469129" }, { "code": "230382", "name": "密山市", "longitude": "131.853531107", "latitude": "45.5356408097" } ] }, { "code": "2304", "name": "鹤岗市", "townList": [ { "code": "230402", "name": "向阳区", "longitude": "130.300468048", "latitude": "47.3485808891" }, { "code": "230403", "name": "工农区", "longitude": "130.281617286", "latitude": "47.3244302995" }, { "code": "230404", "name": "南山区", "longitude": "130.293540316", "latitude": "47.3212459388" }, { "code": "230405", "name": "兴安区", "longitude": "130.245545739", "latitude": "47.2587162695" }, { "code": "230406", "name": "东山区", "longitude": "130.323361094", "latitude": "47.3449871356" }, { "code": "230407", "name": "兴山区", "longitude": "130.317363647", "latitude": "47.3960453813" }, { "code": "230421", "name": "萝北县", "longitude": "130.835495037", "latitude": "47.583422197" }, { "code": "230422", "name": "绥滨县", "longitude": "131.859486513", "latitude": "47.2952654581" } ] }, { "code": "2305", "name": "双鸭山市", "townList": [ { "code": "230502", "name": "尖山区", "longitude": "131.165341771", "latitude": "46.6525859238" }, { "code": "230503", "name": "岭东区", "longitude": "131.171546996", "latitude": "46.599014332" }, { "code": "230505", "name": "四方台区", "longitude": "131.345657378", "latitude": "46.6020122851" }, { "code": "230506", "name": "宝山区", "longitude": "131.407375189", "latitude": "46.5835983402" }, { "code": "230521", "name": "集贤县", "longitude": "131.147434499", "latitude": "46.7345177886" }, { "code": "230522", "name": "友谊县", "longitude": "131.814594863", "latitude": "46.772973223" }, { "code": "230523", "name": "宝清县", "longitude": "132.203594116", "latitude": "46.3326518236" }, { "code": "230524", "name": "饶河县", "longitude": "134.020468932", "latitude": "46.8041827442" } ] }, { "code": "2306", "name": "大庆市", "townList": [ { "code": "230602", "name": "萨尔图区", "longitude": "125.133510064", "latitude": "46.6389364356" }, { "code": "230603", "name": "龙凤区", "longitude": "125.140472561", "latitude": "46.5676780671" }, { "code": "230604", "name": "让胡路区", "longitude": "124.877598814", "latitude": "46.6580784586" }, { "code": "230605", "name": "红岗区", "longitude": "124.897477417", "latitude": "46.4043131086" }, { "code": "230606", "name": "大同区", "longitude": "124.81937676", "latitude": "46.0455839513" }, { "code": "230621", "name": "肇州县", "longitude": "125.275368225", "latitude": "45.7051079869" }, { "code": "230622", "name": "肇源县", "longitude": "125.084572626", "latitude": "45.5241529142" }, { "code": "230623", "name": "林甸县", "longitude": "124.869650428", "latitude": "47.1772343952" }, { "code": "230624", "name": "杜尔伯特蒙古族自治县", "longitude": "124.449358791", "latitude": "46.8687677585" } ] }, { "code": "2307", "name": "伊春市", "townList": [ { "code": "230717", "name": "伊美区", "longitude": "128.913842764", "latitude": "47.7340177701" }, { "code": "230718", "name": "乌翠区", "longitude": "128.676456281", "latitude": "47.7327964664" }, { "code": "230719", "name": "友好区", "longitude": "128.84344328", "latitude": "47.8469663172" }, { "code": "230722", "name": "嘉荫县", "longitude": "130.410555478", "latitude": "48.8949834696" }, { "code": "230723", "name": "汤旺县", "longitude": "129.577448083", "latitude": "48.45869972" }, { "code": "230724", "name": "丰林县", "longitude": "129.540247725", "latitude": "48.2961312441" }, { "code": "230725", "name": "大箐山县", "longitude": "129.027425231", "latitude": "47.0345719511" }, { "code": "230726", "name": "南岔县", "longitude": "129.2895718", "latitude": "47.1437499136" }, { "code": "230751", "name": "金林区", "longitude": "129.43561265", "latitude": "47.4187137123" }, { "code": "230781", "name": "铁力市", "longitude": "128.038364904", "latitude": "46.9929486203" } ] }, { "code": "2308", "name": "佳木斯市", "townList": [ { "code": "230803", "name": "向阳区", "longitude": "130.372611861", "latitude": "46.8135118168" }, { "code": "230804", "name": "前进区", "longitude": "130.381648276", "latitude": "46.8196265085" }, { "code": "230805", "name": "东风区", "longitude": "130.410560778", "latitude": "46.828385152" }, { "code": "230811", "name": "郊区", "longitude": "130.333378099", "latitude": "46.8161681128" }, { "code": "230822", "name": "桦南县", "longitude": "130.560385022", "latitude": "46.2450774769" }, { "code": "230826", "name": "桦川县", "longitude": "130.725549449", "latitude": "47.0288168529" }, { "code": "230828", "name": "汤原县", "longitude": "129.911645042", "latitude": "46.7353267205" }, { "code": "230881", "name": "同江市", "longitude": "132.517509492", "latitude": "47.6479806767" }, { "code": "230882", "name": "富锦市", "longitude": "132.044538795", "latitude": "47.2559325718" }, { "code": "230883", "name": "抚远市", "longitude": "134.314489626", "latitude": "48.3709446963" } ] }, { "code": "2309", "name": "七台河市", "townList": [ { "code": "230902", "name": "新兴区", "longitude": "130.93837087", "latitude": "45.8223103285" }, { "code": "230903", "name": "桃山区", "longitude": "131.026444246", "latitude": "45.7717999157" }, { "code": "230904", "name": "茄子河区", "longitude": "131.074480594", "latitude": "45.7912381802" }, { "code": "230921", "name": "勃利县", "longitude": "130.598532553", "latitude": "45.7609643132" } ] }, { "code": "2310", "name": "牡丹江市", "townList": [ { "code": "231002", "name": "东安区", "longitude": "129.633477653", "latitude": "44.5874603776" }, { "code": "231003", "name": "阳明区", "longitude": "129.642527363", "latitude": "44.6017750265" }, { "code": "231004", "name": "爱民区", "longitude": "129.5983637", "latitude": "44.6023503394" }, { "code": "231005", "name": "西安区", "longitude": "129.622412865", "latitude": "44.5838610818" }, { "code": "231025", "name": "林口县", "longitude": "130.288747676", "latitude": "45.2854604066" }, { "code": "231081", "name": "绥芬河市", "longitude": "131.157392226", "latitude": "44.4181543724" }, { "code": "231083", "name": "海林市", "longitude": "129.387426834", "latitude": "44.5998719732" }, { "code": "231084", "name": "宁安市", "longitude": "129.48936798", "latitude": "44.3469835775" }, { "code": "231085", "name": "穆棱市", "longitude": "130.530558504", "latitude": "44.9247845896" }, { "code": "231086", "name": "东宁市", "longitude": "131.131543574", "latitude": "44.0961014862" } ] }, { "code": "2311", "name": "黑河市", "townList": [ { "code": "231102", "name": "爱辉区", "longitude": "127.506632271", "latitude": "50.2577096165" }, { "code": "231123", "name": "逊克县", "longitude": "128.485584595", "latitude": "49.5694914357" }, { "code": "231124", "name": "孙吴县", "longitude": "127.342387708", "latitude": "49.4314506069" }, { "code": "231181", "name": "北安市", "longitude": "126.497379742", "latitude": "48.2474195322" }, { "code": "231182", "name": "五大连池市", "longitude": "126.211555188", "latitude": "48.5226095518" }, { "code": "231183", "name": "嫩江市", "longitude": "125.227634695", "latitude": "49.1913201848" } ] }, { "code": "2312", "name": "绥化市", "townList": [ { "code": "231202", "name": "北林区", "longitude": "126.991448941", "latitude": "46.6434926721" }, { "code": "231221", "name": "望奎县", "longitude": "126.492384894", "latitude": "46.8391676017" }, { "code": "231222", "name": "兰西县", "longitude": "126.294619523", "latitude": "46.2580951722" }, { "code": "231223", "name": "青冈县", "longitude": "126.100488875", "latitude": "46.710684983" }, { "code": "231224", "name": "庆安县", "longitude": "127.514612188", "latitude": "46.8857444652" }, { "code": "231225", "name": "明水县", "longitude": "125.912482694", "latitude": "47.1794833749" }, { "code": "231226", "name": "绥棱县", "longitude": "127.120515141", "latitude": "47.2425157939" }, { "code": "231281", "name": "安达市", "longitude": "125.348622344", "latitude": "46.4257192321" }, { "code": "231282", "name": "肇东市", "longitude": "125.968537407", "latitude": "46.0569382893" }, { "code": "231283", "name": "海伦市", "longitude": "126.936508576", "latitude": "47.4569038411" } ] }, { "code": "2327", "name": "大兴安岭地区", "townList": [ { "code": "232701", "name": "漠河市", "longitude": "122.545420834", "latitude": "52.9783036784" }, { "code": "232721", "name": "呼玛县", "longitude": "126.659649919", "latitude": "51.7309467472" }, { "code": "232722", "name": "塔河县", "longitude": "124.716512514", "latitude": "52.3403050811" } ] } ] }, { "code": "31", "name": "上海市", "cityList": [ { "code": "3101", "name": "上海市", "townList": [ { "code": "310101", "name": "黄浦区", "longitude": "121.491585593", "latitude": "31.2372471521" }, { "code": "310104", "name": "徐汇区", "longitude": "121.443396353", "latitude": "31.1945567728" }, { "code": "310105", "name": "长宁区", "longitude": "121.430454375", "latitude": "31.2268479682" }, { "code": "310106", "name": "静安区", "longitude": "121.453431773", "latitude": "31.2338449304" }, { "code": "310107", "name": "普陀区", "longitude": "121.403569349", "latitude": "31.2549733683" }, { "code": "310109", "name": "虹口区", "longitude": "121.511586455", "latitude": "31.2697466989" }, { "code": "310110", "name": "杨浦区", "longitude": "121.532519937", "latitude": "31.2655241447" }, { "code": "310112", "name": "闵行区", "longitude": "121.388611934", "latitude": "31.1188425801" }, { "code": "310113", "name": "宝山区", "longitude": "121.496563014", "latitude": "31.4102794735" }, { "code": "310114", "name": "嘉定区", "longitude": "121.272595058", "latitude": "31.3801553397" }, { "code": "310115", "name": "浦东新区", "longitude": "121.529696185", "latitude": "31.2072012517" }, { "code": "310116", "name": "金山区", "longitude": "121.348480045", "latitude": "30.7478523766" }, { "code": "310117", "name": "松江区", "longitude": "121.234479596", "latitude": "31.0371351765" }, { "code": "310118", "name": "青浦区", "longitude": "121.130553105", "latitude": "31.155454318" }, { "code": "310120", "name": "奉贤区", "longitude": "121.480503736", "latitude": "30.9237201103" }, { "code": "310151", "name": "崇明区", "longitude": "121.403556863", "latitude": "31.6285699844" } ] } ] }, { "code": "32", "name": "江苏省", "cityList": [ { "code": "3201", "name": "南京市", "townList": [ { "code": "320102", "name": "玄武区", "longitude": "118.804412636", "latitude": "32.0547566829" }, { "code": "320104", "name": "秦淮区", "longitude": "118.800407361", "latitude": "32.0451386064" }, { "code": "320105", "name": "建邺区", "longitude": "118.738569447", "latitude": "32.0093696954" }, { "code": "320106", "name": "鼓楼区", "longitude": "118.776518992", "latitude": "32.0724051606" }, { "code": "320111", "name": "浦口区", "longitude": "118.634604059", "latitude": "32.0646792779" }, { "code": "320113", "name": "栖霞区", "longitude": "118.915422985", "latitude": "32.1026002078" }, { "code": "320114", "name": "雨花台区", "longitude": "118.785445364", "latitude": "31.9978588055" }, { "code": "320115", "name": "江宁区", "longitude": "118.846567059", "latitude": "31.9585268692" }, { "code": "320116", "name": "六合区", "longitude": "118.82747133", "latitude": "32.328666041" }, { "code": "320117", "name": "溧水区", "longitude": "119.034403909", "latitude": "31.6572836963" }, { "code": "320118", "name": "高淳区", "longitude": "118.898497651", "latitude": "31.3336391239" } ] }, { "code": "3202", "name": "无锡市", "townList": [ { "code": "320205", "name": "锡山区", "longitude": "120.363425711", "latitude": "31.5947616328" }, { "code": "320206", "name": "惠山区", "longitude": "120.304595593", "latitude": "31.6867413373" }, { "code": "320211", "name": "滨湖区", "longitude": "120.291547526", "latitude": "31.5346397" }, { "code": "320213", "name": "梁溪区", "longitude": "120.309599514", "latitude": "31.5716450241" }, { "code": "320214", "name": "新吴区", "longitude": "120.370940126", "latitude": "31.4971662549" }, { "code": "320281", "name": "江阴市", "longitude": "120.291568008", "latitude": "31.9260449098" }, { "code": "320282", "name": "宜兴市", "longitude": "119.831606032", "latitude": "31.3429566243" }, { "code": "320292", "name": "经济开发区", "longitude": "120.318583288", "latitude": "31.4988097327" } ] }, { "code": "3203", "name": "徐州市", "townList": [ { "code": "320302", "name": "鼓楼区", "longitude": "117.192578747", "latitude": "34.2937600842" }, { "code": "320303", "name": "云龙区", "longitude": "117.258423912", "latitude": "34.259086691" }, { "code": "320305", "name": "贾汪区", "longitude": "117.469430397", "latitude": "34.4416204006" }, { "code": "320311", "name": "泉山区", "longitude": "117.200590465", "latitude": "34.2499428716" }, { "code": "320312", "name": "铜山区", "longitude": "117.175569602", "latitude": "34.1861004499" }, { "code": "320321", "name": "丰县", "longitude": "116.664737304", "latitude": "34.7021756949" }, { "code": "320322", "name": "沛县", "longitude": "116.942585624", "latitude": "34.7651519554" }, { "code": "320324", "name": "睢宁县", "longitude": "117.947432772", "latitude": "33.9187894178" }, { "code": "320381", "name": "新沂市", "longitude": "118.361536521", "latitude": "34.3756109546" }, { "code": "320382", "name": "邳州市", "longitude": "118.019123301", "latitude": "34.3446455193" }, { "code": "320392", "name": "淮海国际港务区", "longitude": "117.145210738", "latitude": "34.2855009342" } ] }, { "code": "3204", "name": "常州市", "townList": [ { "code": "320402", "name": "天宁区", "longitude": "119.98046316", "latitude": "31.7855702713" }, { "code": "320404", "name": "钟楼区", "longitude": "119.908462716", "latitude": "31.8076466578" }, { "code": "320411", "name": "新北区", "longitude": "119.967457224", "latitude": "31.8693922421" }, { "code": "320412", "name": "武进区", "longitude": "119.948611672", "latitude": "31.7064466117" }, { "code": "320413", "name": "金坛区", "longitude": "119.604570903", "latitude": "31.72889303" }, { "code": "320481", "name": "溧阳市", "longitude": "119.491506039", "latitude": "31.4221022922" } ] }, { "code": "3205", "name": "苏州市", "townList": [ { "code": "320505", "name": "虎丘区", "longitude": "120.578471786", "latitude": "31.3019328766" }, { "code": "320506", "name": "吴中区", "longitude": "120.638507519", "latitude": "31.2682614458" }, { "code": "320507", "name": "相城区", "longitude": "120.648565936", "latitude": "31.3746899215" }, { "code": "320508", "name": "姑苏区", "longitude": "120.623454973", "latitude": "31.341831301" }, { "code": "320509", "name": "吴江区", "longitude": "120.651567175", "latitude": "31.1446441905" }, { "code": "320581", "name": "常熟市", "longitude": "120.759495887", "latitude": "31.6595382767" }, { "code": "320582", "name": "张家港市", "longitude": "120.561553639", "latitude": "31.8811405363" }, { "code": "320583", "name": "昆山市", "longitude": "120.987452498", "latitude": "31.3908634251" }, { "code": "320585", "name": "太仓市", "longitude": "121.135595294", "latitude": "31.464599353" }, { "code": "320586", "name": "工业园区", "longitude": "120.59241223", "latitude": "31.3035640744" } ] }, { "code": "3206", "name": "南通市", "townList": [ { "code": "320602", "name": "崇川区", "longitude": "120.863420222", "latitude": "32.0159230296" }, { "code": "320611", "name": "港闸区", "longitude": "120.901591739", "latitude": "31.9865494312" }, { "code": "320612", "name": "通州区", "longitude": "121.081425495", "latitude": "32.0703557397" }, { "code": "320623", "name": "如东县", "longitude": "121.19243791", "latitude": "32.3358728862" }, { "code": "320681", "name": "启东市", "longitude": "121.663473747", "latitude": "31.8142328496" }, { "code": "320682", "name": "如皋市", "longitude": "120.579465581", "latitude": "32.3778514861" }, { "code": "320684", "name": "海门市", "longitude": "120.901591739", "latitude": "31.9865494312" }, { "code": "320685", "name": "海安市", "longitude": "120.474433096", "latitude": "32.5391957442" } ] }, { "code": "3207", "name": "连云港市", "townList": [ { "code": "320703", "name": "连云区", "longitude": "119.346587801", "latitude": "34.765337144" }, { "code": "320706", "name": "海州区", "longitude": "119.169408088", "latitude": "34.5774561186" }, { "code": "320707", "name": "赣榆区", "longitude": "119.179434615", "latitude": "34.8476824608" }, { "code": "320722", "name": "东海县", "longitude": "118.759565092", "latitude": "34.5479186274" }, { "code": "320723", "name": "灌云县", "longitude": "119.246533545", "latitude": "34.2886160603" }, { "code": "320724", "name": "灌南县", "longitude": "119.322538186", "latitude": "34.0925913078" }, { "code": "320791", "name": "经济开发区", "longitude": "119.228621333", "latitude": "34.6022495253" } ] }, { "code": "3208", "name": "淮安市", "townList": [ { "code": "320803", "name": "淮安区", "longitude": "119.147463203", "latitude": "33.5089998382" }, { "code": "320804", "name": "淮阴区", "longitude": "119.041421741", "latitude": "33.6381504248" }, { "code": "320812", "name": "清江浦区", "longitude": "119.032413623", "latitude": "33.5585622401" }, { "code": "320813", "name": "洪泽区", "longitude": "118.879583649", "latitude": "33.2996246815" }, { "code": "320826", "name": "涟水县", "longitude": "119.266448439", "latitude": "33.7870787079" }, { "code": "320830", "name": "盱眙县", "longitude": "118.55144127", "latitude": "33.0182547417" }, { "code": "320831", "name": "金湖县", "longitude": "119.026469087", "latitude": "33.0312838268" }, { "code": "320832", "name": "开发区", "longitude": "119.119764132", "latitude": "33.5566677803" }, { "code": "320895", "name": "工业园区", "longitude": "119.119764132", "latitude": "33.5566677803" }, { "code": "320898", "name": "生态新城区", "longitude": "108.967391039", "latitude": "34.2727244695" } ] }, { "code": "3209", "name": "盐城市", "townList": [ { "code": "320902", "name": "亭湖区", "longitude": "120.204578168", "latitude": "33.3958934869" }, { "code": "320903", "name": "盐都区", "longitude": "120.160503257", "latitude": "33.3440203156" }, { "code": "320904", "name": "大丰区", "longitude": "120.507438816", "latitude": "33.2047598497" }, { "code": "320921", "name": "响水县", "longitude": "119.584601122", "latitude": "34.2047430028" }, { "code": "320922", "name": "滨海县", "longitude": "119.827621059", "latitude": "33.9956465475" }, { "code": "320923", "name": "阜宁县", "longitude": "119.809580749", "latitude": "33.7650787271" }, { "code": "320924", "name": "射阳县", "longitude": "120.332817208", "latitude": "33.7722908245" }, { "code": "320925", "name": "建湖县", "longitude": "119.805531277", "latitude": "33.4698329784" }, { "code": "320981", "name": "东台市", "longitude": "120.326537065", "latitude": "32.8727163125" }, { "code": "320982", "name": "盐南高新区", "longitude": "120.195256003", "latitude": "33.3315660488" }, { "code": "320971", "name": "盐城经济技术开发区", "longitude": "120.167544266", "latitude": "33.3551009176" } ] }, { "code": "3210", "name": "扬州市", "townList": [ { "code": "321002", "name": "广陵区", "longitude": "119.438504846", "latitude": "32.4006611597" }, { "code": "321003", "name": "邗江区", "longitude": "119.404385137", "latitude": "32.3827513553" }, { "code": "321012", "name": "江都区", "longitude": "119.576602969", "latitude": "32.4402945062" }, { "code": "321023", "name": "宝应县", "longitude": "119.365555701", "latitude": "33.2472054611" }, { "code": "321081", "name": "仪征市", "longitude": "119.191467058", "latitude": "32.2780904832" }, { "code": "321084", "name": "高邮市", "longitude": "119.465615617", "latitude": "32.7871470205" } ] }, { "code": "3211", "name": "镇江市", "townList": [ { "code": "321102", "name": "京口区", "longitude": "119.475603696", "latitude": "32.2037854835" }, { "code": "321111", "name": "润州区", "longitude": "119.418440474", "latitude": "32.2014948432" }, { "code": "321112", "name": "丹徒区", "longitude": "119.440500791", "latitude": "32.1379203957" }, { "code": "321181", "name": "丹阳市", "longitude": "119.612500605", "latitude": "32.0159202742" }, { "code": "321182", "name": "扬中市", "longitude": "119.803519612", "latitude": "32.2429671941" }, { "code": "321183", "name": "句容市", "longitude": "119.175433203", "latitude": "31.9509234905" }, { "code": "321171", "name": "镇江新区", "longitude": "119.522653974", "latitude": "32.1691420104" } ] }, { "code": "3212", "name": "泰州市", "townList": [ { "code": "321202", "name": "海陵区", "longitude": "119.925524951", "latitude": "32.4967315492" }, { "code": "321203", "name": "高港区", "longitude": "119.888420981", "latitude": "32.3248624744" }, { "code": "321204", "name": "姜堰区", "longitude": "120.133398326", "latitude": "32.5152336748" }, { "code": "321281", "name": "兴化市", "longitude": "119.857514061", "latitude": "32.9178242139" }, { "code": "321282", "name": "靖江市", "longitude": "120.283532036", "latitude": "31.9881700752" }, { "code": "321283", "name": "泰兴市", "longitude": "120.05859939", "latitude": "32.1774740237" } ] }, { "code": "3213", "name": "宿迁市", "townList": [ { "code": "321302", "name": "宿城区", "longitude": "118.249567051", "latitude": "33.9686776307" }, { "code": "321311", "name": "宿豫区", "longitude": "118.336400945", "latitude": "33.9548043963" }, { "code": "321322", "name": "沭阳县", "longitude": "118.810419066", "latitude": "34.1174542095" }, { "code": "321323", "name": "泗阳县", "longitude": "118.709465965", "latitude": "33.728328313" }, { "code": "321324", "name": "泗洪县", "longitude": "118.222415947", "latitude": "33.4657325946" } ] } ] }, { "code": "33", "name": "浙江省", "cityList": [ { "code": "3301", "name": "杭州市", "townList": [ { "code": "330102", "name": "上城区", "longitude": "120.204289902", "latitude": "30.2326181876" }, { "code": "330103", "name": "下城区", "longitude": "120.215511804", "latitude": "30.2530829817" }, { "code": "330104", "name": "江干区", "longitude": "120.215511804", "latitude": "30.2530829817" }, { "code": "330105", "name": "拱墅区", "longitude": "120.14803289", "latitude": "30.3252045435" }, { "code": "330106", "name": "西湖区", "longitude": "120.136438012", "latitude": "30.2659163256" }, { "code": "330108", "name": "滨江区", "longitude": "120.218471181", "latitude": "30.2143329501" }, { "code": "330109", "name": "萧山区", "longitude": "120.270470584", "latitude": "30.1875112222" }, { "code": "330110", "name": "余杭区", "longitude": "119.985886949", "latitude": "30.2804050653" }, { "code": "330111", "name": "富阳区", "longitude": "119.966555684", "latitude": "30.0547229673" }, { "code": "330112", "name": "临安区", "longitude": "119.731517371", "latitude": "30.2398055981" }, { "code": "330122", "name": "桐庐县", "longitude": "119.697598776", "latitude": "29.7985847901" }, { "code": "330127", "name": "淳安县", "longitude": "119.048392306", "latitude": "29.614950366" }, { "code": "330182", "name": "建德市", "longitude": "119.287398075", "latitude": "29.481154027" } ] }, { "code": "3302", "name": "宁波市", "townList": [ { "code": "330203", "name": "海曙区", "longitude": "121.557403073", "latitude": "29.8657207084" }, { "code": "330205", "name": "江北区", "longitude": "121.560421289", "latitude": "29.8929483795" }, { "code": "330206", "name": "北仑区", "longitude": "121.850576215", "latitude": "29.9046593599" }, { "code": "330211", "name": "镇海区", "longitude": "121.603046425", "latitude": "29.9709378965" }, { "code": "330212", "name": "鄞州区", "longitude": "121.55542707", "latitude": "29.82420635" }, { "code": "330213", "name": "奉化区", "longitude": "121.413527767", "latitude": "29.6611464128" }, { "code": "330225", "name": "象山县", "longitude": "121.87556393", "latitude": "29.4822706538" }, { "code": "330226", "name": "宁海县", "longitude": "121.436431773", "latitude": "29.2943174411" }, { "code": "330281", "name": "余姚市", "longitude": "121.160585075", "latitude": "30.0427346396" }, { "code": "330282", "name": "慈溪市", "longitude": "121.272596136", "latitude": "30.1752566107" } ] }, { "code": "3303", "name": "温州市", "townList": [ { "code": "330302", "name": "鹿城区", "longitude": "120.661586498", "latitude": "28.0203516078" }, { "code": "330303", "name": "龙湾区", "longitude": "120.819467554", "latitude": "27.9386522449" }, { "code": "330304", "name": "瓯海区", "longitude": "120.621447243", "latitude": "27.9728573516" }, { "code": "330305", "name": "洞头区", "longitude": "121.163548568", "latitude": "27.8418703246" }, { "code": "330324", "name": "永嘉县", "longitude": "120.688524075", "latitude": "28.1564503322" }, { "code": "330326", "name": "平阳县", "longitude": "120.572515374", "latitude": "27.6677244011" }, { "code": "330327", "name": "苍南县", "longitude": "120.433595122", "latitude": "27.5230667884" }, { "code": "330328", "name": "文成县", "longitude": "120.097488457", "latitude": "27.7932171523" }, { "code": "330329", "name": "泰顺县", "longitude": "119.723537258", "latitude": "27.5621705596" }, { "code": "330381", "name": "瑞安市", "longitude": "120.661582186", "latitude": "27.7839507362" }, { "code": "330382", "name": "乐清市", "longitude": "120.992501856", "latitude": "28.1181799952" }, { "code": "330383", "name": "龙港市", "longitude": "120.593986245", "latitude": "27.5361812866" }, { "code": "330384", "name": "瓯江口新区", "longitude": "120.925576748", "latitude": "27.9402158982" } ] }, { "code": "3304", "name": "嘉兴市", "townList": [ { "code": "330402", "name": "南湖区", "longitude": "120.789610052", "latitude": "30.7515468133" }, { "code": "330411", "name": "秀洲区", "longitude": "120.715437056", "latitude": "30.7702072142" }, { "code": "330421", "name": "嘉善县", "longitude": "120.932510606", "latitude": "30.8371221938" }, { "code": "330424", "name": "海盐县", "longitude": "120.952445263", "latitude": "30.5318728945" }, { "code": "330481", "name": "海宁市", "longitude": "120.686565067", "latitude": "30.5179237698" }, { "code": "330482", "name": "平湖市", "longitude": "121.022575255", "latitude": "30.6822409981" }, { "code": "330483", "name": "桐乡市", "longitude": "120.571543155", "latitude": "30.6363111877" } ] }, { "code": "3305", "name": "湖州市", "townList": [ { "code": "330502", "name": "吴兴区", "longitude": "120.19160466", "latitude": "30.862955455" }, { "code": "330503", "name": "南浔区", "longitude": "120.424601394", "latitude": "30.8552429822" }, { "code": "330521", "name": "德清县", "longitude": "119.983464668", "latitude": "30.5486282391" }, { "code": "330522", "name": "长兴县", "longitude": "119.917498322", "latitude": "31.0325793268" }, { "code": "330523", "name": "安吉县", "longitude": "119.686563379", "latitude": "30.6444247941" }, { "code": "330524", "name": "太湖新区", "longitude": "119.955937354", "latitude": "31.0203536261" } ] }, { "code": "3306", "name": "绍兴市", "townList": [ { "code": "330602", "name": "越城区", "longitude": "120.588436672", "latitude": "29.9953099628" }, { "code": "330603", "name": "柯桥区", "longitude": "120.451511034", "latitude": "30.0790036049" }, { "code": "330604", "name": "上虞区", "longitude": "120.874509894", "latitude": "30.0382429671" }, { "code": "330624", "name": "新昌县", "longitude": "120.910569656", "latitude": "29.5055410753" }, { "code": "330681", "name": "诸暨市", "longitude": "120.253408332", "latitude": "29.7149346492" }, { "code": "330683", "name": "嵊州市", "longitude": "120.837437257", "latitude": "29.5673269913" } ] }, { "code": "3307", "name": "金华市", "townList": [ { "code": "330702", "name": "婺城区", "longitude": "119.578592609", "latitude": "29.0917754382" }, { "code": "330703", "name": "金东区", "longitude": "119.699582414", "latitude": "29.1047650161" }, { "code": "330723", "name": "武义县", "longitude": "119.822565559", "latitude": "28.8982437867" }, { "code": "330726", "name": "浦江县", "longitude": "119.898436083", "latitude": "29.4586928519" }, { "code": "330727", "name": "磐安县", "longitude": "120.456513052", "latitude": "29.0601031751" }, { "code": "330781", "name": "兰溪市", "longitude": "119.466598706", "latitude": "29.2140443451" }, { "code": "330782", "name": "义乌市", "longitude": "120.081580993", "latitude": "29.3111498754" }, { "code": "330783", "name": "东阳市", "longitude": "120.248421928", "latitude": "29.2958610652" }, { "code": "330784", "name": "永康市", "longitude": "120.054550711", "latitude": "28.8942039673" } ] }, { "code": "3308", "name": "衢州市", "townList": [ { "code": "330802", "name": "柯城区", "longitude": "118.877583915", "latitude": "28.9742036511" }, { "code": "330803", "name": "衢江区", "longitude": "118.965539074", "latitude": "28.986237908" }, { "code": "330822", "name": "常山县", "longitude": "118.517556631", "latitude": "28.9069979491" }, { "code": "330824", "name": "开化县", "longitude": "118.421459321", "latitude": "29.1431875212" }, { "code": "330825", "name": "龙游县", "longitude": "119.178418256", "latitude": "29.0344865533" }, { "code": "330881", "name": "江山市", "longitude": "118.633583298", "latitude": "28.7428684801" } ] }, { "code": "3309", "name": "舟山市", "townList": [ { "code": "330902", "name": "定海区", "longitude": "122.113600804", "latitude": "30.0254623784" }, { "code": "330903", "name": "普陀区", "longitude": "122.331544166", "latitude": "29.9768356965" }, { "code": "330921", "name": "岱山县", "longitude": "122.232604814", "latitude": "30.269655894" }, { "code": "330922", "name": "嵊泗县", "longitude": "122.457587765", "latitude": "30.731273949" } ] }, { "code": "3310", "name": "台州市", "townList": [ { "code": "331002", "name": "椒江区", "longitude": "121.449407976", "latitude": "28.6792582249" }, { "code": "331003", "name": "黄岩区", "longitude": "121.268566051", "latitude": "28.6553336076" }, { "code": "331004", "name": "路桥区", "longitude": "121.344330934", "latitude": "28.5843877398" }, { "code": "331022", "name": "三门县", "longitude": "121.402553798", "latitude": "29.1103552063" }, { "code": "331023", "name": "天台县", "longitude": "121.013553376", "latitude": "29.1495143781" }, { "code": "331024", "name": "仙居县", "longitude": "120.735435206", "latitude": "28.8532256933" }, { "code": "331025", "name": "台州湾新区", "longitude": "121.546592954", "latitude": "28.5966798625" }, { "code": "331081", "name": "温岭市", "longitude": "121.392588895", "latitude": "28.3776554899" }, { "code": "331082", "name": "临海市", "longitude": "121.151585294", "latitude": "28.8640493291" }, { "code": "331083", "name": "玉环市", "longitude": "121.238512971", "latitude": "28.1418629868" } ] }, { "code": "3311", "name": "丽水市", "townList": [ { "code": "331102", "name": "莲都区", "longitude": "119.919519133", "latitude": "28.451745135" }, { "code": "331121", "name": "青田县", "longitude": "120.296573349", "latitude": "28.1454875563" }, { "code": "331122", "name": "缙云县", "longitude": "120.097478306", "latitude": "28.6652147472" }, { "code": "331123", "name": "遂昌县", "longitude": "119.282435386", "latitude": "28.5984546767" }, { "code": "331124", "name": "松阳县", "longitude": "119.48854377", "latitude": "28.4550564043" }, { "code": "331125", "name": "云和县", "longitude": "119.579597364", "latitude": "28.1214695075" }, { "code": "331126", "name": "庆元县", "longitude": "119.069486855", "latitude": "27.6254317784" }, { "code": "331127", "name": "景宁畲族自治县", "longitude": "119.642430331", "latitude": "27.979553967" }, { "code": "331128", "name": "经济开发区", "longitude": "119.929573058", "latitude": "28.4732781806" }, { "code": "331181", "name": "龙泉市", "longitude": "119.148444765", "latitude": "28.0805087253" } ] } ] }, { "code": "34", "name": "安徽省", "cityList": [ { "code": "3401", "name": "合肥市", "townList": [ { "code": "340102", "name": "瑶海区", "longitude": "117.315587045", "latitude": "31.8637869417" }, { "code": "340103", "name": "庐阳区", "longitude": "117.271459134", "latitude": "31.8848866956" }, { "code": "340104", "name": "蜀山区", "longitude": "117.266460782", "latitude": "31.8573782171" }, { "code": "340111", "name": "包河区", "longitude": "117.316576259", "latitude": "31.7992934678" }, { "code": "340121", "name": "长丰县", "longitude": "117.173560093", "latitude": "32.4837226238" }, { "code": "340122", "name": "肥东县", "longitude": "117.475400625", "latitude": "31.8938903545" }, { "code": "340123", "name": "肥西县", "longitude": "117.164557814", "latitude": "31.7129621327" }, { "code": "340124", "name": "庐江县", "longitude": "117.293577302", "latitude": "31.2613276375" }, { "code": "340140", "name": "高新技术产业开发区", "longitude": "117.212546821", "latitude": "31.8214279073" }, { "code": "340141", "name": "经济技术开发区", "longitude": "117.233442665", "latitude": "31.8265778337" }, { "code": "340142", "name": "新站综合开发实验区", "longitude": "117.383910275", "latitude": "31.9463155511" }, { "code": "340143", "name": "巢湖经济开发区", "longitude": "117.233442665", "latitude": "31.8265778337" }, { "code": "340181", "name": "巢湖市", "longitude": "117.8955762", "latitude": "31.6290024288" } ] }, { "code": "3402", "name": "芜湖市", "townList": [ { "code": "340202", "name": "镜湖区", "longitude": "118.392606304", "latitude": "31.3458665956" }, { "code": "340207", "name": "鸠江区", "longitude": "118.397588486", "latitude": "31.3758045195" }, { "code": "340209", "name": "弋江区", "longitude": "118.379579706", "latitude": "31.3175662725" }, { "code": "340210", "name": "湾沚区", "longitude": "118.582442512", "latitude": "31.1412392235" }, { "code": "340211", "name": "繁昌区", "longitude": "118.205424318", "latitude": "31.1079585936" }, { "code": "340223", "name": "南陵县", "longitude": "118.340418167", "latitude": "30.9202602987" }, { "code": "340281", "name": "无为市", "longitude": "117.908578544", "latitude": "31.308844156" } ] }, { "code": "3403", "name": "蚌埠市", "townList": [ { "code": "340302", "name": "龙子湖区", "longitude": "117.399512764", "latitude": "32.9486442629" }, { "code": "340303", "name": "蚌山区", "longitude": "117.379441205", "latitude": "32.9233787704" }, { "code": "340304", "name": "禹会区", "longitude": "117.34845236", "latitude": "32.9353099889" }, { "code": "340311", "name": "淮上区", "longitude": "117.366382718", "latitude": "32.9705470119" }, { "code": "340321", "name": "怀远县", "longitude": "117.211506314", "latitude": "32.9760037266" }, { "code": "340322", "name": "五河县", "longitude": "117.88756089", "latitude": "33.1327094629" }, { "code": "340323", "name": "固镇县", "longitude": "117.323547648", "latitude": "33.3232742977" } ] }, { "code": "3404", "name": "淮南市", "townList": [ { "code": "340402", "name": "大通区", "longitude": "117.059583179", "latitude": "32.6372699595" }, { "code": "340403", "name": "田家庵区", "longitude": "117.023445337", "latitude": "32.6533230071" }, { "code": "340404", "name": "谢家集区", "longitude": "116.865438877", "latitude": "32.6062545882" }, { "code": "340405", "name": "八公山区", "longitude": "116.840564348", "latitude": "32.6371373184" }, { "code": "340406", "name": "潘集区", "longitude": "116.841580961", "latitude": "32.7779554911" }, { "code": "340421", "name": "凤台县", "longitude": "116.717573209", "latitude": "32.7151039051" }, { "code": "340422", "name": "寿县", "longitude": "116.805562773", "latitude": "32.5615461512" } ] }, { "code": "3405", "name": "马鞍山市", "townList": [ { "code": "340503", "name": "花山区", "longitude": "118.499605629", "latitude": "31.725472572" }, { "code": "340504", "name": "雨山区", "longitude": "118.505597057", "latitude": "31.6877454829" }, { "code": "340506", "name": "博望区", "longitude": "118.824775245", "latitude": "31.5575100284" }, { "code": "340521", "name": "当涂县", "longitude": "118.504604699", "latitude": "31.5766491547" }, { "code": "340522", "name": "含山县", "longitude": "118.107462036", "latitude": "31.7408622087" }, { "code": "340523", "name": "和县", "longitude": "118.359512549", "latitude": "31.7482438159" } ] }, { "code": "3406", "name": "淮北市", "townList": [ { "code": "340602", "name": "杜集区", "longitude": "116.834612266", "latitude": "33.9972854364" }, { "code": "340603", "name": "相山区", "longitude": "116.800521123", "latitude": "33.9658271618" }, { "code": "340604", "name": "烈山区", "longitude": "116.819599066", "latitude": "33.9015740618" }, { "code": "340621", "name": "濉溪县", "longitude": "116.772389428", "latitude": "33.9216291948" } ] }, { "code": "3407", "name": "铜陵市", "townList": [ { "code": "340705", "name": "铜官区", "longitude": "117.862613239", "latitude": "30.942478976" }, { "code": "340706", "name": "义安区", "longitude": "117.94404104", "latitude": "30.9568093228" }, { "code": "340711", "name": "郊区", "longitude": "117.774468718", "latitude": "30.827433898" }, { "code": "340722", "name": "枞阳县", "longitude": "117.256411978", "latitude": "30.7119269852" } ] }, { "code": "3408", "name": "安庆市", "townList": [ { "code": "340802", "name": "迎江区", "longitude": "117.097514489", "latitude": "30.5175232914" }, { "code": "340803", "name": "大观区", "longitude": "117.040538204", "latitude": "30.5182319247" }, { "code": "340811", "name": "宜秀区", "longitude": "116.993441124", "latitude": "30.6196758778" }, { "code": "340822", "name": "怀宁县", "longitude": "116.836592581", "latitude": "30.7393996746" }, { "code": "340825", "name": "太湖县", "longitude": "116.315476302", "latitude": "30.4601132904" }, { "code": "340826", "name": "宿松县", "longitude": "116.135523699", "latitude": "30.1597868614" }, { "code": "340827", "name": "望江县", "longitude": "116.700590294", "latitude": "30.1299683292" }, { "code": "340828", "name": "岳西县", "longitude": "116.36655539", "latitude": "30.855227714" }, { "code": "340881", "name": "桐城市", "longitude": "116.943654068", "latitude": "31.0410994545" }, { "code": "340882", "name": "潜山市", "longitude": "116.587611039", "latitude": "30.6367556824" } ] }, { "code": "3410", "name": "黄山市", "townList": [ { "code": "341002", "name": "屯溪区", "longitude": "118.321418181", "latitude": "29.7021439085" }, { "code": "341003", "name": "黄山区", "longitude": "118.147609825", "latitude": "30.2786509802" }, { "code": "341004", "name": "徽州区", "longitude": "118.343435828", "latitude": "29.8342213853" }, { "code": "341021", "name": "歙县", "longitude": "118.42146013", "latitude": "29.8662876758" }, { "code": "341022", "name": "休宁县", "longitude": "118.199921372", "latitude": "29.790843839" }, { "code": "341023", "name": "黟县", "longitude": "117.944477241", "latitude": "29.9310473307" }, { "code": "341024", "name": "祁门县", "longitude": "117.723392578", "latitude": "29.8603439481" } ] }, { "code": "3411", "name": "滁州市", "townList": [ { "code": "341102", "name": "琅琊区", "longitude": "118.31244134", "latitude": "32.3008674926" }, { "code": "341103", "name": "南谯区", "longitude": "118.423482052", "latitude": "32.2061318993" }, { "code": "341122", "name": "来安县", "longitude": "118.442412493", "latitude": "32.4584497624" }, { "code": "341124", "name": "全椒县", "longitude": "118.280584283", "latitude": "32.0919397976" }, { "code": "341125", "name": "定远县", "longitude": "117.704470686", "latitude": "32.5370466135" }, { "code": "341126", "name": "凤阳县", "longitude": "117.538585369", "latitude": "32.8809767253" }, { "code": "341181", "name": "天长市", "longitude": "119.011385279", "latitude": "32.6734100328" }, { "code": "341182", "name": "明光市", "longitude": "117.995509814", "latitude": "32.7830228234" } ] }, { "code": "3412", "name": "阜阳市", "townList": [ { "code": "341202", "name": "颍州区", "longitude": "115.813411196", "latitude": "32.8896254165" }, { "code": "341203", "name": "颍东区", "longitude": "115.863616683", "latitude": "32.9173622402" }, { "code": "341204", "name": "颍泉区", "longitude": "115.815425556", "latitude": "32.931313576" }, { "code": "341221", "name": "临泉县", "longitude": "115.267615501", "latitude": "33.0459595284" }, { "code": "341222", "name": "太和县", "longitude": "115.62861547", "latitude": "33.1659598501" }, { "code": "341225", "name": "阜南县", "longitude": "115.602545925", "latitude": "32.6640973851" }, { "code": "341226", "name": "颍上县", "longitude": "116.263476899", "latitude": "32.6590284688" }, { "code": "341282", "name": "界首市", "longitude": "115.380609847", "latitude": "33.2627752362" } ] }, { "code": "3413", "name": "宿州市", "townList": [ { "code": "341302", "name": "埇桥区", "longitude": "116.983480443", "latitude": "33.6461306504" }, { "code": "341321", "name": "砀山县", "longitude": "116.372524002", "latitude": "34.4484281714" }, { "code": "341322", "name": "萧县", "longitude": "116.953584926", "latitude": "34.1942693443" }, { "code": "341323", "name": "灵璧县", "longitude": "117.564556998", "latitude": "33.5478922319" }, { "code": "341324", "name": "泗县", "longitude": "117.916589992", "latitude": "33.4886946301" } ] }, { "code": "3415", "name": "六安市", "townList": [ { "code": "341502", "name": "金安区", "longitude": "116.54543838", "latitude": "31.7562877199" }, { "code": "341503", "name": "裕安区", "longitude": "116.486549783", "latitude": "31.7436258708" }, { "code": "341504", "name": "叶集区", "longitude": "115.947475927", "latitude": "31.8352631423" }, { "code": "341522", "name": "霍邱县", "longitude": "116.284391338", "latitude": "32.3593435909" }, { "code": "341523", "name": "舒城县", "longitude": "116.955601711", "latitude": "31.4676920106" }, { "code": "341524", "name": "金寨县", "longitude": "115.940441207", "latitude": "31.7334617344" }, { "code": "341525", "name": "霍山县", "longitude": "116.354282381", "latitude": "31.4155847083" } ] }, { "code": "3416", "name": "亳州市", "townList": [ { "code": "341602", "name": "谯城区", "longitude": "115.785471919", "latitude": "33.8826630874" }, { "code": "341621", "name": "涡阳县", "longitude": "116.221609035", "latitude": "33.498566835" }, { "code": "341622", "name": "蒙城县", "longitude": "116.571589401", "latitude": "33.2716582397" }, { "code": "341623", "name": "利辛县", "longitude": "116.21559991", "latitude": "33.1503860554" } ] }, { "code": "3417", "name": "池州市", "townList": [ { "code": "341702", "name": "贵池区", "longitude": "117.57449037", "latitude": "30.6938579438" }, { "code": "341721", "name": "东至县", "longitude": "117.034481289", "latitude": "30.1165345283" }, { "code": "341722", "name": "石台县", "longitude": "117.49239441", "latitude": "30.2165303372" }, { "code": "341723", "name": "青阳县", "longitude": "117.853431299", "latitude": "30.6456343462" } ] }, { "code": "3418", "name": "宣城市", "townList": [ { "code": "341802", "name": "宣州区", "longitude": "118.762549443", "latitude": "30.952158158" }, { "code": "341821", "name": "郎溪县", "longitude": "119.190739071", "latitude": "31.1493746388" }, { "code": "341823", "name": "泾县", "longitude": "118.426434692", "latitude": "30.6946724885" }, { "code": "341824", "name": "绩溪县", "longitude": "118.585443841", "latitude": "30.0732921995" }, { "code": "341825", "name": "旌德县", "longitude": "118.546467353", "latitude": "30.2924810937" }, { "code": "341881", "name": "宁国市", "longitude": "118.989609815", "latitude": "30.6393522297" }, { "code": "341882", "name": "广德市", "longitude": "119.42747581", "latitude": "30.8836671026" } ] } ] }, { "code": "35", "name": "福建省", "cityList": [ { "code": "3501", "name": "福州市", "townList": [ { "code": "350102", "name": "鼓楼区", "longitude": "119.310491623", "latitude": "26.0881140376" }, { "code": "350103", "name": "台江区", "longitude": "119.320528211", "latitude": "26.0585281506" }, { "code": "350104", "name": "仓山区", "longitude": "119.280432165", "latitude": "26.0528416919" }, { "code": "350105", "name": "马尾区", "longitude": "119.445519158", "latitude": "26.0045337711" }, { "code": "350111", "name": "晋安区", "longitude": "119.334579416", "latitude": "26.0872139044" }, { "code": "350112", "name": "长乐区", "longitude": "119.52943832", "latitude": "25.9692574481" }, { "code": "350121", "name": "闽侯县", "longitude": "119.138482018", "latitude": "26.1560352146" }, { "code": "350122", "name": "连江县", "longitude": "119.546478816", "latitude": "26.203583291" }, { "code": "350123", "name": "罗源县", "longitude": "119.55648046", "latitude": "26.4954956603" }, { "code": "350124", "name": "闽清县", "longitude": "118.86957651", "latitude": "26.2268475402" }, { "code": "350125", "name": "永泰县", "longitude": "118.938430729", "latitude": "25.8727872632" }, { "code": "350128", "name": "平潭县", "longitude": "119.796501314", "latitude": "25.5047002739" }, { "code": "350181", "name": "福清市", "longitude": "119.390465247", "latitude": "25.726343299" } ] }, { "code": "3502", "name": "厦门市", "townList": [ { "code": "350203", "name": "思明区", "longitude": "118.088407972", "latitude": "24.4519483957" }, { "code": "350205", "name": "海沧区", "longitude": "118.039561712", "latitude": "24.4903258186" }, { "code": "350206", "name": "湖里区", "longitude": "118.153588122", "latitude": "24.5175731381" }, { "code": "350211", "name": "集美区", "longitude": "118.103434917", "latitude": "24.5820190622" }, { "code": "350212", "name": "同安区", "longitude": "118.158563477", "latitude": "24.7291139753" }, { "code": "350213", "name": "翔安区", "longitude": "118.254575897", "latitude": "24.6242163836" } ] }, { "code": "3503", "name": "莆田市", "townList": [ { "code": "350302", "name": "城厢区", "longitude": "119.001536331", "latitude": "25.4243437925" }, { "code": "350303", "name": "涵江区", "longitude": "119.122567368", "latitude": "25.4644643881" }, { "code": "350304", "name": "荔城区", "longitude": "119.019481691", "latitude": "25.4397544788" }, { "code": "350305", "name": "秀屿区", "longitude": "119.1115713", "latitude": "25.3236543976" }, { "code": "350322", "name": "仙游县", "longitude": "118.698454251", "latitude": "25.3682914981" } ] }, { "code": "3504", "name": "三明市", "townList": [ { "code": "350402", "name": "梅列区", "longitude": "117.645521168", "latitude": "26.269736516" }, { "code": "350403", "name": "三元区", "longitude": "117.652550229", "latitude": "26.2773358784" }, { "code": "350421", "name": "明溪县", "longitude": "117.208517636", "latitude": "26.3618536853" }, { "code": "350423", "name": "清流县", "longitude": "116.823593186", "latitude": "26.1833573532" }, { "code": "350424", "name": "宁化县", "longitude": "116.660425512", "latitude": "26.2679564905" }, { "code": "350425", "name": "大田县", "longitude": "117.853439997", "latitude": "25.6989326419" }, { "code": "350426", "name": "尤溪县", "longitude": "118.197439714", "latitude": "26.1762180395" }, { "code": "350427", "name": "沙县", "longitude": "117.798561076", "latitude": "26.4028134443" }, { "code": "350428", "name": "将乐县", "longitude": "117.477409041", "latitude": "26.7352095198" }, { "code": "350429", "name": "泰宁县", "longitude": "117.182595862", "latitude": "26.9056600323" }, { "code": "350430", "name": "建宁县", "longitude": "116.852506227", "latitude": "26.8368246553" }, { "code": "350481", "name": "永安市", "longitude": "117.371442587", "latitude": "25.9481439898" } ] }, { "code": "3505", "name": "泉州市", "townList": [ { "code": "350502", "name": "鲤城区", "longitude": "118.593481054", "latitude": "24.9133541671" }, { "code": "350503", "name": "丰泽区", "longitude": "118.619580152", "latitude": "24.8949699933" }, { "code": "350504", "name": "洛江区", "longitude": "118.677416295", "latitude": "24.9462136538" }, { "code": "350505", "name": "泉港区", "longitude": "118.922432985", "latitude": "25.139650394" }, { "code": "350521", "name": "惠安县", "longitude": "118.8034155", "latitude": "25.036949815" }, { "code": "350524", "name": "安溪县", "longitude": "118.192425372", "latitude": "25.0617595534" }, { "code": "350525", "name": "永春县", "longitude": "118.300486135", "latitude": "25.3279742021" }, { "code": "350526", "name": "德化县", "longitude": "118.24755007", "latitude": "25.4973085942" }, { "code": "350527", "name": "金门县", "longitude": "118.33041516", "latitude": "24.4404445411" }, { "code": "350581", "name": "石狮市", "longitude": "118.654519026", "latitude": "24.7376651609" }, { "code": "350582", "name": "晋江市", "longitude": "118.55843052", "latitude": "24.7878245751" }, { "code": "350583", "name": "南安市", "longitude": "118.392571972", "latitude": "24.9663623505" } ] }, { "code": "3506", "name": "漳州市", "townList": [ { "code": "350602", "name": "芗城区", "longitude": "117.660589524", "latitude": "24.5162684161" }, { "code": "350603", "name": "龙文区", "longitude": "117.716454695", "latitude": "24.5095096809" }, { "code": "350622", "name": "云霄县", "longitude": "117.346448314", "latitude": "23.9640728282" }, { "code": "350623", "name": "漳浦县", "longitude": "117.620443353", "latitude": "24.1234616148" }, { "code": "350624", "name": "诏安县", "longitude": "117.182558583", "latitude": "23.7170539638" }, { "code": "350625", "name": "长泰县", "longitude": "117.653576453", "latitude": "24.5189297912" }, { "code": "350626", "name": "东山县", "longitude": "117.436560305", "latitude": "23.7068946887" }, { "code": "350627", "name": "南靖县", "longitude": "117.363446411", "latitude": "24.5208517321" }, { "code": "350628", "name": "平和县", "longitude": "117.322551591", "latitude": "24.3683650401" }, { "code": "350629", "name": "华安县", "longitude": "117.54058561", "latitude": "25.0100677314" }, { "code": "350681", "name": "龙海市", "longitude": "117.653576453", "latitude": "24.5189297912" } ] }, { "code": "3507", "name": "南平市", "townList": [ { "code": "350702", "name": "延平区", "longitude": "118.18845055", "latitude": "26.6438077911" }, { "code": "350703", "name": "建阳区", "longitude": "118.127525225", "latitude": "27.3375024662" }, { "code": "350721", "name": "顺昌县", "longitude": "117.816519281", "latitude": "26.7991043672" }, { "code": "350722", "name": "浦城县", "longitude": "118.547439123", "latitude": "27.9233900461" }, { "code": "350723", "name": "光泽县", "longitude": "117.34048159", "latitude": "27.5472728592" }, { "code": "350724", "name": "松溪县", "longitude": "118.791454383", "latitude": "27.5325549072" }, { "code": "350725", "name": "政和县", "longitude": "118.863587237", "latitude": "27.3717491982" }, { "code": "350781", "name": "邵武市", "longitude": "117.499419502", "latitude": "27.3464699663" }, { "code": "350782", "name": "武夷山市", "longitude": "118.04157715", "latitude": "27.7625539103" }, { "code": "350783", "name": "建瓯市", "longitude": "118.311460734", "latitude": "27.0289550894" } ] }, { "code": "3508", "name": "龙岩市", "townList": [ { "code": "350802", "name": "新罗区", "longitude": "117.043542931", "latitude": "25.1040776296" }, { "code": "350803", "name": "永定区", "longitude": "116.738500388", "latitude": "24.7301075322" }, { "code": "350821", "name": "长汀县", "longitude": "116.36356797", "latitude": "25.8391846183" }, { "code": "350823", "name": "上杭县", "longitude": "116.426442888", "latitude": "25.0555704015" }, { "code": "350824", "name": "武平县", "longitude": "116.107589167", "latitude": "25.1008551733" }, { "code": "350825", "name": "连城县", "longitude": "116.760446171", "latitude": "25.7163373819" }, { "code": "350881", "name": "漳平市", "longitude": "117.426556325", "latitude": "25.2957434993" } ] }, { "code": "3509", "name": "宁德市", "townList": [ { "code": "350902", "name": "蕉城区", "longitude": "119.533442427", "latitude": "26.666738556" }, { "code": "350921", "name": "霞浦县", "longitude": "120.011427106", "latitude": "26.8913488738" }, { "code": "350922", "name": "古田县", "longitude": "118.752578236", "latitude": "26.5832617521" }, { "code": "350923", "name": "屏南县", "longitude": "118.992596215", "latitude": "26.9142649181" }, { "code": "350924", "name": "寿宁县", "longitude": "119.511425049", "latitude": "27.46664966" }, { "code": "350925", "name": "周宁县", "longitude": "119.34556713", "latitude": "27.1102392804" }, { "code": "350926", "name": "柘荣县", "longitude": "119.907456687", "latitude": "27.2399618764" }, { "code": "350981", "name": "福安市", "longitude": "119.65440636", "latitude": "27.0943235081" }, { "code": "350982", "name": "福鼎市", "longitude": "120.223451909", "latitude": "27.3305249725" } ] } ] }, { "code": "36", "name": "江西省", "cityList": [ { "code": "3601", "name": "南昌市", "townList": [ { "code": "360102", "name": "东湖区", "longitude": "115.905466026", "latitude": "28.6912591798" }, { "code": "360103", "name": "西湖区", "longitude": "115.883535694", "latitude": "28.6619767099" }, { "code": "360104", "name": "青云谱区", "longitude": "115.931416186", "latitude": "28.6272357365" }, { "code": "360111", "name": "青山湖区", "longitude": "115.968552405", "latitude": "28.6875960062" }, { "code": "360112", "name": "新建区", "longitude": "115.821450925", "latitude": "28.6987486252" }, { "code": "360113", "name": "红谷滩区", "longitude": "115.864845639", "latitude": "28.7040738419" }, { "code": "360121", "name": "南昌县", "longitude": "115.950460173", "latitude": "28.5516041861" }, { "code": "360123", "name": "安义县", "longitude": "115.555441464", "latitude": "28.8507942738" }, { "code": "360124", "name": "进贤县", "longitude": "116.248537793", "latitude": "28.3827589445" } ] }, { "code": "3602", "name": "景德镇市", "townList": [ { "code": "360202", "name": "昌江区", "longitude": "117.190579103", "latitude": "29.2788544645" }, { "code": "360203", "name": "珠山区", "longitude": "117.209548262", "latitude": "29.3057782204" }, { "code": "360222", "name": "浮梁县", "longitude": "117.221466081", "latitude": "29.3577882375" }, { "code": "360281", "name": "乐平市", "longitude": "117.158510675", "latitude": "28.984363669" } ] }, { "code": "3603", "name": "萍乡市", "townList": [ { "code": "360302", "name": "安源区", "longitude": "113.877439919", "latitude": "27.6213077039" }, { "code": "360313", "name": "湘东区", "longitude": "113.740499712", "latitude": "27.6458750749" }, { "code": "360321", "name": "莲花县", "longitude": "113.968540674", "latitude": "27.133462711" }, { "code": "360322", "name": "上栗县", "longitude": "113.801538224", "latitude": "27.8864156921" }, { "code": "360323", "name": "芦溪县", "longitude": "114.036519405", "latitude": "27.6366047187" } ] }, { "code": "3604", "name": "九江市", "townList": [ { "code": "360402", "name": "濂溪区", "longitude": "115.995598587", "latitude": "29.6774948774" }, { "code": "360403", "name": "浔阳区", "longitude": "116.007873573", "latitude": "29.7113371085" }, { "code": "360404", "name": "柴桑区", "longitude": "115.917401542", "latitude": "29.6148049094" }, { "code": "360423", "name": "武宁县", "longitude": "115.107441774", "latitude": "29.2623521507" }, { "code": "360424", "name": "修水县", "longitude": "114.553567976", "latitude": "29.031175868" }, { "code": "360425", "name": "永修县", "longitude": "115.83851891", "latitude": "29.0180163867" }, { "code": "360426", "name": "德安县", "longitude": "115.762577958", "latitude": "29.3191724963" }, { "code": "360428", "name": "都昌县", "longitude": "116.210552047", "latitude": "29.2789650448" }, { "code": "360429", "name": "湖口县", "longitude": "116.258471346", "latitude": "29.7371315146" }, { "code": "360430", "name": "彭泽县", "longitude": "116.555509806", "latitude": "29.9021220049" }, { "code": "360481", "name": "瑞昌市", "longitude": "115.687429672", "latitude": "29.6819512865" }, { "code": "360482", "name": "共青城市", "longitude": "115.821420024", "latitude": "29.2487411737" }, { "code": "360483", "name": "庐山市", "longitude": "116.051425939", "latitude": "29.4545391657" } ] }, { "code": "3605", "name": "新余市", "townList": [ { "code": "360502", "name": "渝水区", "longitude": "114.951423893", "latitude": "27.8068396504" }, { "code": "360521", "name": "分宜县", "longitude": "114.69847247", "latitude": "27.8207313444" } ] }, { "code": "3606", "name": "鹰潭市", "townList": [ { "code": "360602", "name": "月湖区", "longitude": "117.043547602", "latitude": "28.2450783316" }, { "code": "360603", "name": "余江区", "longitude": "116.824593629", "latitude": "28.2153537614" }, { "code": "360681", "name": "贵溪市", "longitude": "117.251398698", "latitude": "28.2987350721" } ] }, { "code": "3607", "name": "赣州市", "townList": [ { "code": "360702", "name": "章贡区", "longitude": "114.927550885", "latitude": "25.8237470139" }, { "code": "360703", "name": "南康区", "longitude": "114.771538215", "latitude": "25.6670529306" }, { "code": "360704", "name": "赣县区", "longitude": "115.018570164", "latitude": "25.8663846166" }, { "code": "360722", "name": "信丰县", "longitude": "114.929521139", "latitude": "25.39197512" }, { "code": "360723", "name": "大余县", "longitude": "114.36840664", "latitude": "25.4076372984" }, { "code": "360724", "name": "上犹县", "longitude": "114.558548631", "latitude": "25.7905187995" }, { "code": "360725", "name": "崇义县", "longitude": "114.314572448", "latitude": "25.6876871927" }, { "code": "360726", "name": "安远县", "longitude": "115.400559131", "latitude": "25.1427434317" }, { "code": "360728", "name": "定南县", "longitude": "115.034563775", "latitude": "24.7897838318" }, { "code": "360729", "name": "全南县", "longitude": "114.536582367", "latitude": "24.748206355" }, { "code": "360730", "name": "宁都县", "longitude": "116.015494437", "latitude": "26.4759795033" }, { "code": "360731", "name": "于都县", "longitude": "115.421499262", "latitude": "25.9578939428" }, { "code": "360732", "name": "兴国县", "longitude": "115.369551691", "latitude": "26.3438825882" }, { "code": "360733", "name": "会昌县", "longitude": "115.815732402", "latitude": "25.5935314524" }, { "code": "360734", "name": "寻乌县", "longitude": "115.653515315", "latitude": "24.9694465468" }, { "code": "360735", "name": "石城县", "longitude": "116.35259427", "latitude": "26.3189723468" }, { "code": "360781", "name": "瑞金市", "longitude": "116.033420663", "latitude": "25.891666274" }, { "code": "360783", "name": "龙南市", "longitude": "114.796554137", "latitude": "24.9165994612" } ] }, { "code": "3608", "name": "吉安市", "townList": [ { "code": "360802", "name": "吉州区", "longitude": "115.00153937", "latitude": "27.1493149939" }, { "code": "360803", "name": "青原区", "longitude": "115.021560713", "latitude": "27.0876625352" }, { "code": "360821", "name": "吉安县", "longitude": "114.914591301", "latitude": "27.044989079" }, { "code": "360822", "name": "吉水县", "longitude": "115.142569831", "latitude": "27.235259745" }, { "code": "360823", "name": "峡江县", "longitude": "115.322403228", "latitude": "27.5882346176" }, { "code": "360824", "name": "新干县", "longitude": "115.393594748", "latitude": "27.7460809517" }, { "code": "360825", "name": "永丰县", "longitude": "115.44740244", "latitude": "27.3243421037" }, { "code": "360826", "name": "泰和县", "longitude": "114.915591115", "latitude": "26.7956973412" }, { "code": "360827", "name": "遂川县", "longitude": "114.527562122", "latitude": "26.3195172841" }, { "code": "360828", "name": "万安县", "longitude": "114.792577159", "latitude": "26.4640728363" }, { "code": "360829", "name": "安福县", "longitude": "114.626478135", "latitude": "27.3990764771" }, { "code": "360830", "name": "永新县", "longitude": "114.249414936", "latitude": "26.9515372566" }, { "code": "360881", "name": "井冈山市", "longitude": "114.295555859", "latitude": "26.7537097416" } ] }, { "code": "3609", "name": "宜春市", "townList": [ { "code": "360902", "name": "袁州区", "longitude": "114.434561181", "latitude": "27.8025827053" }, { "code": "360921", "name": "奉新县", "longitude": "115.406551099", "latitude": "28.6940289515" }, { "code": "360922", "name": "万载县", "longitude": "114.452536544", "latitude": "28.1121333061" }, { "code": "360923", "name": "上高县", "longitude": "114.931541159", "latitude": "28.2388154903" }, { "code": "360924", "name": "宜丰县", "longitude": "114.809517135", "latitude": "28.4003733073" }, { "code": "360925", "name": "靖安县", "longitude": "115.369553128", "latitude": "28.8670819162" }, { "code": "360926", "name": "铜鼓县", "longitude": "114.360990409", "latitude": "28.5196632799" }, { "code": "360981", "name": "丰城市", "longitude": "115.777478421", "latitude": "28.1666140244" }, { "code": "360982", "name": "樟树市", "longitude": "115.552418935", "latitude": "28.0621531176" }, { "code": "360983", "name": "高安市", "longitude": "115.367087819", "latitude": "28.4468707745" } ] }, { "code": "3610", "name": "抚州市", "townList": [ { "code": "361002", "name": "临川区", "longitude": "116.318489832", "latitude": "27.9404589929" }, { "code": "361003", "name": "东乡区", "longitude": "116.609541715", "latitude": "28.253977398" }, { "code": "361021", "name": "南城县", "longitude": "116.64339885", "latitude": "27.5762409666" }, { "code": "361022", "name": "黎川县", "longitude": "116.914507003", "latitude": "27.2883402348" }, { "code": "361023", "name": "南丰县", "longitude": "116.531403509", "latitude": "27.2247335249" }, { "code": "361024", "name": "崇仁县", "longitude": "116.083548985", "latitude": "27.759079756" }, { "code": "361025", "name": "乐安县", "longitude": "115.837496279", "latitude": "27.4340798645" }, { "code": "361026", "name": "宜黄县", "longitude": "116.242541694", "latitude": "27.5605634607" }, { "code": "361027", "name": "金溪县", "longitude": "116.760404041", "latitude": "27.925329189" }, { "code": "361028", "name": "资溪县", "longitude": "117.066570274", "latitude": "27.7118457857" }, { "code": "361030", "name": "广昌县", "longitude": "116.342560646", "latitude": "26.8484544467" } ] }, { "code": "3611", "name": "上饶市", "townList": [ { "code": "361102", "name": "信州区", "longitude": "117.973411842", "latitude": "28.437628311" }, { "code": "361103", "name": "广丰区", "longitude": "118.19742022", "latitude": "28.4426150612" }, { "code": "361104", "name": "广信区", "longitude": "117.915584413", "latitude": "28.4541868748" }, { "code": "361123", "name": "玉山县", "longitude": "118.25156289", "latitude": "28.6877496873" }, { "code": "361124", "name": "铅山县", "longitude": "117.716421637", "latitude": "28.3215046948" }, { "code": "361125", "name": "横峰县", "longitude": "117.602397383", "latitude": "28.4134404624" }, { "code": "361126", "name": "弋阳县", "longitude": "117.455506376", "latitude": "28.3840820012" }, { "code": "361127", "name": "余干县", "longitude": "116.701600962", "latitude": "28.7078662444" }, { "code": "361128", "name": "鄱阳县", "longitude": "116.710566141", "latitude": "29.0114528309" }, { "code": "361129", "name": "万年县", "longitude": "117.064598942", "latitude": "28.7000540541" }, { "code": "361130", "name": "婺源县", "longitude": "117.868445022", "latitude": "29.2540390481" }, { "code": "361181", "name": "德兴市", "longitude": "117.601030791", "latitude": "28.9368283063" } ] } ] }, { "code": "37", "name": "山东省", "cityList": [ { "code": "3701", "name": "济南市", "townList": [ { "code": "370102", "name": "历下区", "longitude": "117.082567314", "latitude": "36.67216295" }, { "code": "370103", "name": "市中区", "longitude": "117.004399104", "latitude": "36.6575516736" }, { "code": "370104", "name": "槐荫区", "longitude": "116.907458375", "latitude": "36.6575617344" }, { "code": "370105", "name": "天桥区", "longitude": "116.993399173", "latitude": "36.6840678744" }, { "code": "370112", "name": "历城区", "longitude": "117.071589751", "latitude": "36.6856555347" }, { "code": "370113", "name": "长清区", "longitude": "116.758387091", "latitude": "36.5602158799" }, { "code": "370114", "name": "章丘区", "longitude": "117.532565374", "latitude": "36.6855327514" }, { "code": "370115", "name": "济阳区", "longitude": "117.226031734", "latitude": "36.9835735611" }, { "code": "370116", "name": "莱芜区", "longitude": "117.66659067", "latitude": "36.2088414268" }, { "code": "370117", "name": "钢城区", "longitude": "117.817495665", "latitude": "36.064718807" }, { "code": "370124", "name": "平阴县", "longitude": "116.462616678", "latitude": "36.2948613211" }, { "code": "370126", "name": "商河县", "longitude": "117.163529793", "latitude": "37.3149707156" } ] }, { "code": "3702", "name": "青岛市", "townList": [ { "code": "370202", "name": "市南区", "longitude": "120.418584724", "latitude": "36.0814656402" }, { "code": "370203", "name": "市北区", "longitude": "120.381404487", "latitude": "36.0934495949" }, { "code": "370211", "name": "黄岛区", "longitude": "120.204546548", "latitude": "35.9663828709" }, { "code": "370212", "name": "崂山区", "longitude": "120.475397247", "latitude": "36.113499424" }, { "code": "370213", "name": "李沧区", "longitude": "120.439602827", "latitude": "36.1510246678" }, { "code": "370214", "name": "城阳区", "longitude": "120.402526794", "latitude": "36.3128861974" }, { "code": "370215", "name": "即墨区", "longitude": "120.453536174", "latitude": "36.3947491703" }, { "code": "370281", "name": "胶州市", "longitude": "120.039535371", "latitude": "36.270349088" }, { "code": "370283", "name": "平度市", "longitude": "119.994414294", "latitude": "36.7826922541" }, { "code": "370285", "name": "莱西市", "longitude": "120.524556208", "latitude": "36.893956298" } ] }, { "code": "3703", "name": "淄博市", "townList": [ { "code": "370302", "name": "淄川区", "longitude": "117.973411858", "latitude": "36.649834806" }, { "code": "370303", "name": "张店区", "longitude": "118.024591107", "latitude": "36.8119419521" }, { "code": "370304", "name": "博山区", "longitude": "117.868468754", "latitude": "36.5008478551" }, { "code": "370305", "name": "临淄区", "longitude": "118.315394609", "latitude": "36.8322936352" }, { "code": "370306", "name": "周村区", "longitude": "117.876482178", "latitude": "36.8089943522" }, { "code": "370321", "name": "桓台县", "longitude": "118.104434208", "latitude": "36.9656079801" }, { "code": "370322", "name": "高青县", "longitude": "117.833394325", "latitude": "37.1772686543" }, { "code": "370323", "name": "沂源县", "longitude": "118.177489442", "latitude": "36.1909169858" } ] }, { "code": "3704", "name": "枣庄市", "townList": [ { "code": "370402", "name": "市中区", "longitude": "117.562565814", "latitude": "34.8699627251" }, { "code": "370403", "name": "薛城区", "longitude": "117.269457619", "latitude": "34.8011245686" }, { "code": "370404", "name": "峄城区", "longitude": "117.59639061", "latitude": "34.778599873" }, { "code": "370405", "name": "台儿庄区", "longitude": "117.740425454", "latitude": "34.5687632156" }, { "code": "370406", "name": "山亭区", "longitude": "117.467443166", "latitude": "35.1056919808" }, { "code": "370481", "name": "滕州市", "longitude": "117.172565219", "latitude": "35.1200348096" } ] }, { "code": "3705", "name": "东营市", "townList": [ { "code": "370502", "name": "东营区", "longitude": "118.588462686", "latitude": "37.4548473202" }, { "code": "370503", "name": "河口区", "longitude": "118.53250517", "latitude": "37.8911202011" }, { "code": "370505", "name": "垦利区", "longitude": "118.581431739", "latitude": "37.5785551338" }, { "code": "370522", "name": "利津县", "longitude": "118.261617999", "latitude": "37.495860299" }, { "code": "370523", "name": "广饶县", "longitude": "118.413498644", "latitude": "37.0596384989" } ] }, { "code": "3706", "name": "烟台市", "townList": [ { "code": "370602", "name": "芝罘区", "longitude": "121.406540045", "latitude": "37.5463128669" }, { "code": "370611", "name": "福山区", "longitude": "121.274604747", "latitude": "37.5036682285" }, { "code": "370612", "name": "牟平区", "longitude": "121.606549115", "latitude": "37.3929154518" }, { "code": "370613", "name": "莱山区", "longitude": "121.451380672", "latitude": "37.5176485841" }, { "code": "370614", "name": "蓬莱区", "longitude": "120.835535112", "latitude": "37.801948046" }, { "code": "370681", "name": "龙口市", "longitude": "120.485368528", "latitude": "37.6525551255" }, { "code": "370682", "name": "莱阳市", "longitude": "120.71841431", "latitude": "36.9846355683" }, { "code": "370683", "name": "莱州市", "longitude": "119.948593077", "latitude": "37.1826366091" }, { "code": "370685", "name": "招远市", "longitude": "120.440601653", "latitude": "37.3611371426" }, { "code": "370686", "name": "栖霞市", "longitude": "120.856416583", "latitude": "37.3414181648" }, { "code": "370687", "name": "海阳市", "longitude": "121.180458198", "latitude": "36.6932697382" } ] }, { "code": "3707", "name": "潍坊市", "townList": [ { "code": "370702", "name": "潍城区", "longitude": "119.031428542", "latitude": "36.7328544156" }, { "code": "370703", "name": "寒亭区", "longitude": "119.226615147", "latitude": "36.7807437862" }, { "code": "370704", "name": "坊子区", "longitude": "119.172400973", "latitude": "36.6607415997" }, { "code": "370705", "name": "奎文区", "longitude": "119.13947053", "latitude": "36.712752014" }, { "code": "370724", "name": "临朐县", "longitude": "118.549449996", "latitude": "36.5191295018" }, { "code": "370725", "name": "昌乐县", "longitude": "118.836487981", "latitude": "36.7129961908" }, { "code": "370781", "name": "青州市", "longitude": "118.486536721", "latitude": "36.6904165087" }, { "code": "370782", "name": "诸城市", "longitude": "119.416402219", "latitude": "36.0020088581" }, { "code": "370783", "name": "寿光市", "longitude": "118.797415375", "latitude": "36.8619217465" }, { "code": "370784", "name": "安丘市", "longitude": "119.225607518", "latitude": "36.4838421956" }, { "code": "370785", "name": "高密市", "longitude": "119.762410996", "latitude": "36.3889567065" }, { "code": "370786", "name": "昌邑市", "longitude": "119.404405977", "latitude": "36.8651610726" } ] }, { "code": "3708", "name": "济宁市", "townList": [ { "code": "370811", "name": "任城区", "longitude": "116.554469854", "latitude": "35.4937306403" }, { "code": "370812", "name": "兖州区", "longitude": "116.790115152", "latitude": "35.5579523733" }, { "code": "370826", "name": "微山县", "longitude": "117.135413819", "latitude": "34.8133151042" }, { "code": "370827", "name": "鱼台县", "longitude": "116.657392848", "latitude": "35.0178877178" }, { "code": "370828", "name": "金乡县", "longitude": "116.318529822", "latitude": "35.0725691187" }, { "code": "370829", "name": "嘉祥县", "longitude": "116.348613085", "latitude": "35.4132550441" }, { "code": "370830", "name": "汶上县", "longitude": "116.505441058", "latitude": "35.7170553926" }, { "code": "370831", "name": "泗水县", "longitude": "117.25742859", "latitude": "35.6706004812" }, { "code": "370832", "name": "梁山县", "longitude": "116.102620296", "latitude": "35.8080638866" }, { "code": "370881", "name": "曲阜市", "longitude": "116.993415972", "latitude": "35.5873722865" }, { "code": "370883", "name": "邹城市", "longitude": "117.014404161", "latitude": "35.4075209324" } ] }, { "code": "3709", "name": "泰安市", "townList": [ { "code": "370902", "name": "泰山区", "longitude": "117.141411086", "latitude": "36.1994446012" }, { "code": "370911", "name": "岱岳区", "longitude": "117.048556479", "latitude": "36.1932912423" }, { "code": "370921", "name": "宁阳县", "longitude": "116.812578539", "latitude": "35.7645390973" }, { "code": "370923", "name": "东平县", "longitude": "116.477594216", "latitude": "35.941908015" }, { "code": "370982", "name": "新泰市", "longitude": "117.774606248", "latitude": "35.9146198666" }, { "code": "370983", "name": "肥城市", "longitude": "116.775400818", "latitude": "36.1888112243" } ] }, { "code": "3710", "name": "威海市", "townList": [ { "code": "371002", "name": "环翠区", "longitude": "122.129538181", "latitude": "37.5079680712" }, { "code": "371003", "name": "文登区", "longitude": "122.064428369", "latitude": "37.2001133283" }, { "code": "371082", "name": "荣成市", "longitude": "122.492504631", "latitude": "37.1713179393" }, { "code": "371083", "name": "乳山市", "longitude": "121.546428581", "latitude": "36.9251773579" } ] }, { "code": "3711", "name": "日照市", "townList": [ { "code": "371102", "name": "东港区", "longitude": "119.468624311", "latitude": "35.4310490039" }, { "code": "371103", "name": "岚山区", "longitude": "119.325530442", "latitude": "35.1274323301" }, { "code": "371121", "name": "五莲县", "longitude": "119.215580363", "latitude": "35.7556971041" }, { "code": "371122", "name": "莒县", "longitude": "118.843538242", "latitude": "35.585872123" } ] }, { "code": "3713", "name": "临沂市", "townList": [ { "code": "371302", "name": "兰山区", "longitude": "118.354499735", "latitude": "35.0573402298" }, { "code": "371311", "name": "罗庄区", "longitude": "118.291512529", "latitude": "35.0025037334" }, { "code": "371312", "name": "河东区", "longitude": "118.409547447", "latitude": "35.0956755368" }, { "code": "371321", "name": "沂南县", "longitude": "118.471491541", "latitude": "35.5560976669" }, { "code": "371322", "name": "郯城县", "longitude": "118.37358711", "latitude": "34.6192259325" }, { "code": "371323", "name": "沂水县", "longitude": "118.634617264", "latitude": "35.7961805847" }, { "code": "371324", "name": "兰陵县", "longitude": "118.077409495", "latitude": "34.8636163854" }, { "code": "371325", "name": "费县", "longitude": "117.984425083", "latitude": "35.2723041285" }, { "code": "371326", "name": "平邑县", "longitude": "117.621262893", "latitude": "35.523060493" }, { "code": "371327", "name": "莒南县", "longitude": "118.84154077", "latitude": "35.1808116318" }, { "code": "371328", "name": "蒙阴县", "longitude": "117.951414601", "latitude": "35.7163471662" }, { "code": "371329", "name": "临沭县", "longitude": "118.6574945", "latitude": "34.9260185915" } ] }, { "code": "3714", "name": "德州市", "townList": [ { "code": "371402", "name": "德城区", "longitude": "116.305448966", "latitude": "37.456993283" }, { "code": "371403", "name": "陵城区", "longitude": "116.589400014", "latitude": "37.3471324346" }, { "code": "371422", "name": "宁津县", "longitude": "116.806537614", "latitude": "37.6580187459" }, { "code": "371423", "name": "庆云县", "longitude": "117.391452448", "latitude": "37.7815853189" }, { "code": "371424", "name": "临邑县", "longitude": "116.873403703", "latitude": "37.1961693667" }, { "code": "371425", "name": "齐河县", "longitude": "116.769387471", "latitude": "36.7899448067" }, { "code": "371426", "name": "平原县", "longitude": "116.440504708", "latitude": "37.1712214633" }, { "code": "371427", "name": "夏津县", "longitude": "116.008534112", "latitude": "36.9541548633" }, { "code": "371428", "name": "武城县", "longitude": "116.075506291", "latitude": "37.2192220803" }, { "code": "371481", "name": "乐陵市", "longitude": "117.238406432", "latitude": "37.7359245008" }, { "code": "371482", "name": "禹城市", "longitude": "116.644371101", "latitude": "36.9402420088" } ] }, { "code": "3715", "name": "聊城市", "townList": [ { "code": "371502", "name": "东昌府区", "longitude": "116.013057979", "latitude": "36.4185183184" }, { "code": "371503", "name": "茌平区", "longitude": "116.261455442", "latitude": "36.5867850688" }, { "code": "371521", "name": "阳谷县", "longitude": "115.79839557", "latitude": "36.1208155147" }, { "code": "371522", "name": "莘县", "longitude": "115.677396872", "latitude": "36.2399071205" }, { "code": "371524", "name": "东阿县", "longitude": "116.254492946", "latitude": "36.3409577078" }, { "code": "371525", "name": "冠县", "longitude": "115.449395795", "latitude": "36.4902432254" }, { "code": "371526", "name": "高唐县", "longitude": "116.235604276", "latitude": "36.8515910841" }, { "code": "371581", "name": "临清市", "longitude": "115.7114696", "latitude": "36.8442891867" } ] }, { "code": "3716", "name": "滨州市", "townList": [ { "code": "371602", "name": "滨城区", "longitude": "118.026603851", "latitude": "37.4368432077" }, { "code": "371603", "name": "沾化区", "longitude": "118.105454413", "latitude": "37.7052981067" }, { "code": "371621", "name": "惠民县", "longitude": "117.51650969", "latitude": "37.4958031089" }, { "code": "371622", "name": "阳信县", "longitude": "117.584437038", "latitude": "37.647338035" }, { "code": "371623", "name": "无棣县", "longitude": "117.632457486", "latitude": "37.7775673121" }, { "code": "371625", "name": "博兴县", "longitude": "118.117492695", "latitude": "37.1604772777" }, { "code": "371681", "name": "邹平市", "longitude": "117.749478487", "latitude": "36.8700322167" } ] }, { "code": "3717", "name": "菏泽市", "townList": [ { "code": "371702", "name": "牡丹区", "longitude": "115.42344303", "latitude": "35.2570181761" }, { "code": "371703", "name": "定陶区", "longitude": "115.579437375", "latitude": "35.0772751798" }, { "code": "371721", "name": "曹县", "longitude": "115.548457244", "latitude": "34.8318093484" }, { "code": "371722", "name": "单县", "longitude": "116.111583678", "latitude": "34.7846584337" }, { "code": "371723", "name": "成武县", "longitude": "115.896519008", "latitude": "34.958605655" }, { "code": "371724", "name": "巨野县", "longitude": "116.101599012", "latitude": "35.4020623806" }, { "code": "371725", "name": "郓城县", "longitude": "115.950450576", "latitude": "35.6059023197" }, { "code": "371726", "name": "鄄城县", "longitude": "115.516606923", "latitude": "35.5692042599" }, { "code": "371728", "name": "东明县", "longitude": "115.114025111", "latitude": "35.2817249368" } ] } ] }, { "code": "41", "name": "河南省", "cityList": [ { "code": "4101", "name": "郑州市", "townList": [ { "code": "410102", "name": "中原区", "longitude": "113.619475517", "latitude": "34.7544507813" }, { "code": "410103", "name": "二七区", "longitude": "113.646409591", "latitude": "34.7310451214" }, { "code": "410104", "name": "管城回族区", "longitude": "113.6835247", "latitude": "34.7596738747" }, { "code": "410105", "name": "金水区", "longitude": "113.666447732", "latitude": "34.8060704457" }, { "code": "410106", "name": "上街区", "longitude": "113.315497287", "latitude": "34.8088186102" }, { "code": "410108", "name": "惠济区", "longitude": "113.62345528", "latitude": "34.8735198858" }, { "code": "410122", "name": "中牟县", "longitude": "113.982484906", "latitude": "34.7250108489" }, { "code": "410181", "name": "巩义市", "longitude": "113.028431005", "latitude": "34.7540968887" }, { "code": "410182", "name": "荥阳市", "longitude": "113.3894228", "latitude": "34.7938105003" }, { "code": "410183", "name": "新密市", "longitude": "113.397390949", "latitude": "34.5458979834" }, { "code": "410184", "name": "新郑市", "longitude": "113.746434472", "latitude": "34.4017663791" }, { "code": "410185", "name": "登封市", "longitude": "113.056422833", "latitude": "34.4596974617" } ] }, { "code": "4102", "name": "开封市", "townList": [ { "code": "410202", "name": "龙亭区", "longitude": "114.361413166", "latitude": "34.8220356125" }, { "code": "410203", "name": "顺河回族区", "longitude": "114.367391659", "latitude": "34.8022413556" }, { "code": "410204", "name": "鼓楼区", "longitude": "114.354404856", "latitude": "34.7948742519" }, { "code": "410205", "name": "禹王台区", "longitude": "114.35439776", "latitude": "34.7834721059" }, { "code": "410212", "name": "祥符区", "longitude": "114.447532548", "latitude": "34.7627395722" }, { "code": "410221", "name": "杞县", "longitude": "114.789592105", "latitude": "34.5548567807" }, { "code": "410222", "name": "通许县", "longitude": "114.473435906", "latitude": "34.4867718027" }, { "code": "410223", "name": "尉氏县", "longitude": "114.199561151", "latitude": "34.4172280104" }, { "code": "410225", "name": "兰考县", "longitude": "114.82523552", "latitude": "34.8622109159" } ] }, { "code": "4103", "name": "洛阳市", "townList": [ { "code": "410302", "name": "老城区", "longitude": "112.476503566", "latitude": "34.6896010635" }, { "code": "410303", "name": "西工区", "longitude": "112.434399537", "latitude": "34.6667678475" }, { "code": "410304", "name": "瀍河回族区", "longitude": "112.506603807", "latitude": "34.6854624213" }, { "code": "410305", "name": "涧西区", "longitude": "112.402552002", "latitude": "34.6634689743" }, { "code": "410306", "name": "吉利区", "longitude": "112.459421298", "latitude": "34.6242627792" }, { "code": "410311", "name": "洛龙区", "longitude": "112.470469288", "latitude": "34.624704713" }, { "code": "410322", "name": "孟津县", "longitude": "112.459421298", "latitude": "34.6242627792" }, { "code": "410323", "name": "新安县", "longitude": "112.140609708", "latitude": "34.7343833273" }, { "code": "410324", "name": "栾川县", "longitude": "111.622426667", "latitude": "33.7918224643" }, { "code": "410325", "name": "嵩县", "longitude": "112.092408162", "latitude": "34.1407215564" }, { "code": "410326", "name": "汝阳县", "longitude": "112.479503277", "latitude": "34.1598433649" }, { "code": "410327", "name": "宜阳县", "longitude": "112.179465374", "latitude": "34.5410469426" }, { "code": "410328", "name": "洛宁县", "longitude": "111.65958741", "latitude": "34.3949845602" }, { "code": "410329", "name": "伊川县", "longitude": "112.432407455", "latitude": "34.4276457964" }, { "code": "410381", "name": "偃师市", "longitude": "112.459421298", "latitude": "34.6242627792" } ] }, { "code": "4104", "name": "平顶山市", "townList": [ { "code": "410402", "name": "新华区", "longitude": "113.30043989", "latitude": "33.7436571516" }, { "code": "410403", "name": "卫东区", "longitude": "113.341611118", "latitude": "33.7403756514" }, { "code": "410404", "name": "石龙区", "longitude": "112.905455226", "latitude": "33.9047542684" }, { "code": "410411", "name": "湛河区", "longitude": "113.250514674", "latitude": "33.685790171" }, { "code": "410421", "name": "宝丰县", "longitude": "113.061447236", "latitude": "33.8747455986" }, { "code": "410422", "name": "叶县", "longitude": "113.363582413", "latitude": "33.6324916741" }, { "code": "410423", "name": "鲁山县", "longitude": "112.91443397", "latitude": "33.7448788635" }, { "code": "410425", "name": "郏县", "longitude": "113.219606228", "latitude": "33.9774862892" }, { "code": "410481", "name": "舞钢市", "longitude": "113.531410316", "latitude": "33.2994311053" }, { "code": "410482", "name": "汝州市", "longitude": "112.850549716", "latitude": "34.1727677886" } ] }, { "code": "4105", "name": "安阳市", "townList": [ { "code": "410502", "name": "文峰区", "longitude": "114.363373988", "latitude": "36.0968327481" }, { "code": "410503", "name": "北关区", "longitude": "114.362381899", "latitude": "36.1131316078" }, { "code": "410505", "name": "殷都区", "longitude": "114.309597557", "latitude": "36.1157582555" }, { "code": "410506", "name": "龙安区", "longitude": "114.307593168", "latitude": "36.0827527836" }, { "code": "410522", "name": "安阳县", "longitude": "114.476733765", "latitude": "36.0886238159" }, { "code": "410523", "name": "汤阴县", "longitude": "114.363409381", "latitude": "35.9276437402" }, { "code": "410526", "name": "滑县", "longitude": "114.525553166", "latitude": "35.5810454006" }, { "code": "410527", "name": "内黄县", "longitude": "114.907588756", "latitude": "35.9769496681" }, { "code": "410581", "name": "林州市", "longitude": "113.825590189", "latitude": "36.0888532084" } ] }, { "code": "4106", "name": "鹤壁市", "townList": [ { "code": "410602", "name": "鹤山区", "longitude": "114.169554782", "latitude": "35.9602802482" }, { "code": "410603", "name": "山城区", "longitude": "114.190620586", "latitude": "35.9033696133" }, { "code": "410611", "name": "淇滨区", "longitude": "114.305591204", "latitude": "35.7469525463" }, { "code": "410621", "name": "浚县", "longitude": "114.557607851", "latitude": "35.6819173059" }, { "code": "410622", "name": "淇县", "longitude": "114.215489724", "latitude": "35.6272770203" } ] }, { "code": "4107", "name": "新乡市", "townList": [ { "code": "410702", "name": "红旗区", "longitude": "113.881415834", "latitude": "35.3101355127" }, { "code": "410703", "name": "卫滨区", "longitude": "113.872438798", "latitude": "35.3084592096" }, { "code": "410704", "name": "凤泉区", "longitude": "113.91251023", "latitude": "35.377820185" }, { "code": "410711", "name": "牧野区", "longitude": "113.915512906", "latitude": "35.3210234865" }, { "code": "410721", "name": "新乡县", "longitude": "113.811593781", "latitude": "35.196564409" }, { "code": "410724", "name": "获嘉县", "longitude": "113.66341667", "latitude": "35.2658092842" }, { "code": "410725", "name": "原阳县", "longitude": "113.946623741", "latitude": "35.0711638645" }, { "code": "410726", "name": "延津县", "longitude": "114.211511758", "latitude": "35.1478065105" }, { "code": "410727", "name": "封丘县", "longitude": "114.425606168", "latitude": "35.0468575317" }, { "code": "410781", "name": "卫辉市", "longitude": "114.071600945", "latitude": "35.4040688821" }, { "code": "410782", "name": "辉县市", "longitude": "113.81157303", "latitude": "35.4679578184" }, { "code": "410783", "name": "长垣市", "longitude": "114.675609891", "latitude": "35.2071982246" } ] }, { "code": "4108", "name": "焦作市", "townList": [ { "code": "410802", "name": "解放区", "longitude": "113.237571799", "latitude": "35.2463098076" }, { "code": "410803", "name": "中站区", "longitude": "113.189447596", "latitude": "35.2426171036" }, { "code": "410804", "name": "马村区", "longitude": "113.328544006", "latitude": "35.2618944417" }, { "code": "410811", "name": "山阳区", "longitude": "113.26048371", "latitude": "35.220272353" }, { "code": "410821", "name": "修武县", "longitude": "113.454581929", "latitude": "35.2293234826" }, { "code": "410822", "name": "博爱县", "longitude": "113.070477991", "latitude": "35.1773080638" }, { "code": "410823", "name": "武陟县", "longitude": "113.40839582", "latitude": "35.1058384492" }, { "code": "410825", "name": "温县", "longitude": "113.086569068", "latitude": "34.9461354922" }, { "code": "410882", "name": "沁阳市", "longitude": "112.957516882", "latitude": "35.0937857323" }, { "code": "410883", "name": "孟州市", "longitude": "112.797394913", "latitude": "34.9135978179" } ] }, { "code": "4109", "name": "濮阳市", "townList": [ { "code": "410902", "name": "华龙区", "longitude": "115.080412944", "latitude": "35.7836328845" }, { "code": "410922", "name": "清丰县", "longitude": "115.110471863", "latitude": "35.8913081683" }, { "code": "410923", "name": "南乐县", "longitude": "115.211386157", "latitude": "36.0760308329" }, { "code": "410926", "name": "范县", "longitude": "115.51058621", "latitude": "35.8576550877" }, { "code": "410927", "name": "台前县", "longitude": "115.878568169", "latitude": "35.9750127125" }, { "code": "410928", "name": "濮阳县", "longitude": "115.035584086", "latitude": "35.7178888894" } ] }, { "code": "4110", "name": "许昌市", "townList": [ { "code": "411002", "name": "魏都区", "longitude": "113.837540707", "latitude": "34.0532507525" }, { "code": "411003", "name": "建安区", "longitude": "113.829477876", "latitude": "34.1305254764" }, { "code": "411024", "name": "鄢陵县", "longitude": "114.184637691", "latitude": "34.1088816977" }, { "code": "411025", "name": "襄城县", "longitude": "113.513420131", "latitude": "33.8579118216" }, { "code": "411081", "name": "禹州市", "longitude": "113.495223606", "latitude": "34.1482665225" }, { "code": "411082", "name": "长葛市", "longitude": "113.820657594", "latitude": "34.2015387543" } ] }, { "code": "4111", "name": "漯河市", "townList": [ { "code": "411102", "name": "源汇区", "longitude": "113.99041353", "latitude": "33.5784232624" }, { "code": "411103", "name": "郾城区", "longitude": "114.013393892", "latitude": "33.5934158809" }, { "code": "411104", "name": "召陵区", "longitude": "114.100466555", "latitude": "33.5924675386" }, { "code": "411121", "name": "舞阳县", "longitude": "113.615490005", "latitude": "33.4435777999" }, { "code": "411122", "name": "临颍县", "longitude": "113.937578344", "latitude": "33.8326919479" } ] }, { "code": "4112", "name": "三门峡市", "townList": [ { "code": "411202", "name": "湖滨区", "longitude": "111.195573897", "latitude": "34.7759967924" }, { "code": "411203", "name": "陕州区", "longitude": "111.109450652", "latitude": "34.7269148015" }, { "code": "411221", "name": "渑池县", "longitude": "111.768542346", "latitude": "34.773197043" }, { "code": "411224", "name": "卢氏县", "longitude": "111.054564006", "latitude": "34.0599248453" }, { "code": "411281", "name": "义马市", "longitude": "111.88051478", "latitude": "34.7530280095" }, { "code": "411282", "name": "灵宝市", "longitude": "110.900408313", "latitude": "34.5231426242" } ] }, { "code": "4113", "name": "南阳市", "townList": [ { "code": "411302", "name": "宛城区", "longitude": "112.546454167", "latitude": "33.0098700406" }, { "code": "411303", "name": "卧龙区", "longitude": "112.541461834", "latitude": "32.9924837975" }, { "code": "411321", "name": "南召县", "longitude": "112.435425223", "latitude": "33.4961858046" }, { "code": "411322", "name": "方城县", "longitude": "113.018502753", "latitude": "33.2605394558" }, { "code": "411323", "name": "西峡县", "longitude": "111.480398098", "latitude": "33.3133161153" }, { "code": "411324", "name": "镇平县", "longitude": "112.241544483", "latitude": "33.0397185292" }, { "code": "411325", "name": "内乡县", "longitude": "111.855425287", "latitude": "33.0512031055" }, { "code": "411326", "name": "淅川县", "longitude": "111.497432036", "latitude": "33.14418526" }, { "code": "411327", "name": "社旗县", "longitude": "112.954493455", "latitude": "33.0622366859" }, { "code": "411328", "name": "唐河县", "longitude": "112.813424366", "latitude": "32.68772066" }, { "code": "411329", "name": "新野县", "longitude": "112.366549624", "latitude": "32.5266317788" }, { "code": "411330", "name": "桐柏县", "longitude": "113.434472731", "latitude": "32.385130755" }, { "code": "411381", "name": "邓州市", "longitude": "112.093420103", "latitude": "32.69391744" } ] }, { "code": "4114", "name": "商丘市", "townList": [ { "code": "411402", "name": "梁园区", "longitude": "115.620602046", "latitude": "34.4494712463" }, { "code": "411403", "name": "睢阳区", "longitude": "115.659475947", "latitude": "34.3941519205" }, { "code": "411421", "name": "民权县", "longitude": "115.154576059", "latitude": "34.6524787265" }, { "code": "411422", "name": "睢县", "longitude": "115.078410891", "latitude": "34.4516169654" }, { "code": "411423", "name": "宁陵县", "longitude": "115.320418437", "latitude": "34.4666340277" }, { "code": "411424", "name": "柘城县", "longitude": "115.312434567", "latitude": "34.0973602124" }, { "code": "411425", "name": "虞城县", "longitude": "115.834472957", "latitude": "34.4053315021" }, { "code": "411426", "name": "夏邑县", "longitude": "116.137512368", "latitude": "34.2435234724" }, { "code": "411481", "name": "永城市", "longitude": "116.455566148", "latitude": "33.9348014759" } ] }, { "code": "4115", "name": "信阳市", "townList": [ { "code": "411502", "name": "浉河区", "longitude": "114.065581309", "latitude": "32.1225541569" }, { "code": "411503", "name": "平桥区", "longitude": "114.132407424", "latitude": "32.1073253861" }, { "code": "411521", "name": "罗山县", "longitude": "114.519529938", "latitude": "32.2091504518" }, { "code": "411522", "name": "光山县", "longitude": "114.925533037", "latitude": "32.0159068796" }, { "code": "411523", "name": "新县", "longitude": "114.885524755", "latitude": "31.6497384685" }, { "code": "411524", "name": "商城县", "longitude": "115.413513341", "latitude": "31.8043453669" }, { "code": "411525", "name": "固始县", "longitude": "115.660487888", "latitude": "32.1741743796" }, { "code": "411526", "name": "潢川县", "longitude": "115.058470754", "latitude": "32.1375307164" }, { "code": "411527", "name": "淮滨县", "longitude": "115.426438969", "latitude": "32.4794697567" }, { "code": "411528", "name": "息县", "longitude": "114.747453132", "latitude": "32.3489555117" } ] }, { "code": "4116", "name": "周口市", "townList": [ { "code": "411602", "name": "川汇区", "longitude": "114.657601741", "latitude": "33.6529971028" }, { "code": "411603", "name": "淮阳区", "longitude": "114.892586155", "latitude": "33.7373471835" }, { "code": "411621", "name": "扶沟县", "longitude": "114.401509841", "latitude": "34.065906254" }, { "code": "411622", "name": "西华县", "longitude": "114.535596671", "latitude": "33.7732153349" }, { "code": "411623", "name": "商水县", "longitude": "114.618415947", "latitude": "33.5488774754" }, { "code": "411624", "name": "沈丘县", "longitude": "115.105455456", "latitude": "33.4156910941" }, { "code": "411625", "name": "郸城县", "longitude": "115.183477601", "latitude": "33.650827955" }, { "code": "411627", "name": "太康县", "longitude": "114.84438389", "latitude": "34.0700383822" }, { "code": "411628", "name": "鹿邑县", "longitude": "115.490585259", "latitude": "33.8671732903" }, { "code": "411681", "name": "项城市", "longitude": "114.881514001", "latitude": "33.4730074414" } ] }, { "code": "4117", "name": "驻马店市", "townList": [ { "code": "411702", "name": "驿城区", "longitude": "114.000386967", "latitude": "32.979519872" }, { "code": "411721", "name": "西平县", "longitude": "114.027473573", "latitude": "33.3938609975" }, { "code": "411722", "name": "上蔡县", "longitude": "114.270486862", "latitude": "33.2685112159" }, { "code": "411723", "name": "平舆县", "longitude": "114.625428659", "latitude": "32.9679824004" }, { "code": "411724", "name": "正阳县", "longitude": "114.399496559", "latitude": "32.6116410773" }, { "code": "411725", "name": "确山县", "longitude": "114.032495011", "latitude": "32.808175693" }, { "code": "411726", "name": "泌阳县", "longitude": "113.333557988", "latitude": "32.7297306504" }, { "code": "411727", "name": "汝南县", "longitude": "114.369408894", "latitude": "33.013140882" }, { "code": "411728", "name": "遂平县", "longitude": "114.019441464", "latitude": "33.1519713996" }, { "code": "411729", "name": "新蔡县", "longitude": "114.97184913", "latitude": "32.7513151242" } ] }, { "code": "4190", "name": "河南省", "townList": [ { "code": "419001", "name": "济源市", "longitude": "112.608580706", "latitude": "35.0729072268" } ] } ] }, { "code": "42", "name": "湖北省", "cityList": [ { "code": "4201", "name": "武汉市", "townList": [ { "code": "420102", "name": "江岸区", "longitude": "114.316579188", "latitude": "30.6054027976" }, { "code": "420103", "name": "江汉区", "longitude": "114.277506132", "latitude": "30.6072822768" }, { "code": "420104", "name": "硚口区", "longitude": "114.221460312", "latitude": "30.5875843408" }, { "code": "420105", "name": "汉阳区", "longitude": "114.225445555", "latitude": "30.5600520274" }, { "code": "420106", "name": "武昌区", "longitude": "114.322548518", "latitude": "30.5595669835" }, { "code": "420107", "name": "青山区", "longitude": "114.391492657", "latitude": "30.6465930755" }, { "code": "420111", "name": "洪山区", "longitude": "114.350455546", "latitude": "30.5063339568" }, { "code": "420112", "name": "东西湖区", "longitude": "114.143458738", "latitude": "30.6259198181" }, { "code": "420113", "name": "汉南区", "longitude": "114.091514851", "latitude": "30.3148091201" }, { "code": "420114", "name": "蔡甸区", "longitude": "114.035479631", "latitude": "30.5881136219" }, { "code": "420115", "name": "江夏区", "longitude": "114.328551264", "latitude": "30.3815642182" }, { "code": "420116", "name": "黄陂区", "longitude": "114.382453997", "latitude": "30.8875337678" }, { "code": "420117", "name": "新洲区", "longitude": "114.807543393", "latitude": "30.8472438705" } ] }, { "code": "4202", "name": "黄石市", "townList": [ { "code": "420202", "name": "黄石港区", "longitude": "115.072417486", "latitude": "30.22905264" }, { "code": "420203", "name": "西塞山区", "longitude": "115.116481437", "latitude": "30.2106951841" }, { "code": "420204", "name": "下陆区", "longitude": "114.967415902", "latitude": "30.1800461553" }, { "code": "420205", "name": "铁山区", "longitude": "114.907571418", "latitude": "30.2122508326" }, { "code": "420222", "name": "阳新县", "longitude": "115.221426772", "latitude": "29.8365418081" }, { "code": "420281", "name": "大冶市", "longitude": "114.986436264", "latitude": "30.1016678001" } ] }, { "code": "4203", "name": "十堰市", "townList": [ { "code": "420302", "name": "茅箭区", "longitude": "110.81958031", "latitude": "32.5972865191" }, { "code": "420303", "name": "张湾区", "longitude": "110.775424103", "latitude": "32.6583995455" }, { "code": "420304", "name": "郧阳区", "longitude": "110.818576544", "latitude": "32.840592413" }, { "code": "420322", "name": "郧西县", "longitude": "110.432472618", "latitude": "32.9991670075" }, { "code": "420323", "name": "竹山县", "longitude": "110.235581568", "latitude": "32.2303040604" }, { "code": "420324", "name": "竹溪县", "longitude": "109.721542499", "latitude": "32.3241200489" }, { "code": "420325", "name": "房县", "longitude": "110.733591363", "latitude": "32.0466655453" }, { "code": "420381", "name": "丹江口市", "longitude": "111.519532058", "latitude": "32.5462526885" } ] }, { "code": "4205", "name": "宜昌市", "townList": [ { "code": "420502", "name": "西陵区", "longitude": "111.292559721", "latitude": "30.7167493466" }, { "code": "420503", "name": "伍家岗区", "longitude": "111.367422256", "latitude": "30.6507373353" }, { "code": "420504", "name": "点军区", "longitude": "111.274471351", "latitude": "30.6993295139" }, { "code": "420505", "name": "猇亭区", "longitude": "111.441573783", "latitude": "30.5364659827" }, { "code": "420506", "name": "夷陵区", "longitude": "111.332529734", "latitude": "30.7748333273" }, { "code": "420525", "name": "远安县", "longitude": "111.646530359", "latitude": "31.0666278416" }, { "code": "420526", "name": "兴山县", "longitude": "110.75344607", "latitude": "31.3544635177" }, { "code": "420527", "name": "秭归县", "longitude": "110.984449375", "latitude": "30.8319316432" }, { "code": "420528", "name": "长阳土家族自治县", "longitude": "111.213507129", "latitude": "30.4786457831" }, { "code": "420529", "name": "五峰土家族自治县", "longitude": "111.052580637", "latitude": "30.171156151" }, { "code": "420581", "name": "宜都市", "longitude": "111.456515837", "latitude": "30.3844042743" }, { "code": "420582", "name": "当阳市", "longitude": "111.794568502", "latitude": "30.8269890503" }, { "code": "420583", "name": "枝江市", "longitude": "111.766539753", "latitude": "30.431730677" } ] }, { "code": "4206", "name": "襄阳市", "townList": [ { "code": "420602", "name": "襄城区", "longitude": "112.140572069", "latitude": "32.0161746181" }, { "code": "420606", "name": "樊城区", "longitude": "112.142598916", "latitude": "32.0505723747" }, { "code": "420607", "name": "襄州区", "longitude": "112.218434137", "latitude": "32.0933757834" }, { "code": "420624", "name": "南漳县", "longitude": "111.845386184", "latitude": "31.7811297068" }, { "code": "420625", "name": "谷城县", "longitude": "111.659575642", "latitude": "32.2689830689" }, { "code": "420626", "name": "保康县", "longitude": "111.267441212", "latitude": "31.8838471503" }, { "code": "420682", "name": "老河口市", "longitude": "111.681556369", "latitude": "32.3924595853" }, { "code": "420683", "name": "枣阳市", "longitude": "112.77847076", "latitude": "32.1347299143" }, { "code": "420684", "name": "宜城市", "longitude": "112.264611442", "latitude": "31.725469731" } ] }, { "code": "4207", "name": "鄂州市", "townList": [ { "code": "420702", "name": "梁子湖区", "longitude": "114.691506575", "latitude": "30.1059067741" }, { "code": "420703", "name": "华容区", "longitude": "114.736426342", "latitude": "30.5405995278" }, { "code": "420704", "name": "鄂城区", "longitude": "114.898599682", "latitude": "30.4063894563" } ] }, { "code": "4208", "name": "荆门市", "townList": [ { "code": "420802", "name": "东宝区", "longitude": "112.208388207", "latitude": "31.0584292714" }, { "code": "420804", "name": "掇刀区", "longitude": "112.214427694", "latitude": "30.9799108598" }, { "code": "420822", "name": "沙洋县", "longitude": "112.595484939", "latitude": "30.7153147488" }, { "code": "420881", "name": "钟祥市", "longitude": "112.594471022", "latitude": "31.174029855" }, { "code": "420882", "name": "京山市", "longitude": "113.126548065", "latitude": "31.0243306012" } ] }, { "code": "4209", "name": "孝感市", "townList": [ { "code": "420902", "name": "孝南区", "longitude": "113.917489897", "latitude": "30.922977925" }, { "code": "420921", "name": "孝昌县", "longitude": "114.004408591", "latitude": "31.2645404931" }, { "code": "420922", "name": "大悟县", "longitude": "114.133412538", "latitude": "31.5672198066" }, { "code": "420923", "name": "云梦县", "longitude": "113.759412202", "latitude": "31.0272182208" }, { "code": "420981", "name": "应城市", "longitude": "113.579567396", "latitude": "30.9339765099" }, { "code": "420982", "name": "安陆市", "longitude": "113.695582924", "latitude": "31.2614149943" }, { "code": "420984", "name": "汉川市", "longitude": "113.84554901", "latitude": "30.6669135788" } ] }, { "code": "4210", "name": "荆州市", "townList": [ { "code": "421002", "name": "沙市区", "longitude": "112.258613276", "latitude": "30.3316988768" }, { "code": "421003", "name": "荆州区", "longitude": "112.196413974", "latitude": "30.3589894908" }, { "code": "421022", "name": "公安县", "longitude": "112.236501576", "latitude": "30.0644006868" }, { "code": "421023", "name": "监利县", "longitude": "112.245522629", "latitude": "30.3408421077" }, { "code": "421024", "name": "江陵县", "longitude": "112.431452017", "latitude": "30.0480429846" }, { "code": "421081", "name": "石首市", "longitude": "112.431419844", "latitude": "29.7270339774" }, { "code": "421083", "name": "洪湖市", "longitude": "113.482552902", "latitude": "29.8327703298" }, { "code": "421087", "name": "松滋市", "longitude": "111.773580313", "latitude": "30.1753422351" } ] }, { "code": "4211", "name": "黄冈市", "townList": [ { "code": "421102", "name": "黄州区", "longitude": "114.886532385", "latitude": "30.4402241451" }, { "code": "421121", "name": "团风县", "longitude": "114.87852435", "latitude": "30.6493677672" }, { "code": "421122", "name": "红安县", "longitude": "114.624425611", "latitude": "31.294296714" }, { "code": "421123", "name": "罗田县", "longitude": "115.405547167", "latitude": "30.7889104957" }, { "code": "421124", "name": "英山县", "longitude": "115.687421603", "latitude": "30.7413500841" }, { "code": "421125", "name": "浠水县", "longitude": "115.271569033", "latitude": "30.4574608423" }, { "code": "421126", "name": "蕲春县", "longitude": "115.442398534", "latitude": "30.2325354997" }, { "code": "421127", "name": "黄梅县", "longitude": "115.950461985", "latitude": "30.0766050568" }, { "code": "421181", "name": "麻城市", "longitude": "115.016561748", "latitude": "31.1769958374" }, { "code": "421182", "name": "武穴市", "longitude": "115.567392161", "latitude": "29.8504414305" } ] }, { "code": "4212", "name": "咸宁市", "townList": [ { "code": "421202", "name": "咸安区", "longitude": "114.304569906", "latitude": "29.8581539152" }, { "code": "421221", "name": "嘉鱼县", "longitude": "113.945570463", "latitude": "29.9763535209" }, { "code": "421222", "name": "通城县", "longitude": "113.823567909", "latitude": "29.2508579302" }, { "code": "421223", "name": "崇阳县", "longitude": "114.046562909", "latitude": "29.5613337823" }, { "code": "421224", "name": "通山县", "longitude": "114.4893933", "latitude": "29.6126343381" }, { "code": "421281", "name": "赤壁市", "longitude": "113.906436862", "latitude": "29.7306659975" } ] }, { "code": "4213", "name": "随州市", "townList": [ { "code": "421303", "name": "曾都区", "longitude": "113.377513335", "latitude": "31.7221228613" }, { "code": "421321", "name": "随县", "longitude": "113.306458357", "latitude": "31.8599716783" }, { "code": "421381", "name": "广水市", "longitude": "113.832593379", "latitude": "31.622476038" } ] }, { "code": "4228", "name": "恩施土家族苗族自治州", "townList": [ { "code": "422801", "name": "恩施市", "longitude": "109.486550269", "latitude": "30.3010371437" }, { "code": "422802", "name": "利川市", "longitude": "108.942480578", "latitude": "30.2972034437" }, { "code": "422822", "name": "建始县", "longitude": "109.728556109", "latitude": "30.6079070263" }, { "code": "422823", "name": "巴东县", "longitude": "110.347575292", "latitude": "31.048064249" }, { "code": "422825", "name": "宣恩县", "longitude": "109.497567973", "latitude": "29.9926039221" }, { "code": "422826", "name": "咸丰县", "longitude": "109.146607736", "latitude": "29.6710776524" }, { "code": "422827", "name": "来凤县", "longitude": "109.413494842", "latitude": "29.4994435726" }, { "code": "422828", "name": "鹤峰县", "longitude": "110.040424233", "latitude": "29.8961164834" } ] }, { "code": "4290", "name": "湖北省", "townList": [ { "code": "429004", "name": "仙桃市", "longitude": "113.449609359", "latitude": "30.3335877511" }, { "code": "429005", "name": "潜江市", "longitude": "112.905474091", "latitude": "30.4083579324" }, { "code": "429006", "name": "天门市", "longitude": "113.172409166", "latitude": "30.6696218301" }, { "code": "429021", "name": "神农架林区", "longitude": "110.68699401", "latitude": "31.7493092381" } ] } ] }, { "code": "43", "name": "湖南省", "cityList": [ { "code": "4301", "name": "长沙市", "townList": [ { "code": "430102", "name": "芙蓉区", "longitude": "113.039407745", "latitude": "28.1919132473" }, { "code": "430103", "name": "天心区", "longitude": "112.996592259", "latitude": "28.1182112174" }, { "code": "430104", "name": "岳麓区", "longitude": "112.937447644", "latitude": "28.2414888365" }, { "code": "430105", "name": "开福区", "longitude": "112.992584918", "latitude": "28.2613786877" }, { "code": "430111", "name": "雨花区", "longitude": "113.04242156", "latitude": "28.1422327117" }, { "code": "430112", "name": "望城区", "longitude": "112.824466143", "latitude": "28.3674030204" }, { "code": "430121", "name": "长沙县", "longitude": "113.087559166", "latitude": "28.2518184879" }, { "code": "430181", "name": "浏阳市", "longitude": "113.649398239", "latitude": "28.1698322161" }, { "code": "430182", "name": "宁乡市", "longitude": "112.558406916", "latitude": "28.2841045362" } ] }, { "code": "4302", "name": "株洲市", "townList": [ { "code": "430202", "name": "荷塘区", "longitude": "113.18045222", "latitude": "27.8621558091" }, { "code": "430203", "name": "芦淞区", "longitude": "113.158418672", "latitude": "27.7915088259" }, { "code": "430204", "name": "石峰区", "longitude": "113.124567916", "latitude": "27.8807051656" }, { "code": "430211", "name": "天元区", "longitude": "113.089540558", "latitude": "27.8330835195" }, { "code": "430212", "name": "渌口区", "longitude": "113.150426718", "latitude": "27.7043228049" }, { "code": "430223", "name": "攸县", "longitude": "113.351578342", "latitude": "27.0057715652" }, { "code": "430224", "name": "茶陵县", "longitude": "113.545471657", "latitude": "26.7835891104" }, { "code": "430225", "name": "炎陵县", "longitude": "113.779418798", "latitude": "26.4960606916" }, { "code": "430281", "name": "醴陵市", "longitude": "113.503483151", "latitude": "27.65232515" } ] }, { "code": "4303", "name": "湘潭市", "townList": [ { "code": "430302", "name": "雨湖区", "longitude": "112.913449592", "latitude": "27.8624667851" }, { "code": "430304", "name": "岳塘区", "longitude": "112.975589427", "latitude": "27.8777205064" }, { "code": "430321", "name": "湘潭县", "longitude": "112.957505369", "latitude": "27.7849825347" }, { "code": "430381", "name": "湘乡市", "longitude": "112.541491553", "latitude": "27.7401905533" }, { "code": "430382", "name": "韶山市", "longitude": "112.533499329", "latitude": "27.9210437496" } ] }, { "code": "4304", "name": "衡阳市", "townList": [ { "code": "430405", "name": "珠晖区", "longitude": "112.626594143", "latitude": "26.9002653619" }, { "code": "430406", "name": "雁峰区", "longitude": "112.620411106", "latitude": "26.8465393997" }, { "code": "430407", "name": "石鼓区", "longitude": "112.604529693", "latitude": "26.9489618672" }, { "code": "430408", "name": "蒸湘区", "longitude": "112.573444011", "latitude": "26.9177198779" }, { "code": "430412", "name": "南岳区", "longitude": "112.745574348", "latitude": "27.2383604746" }, { "code": "430421", "name": "衡阳县", "longitude": "112.377552684", "latitude": "26.9752949509" }, { "code": "430422", "name": "衡南县", "longitude": "112.684402528", "latitude": "26.7445319568" }, { "code": "430423", "name": "衡山县", "longitude": "112.875563288", "latitude": "27.2359960297" }, { "code": "430424", "name": "衡东县", "longitude": "112.959495295", "latitude": "27.0870428203" }, { "code": "430426", "name": "祁东县", "longitude": "112.096447378", "latitude": "26.8059952552" }, { "code": "430481", "name": "耒阳市", "longitude": "112.866597211", "latitude": "26.4280655939" }, { "code": "430482", "name": "常宁市", "longitude": "112.405560503", "latitude": "26.4267204323" } ] }, { "code": "4305", "name": "邵阳市", "townList": [ { "code": "430502", "name": "双清区", "longitude": "111.503441506", "latitude": "27.2391087833" }, { "code": "430503", "name": "大祥区", "longitude": "111.445528289", "latitude": "27.2270139687" }, { "code": "430511", "name": "北塔区", "longitude": "111.458496946", "latitude": "27.2515362762" }, { "code": "430522", "name": "新邵县", "longitude": "111.464449388", "latitude": "27.3271317392" }, { "code": "430523", "name": "邵阳县", "longitude": "111.280507681", "latitude": "26.9965283322" }, { "code": "430524", "name": "隆回县", "longitude": "111.039506685", "latitude": "27.11994644" }, { "code": "430525", "name": "洞口县", "longitude": "110.582579096", "latitude": "27.0659754378" }, { "code": "430527", "name": "绥宁县", "longitude": "110.16241987", "latitude": "26.5884227193" }, { "code": "430528", "name": "新宁县", "longitude": "110.863490727", "latitude": "26.439723698" }, { "code": "430529", "name": "城步苗族自治县", "longitude": "110.32853713", "latitude": "26.3962032201" }, { "code": "430581", "name": "武冈市", "longitude": "110.638407616", "latitude": "26.732898573" }, { "code": "430582", "name": "邵东市", "longitude": "111.750490703", "latitude": "27.2645074716" } ] }, { "code": "4306", "name": "岳阳市", "townList": [ { "code": "430602", "name": "岳阳楼区", "longitude": "113.136480704", "latitude": "29.3779950369" }, { "code": "430603", "name": "云溪区", "longitude": "113.278406597", "latitude": "29.4799071411" }, { "code": "430611", "name": "君山区", "longitude": "113.012517149", "latitude": "29.4671291858" }, { "code": "430621", "name": "岳阳县", "longitude": "113.122544483", "latitude": "29.150269316" }, { "code": "430623", "name": "华容县", "longitude": "112.547461512", "latitude": "29.5362864344" }, { "code": "430624", "name": "湘阴县", "longitude": "112.889521877", "latitude": "28.6766763776" }, { "code": "430626", "name": "平江县", "longitude": "113.587603623", "latitude": "28.7075642481" }, { "code": "430681", "name": "汨罗市", "longitude": "113.073492869", "latitude": "28.8124546948" }, { "code": "430682", "name": "临湘市", "longitude": "113.45656151", "latitude": "29.4828013734" } ] }, { "code": "4307", "name": "常德市", "townList": [ { "code": "430702", "name": "武陵区", "longitude": "111.689544896", "latitude": "29.0607834766" }, { "code": "430703", "name": "鼎城区", "longitude": "111.687522092", "latitude": "29.0244433971" }, { "code": "430721", "name": "安乡县", "longitude": "112.177506156", "latitude": "29.4173204322" }, { "code": "430722", "name": "汉寿县", "longitude": "111.976411934", "latitude": "28.9122876031" }, { "code": "430723", "name": "澧县", "longitude": "111.765533547", "latitude": "29.6389460046" }, { "code": "430724", "name": "临澧县", "longitude": "111.653585008", "latitude": "29.4465439901" }, { "code": "430725", "name": "桃源县", "longitude": "111.495407331", "latitude": "28.908694007" }, { "code": "430726", "name": "石门县", "longitude": "111.386451407", "latitude": "29.5903659666" }, { "code": "430781", "name": "津市市", "longitude": "111.884517346", "latitude": "29.611258543" } ] }, { "code": "4308", "name": "张家界市", "townList": [ { "code": "430802", "name": "永定区", "longitude": "110.544431924", "latitude": "29.1261905584" }, { "code": "430811", "name": "武陵源区", "longitude": "110.557498945", "latitude": "29.3516811367" }, { "code": "430821", "name": "慈利县", "longitude": "111.145471252", "latitude": "29.435986726" }, { "code": "430822", "name": "桑植县", "longitude": "110.170413352", "latitude": "29.4059232194" } ] }, { "code": "4309", "name": "益阳市", "townList": [ { "code": "430902", "name": "资阳区", "longitude": "112.330435482", "latitude": "28.5972345497" }, { "code": "430903", "name": "赫山区", "longitude": "112.38059794", "latitude": "28.5849835676" }, { "code": "430921", "name": "南县", "longitude": "112.402541567", "latitude": "29.3670698534" }, { "code": "430922", "name": "桃江县", "longitude": "112.162541464", "latitude": "28.5238708699" }, { "code": "430923", "name": "安化县", "longitude": "111.219492704", "latitude": "28.3800537488" }, { "code": "430981", "name": "沅江市", "longitude": "112.36053222", "latitude": "28.8502335886" } ] }, { "code": "4310", "name": "郴州市", "townList": [ { "code": "431002", "name": "北湖区", "longitude": "113.017410129", "latitude": "25.7905372613" }, { "code": "431003", "name": "苏仙区", "longitude": "113.048423408", "latitude": "25.8067373741" }, { "code": "431021", "name": "桂阳县", "longitude": "112.740560366", "latitude": "25.7597753279" }, { "code": "431022", "name": "宜章县", "longitude": "112.955479241", "latitude": "25.4057139694" }, { "code": "431023", "name": "永兴县", "longitude": "113.122533164", "latitude": "26.1329684785" }, { "code": "431024", "name": "嘉禾县", "longitude": "112.375583778", "latitude": "25.5934217183" }, { "code": "431025", "name": "临武县", "longitude": "112.570411152", "latitude": "25.282527011" }, { "code": "431026", "name": "汝城县", "longitude": "113.691544667", "latitude": "25.556056734" }, { "code": "431027", "name": "桂东县", "longitude": "113.951593602", "latitude": "26.0831739273" }, { "code": "431028", "name": "安仁县", "longitude": "113.275423594", "latitude": "26.7156827885" }, { "code": "431081", "name": "资兴市", "longitude": "113.242556122", "latitude": "25.9818736027" } ] }, { "code": "4311", "name": "永州市", "townList": [ { "code": "431102", "name": "零陵区", "longitude": "111.637502375", "latitude": "26.2276820898" }, { "code": "431103", "name": "冷水滩区", "longitude": "111.598426085", "latitude": "26.4677055108" }, { "code": "431121", "name": "祁阳县", "longitude": "111.619455058", "latitude": "26.4258641179" }, { "code": "431122", "name": "东安县", "longitude": "111.323542354", "latitude": "26.3982880394" }, { "code": "431123", "name": "双牌县", "longitude": "111.667593813", "latitude": "25.9671692398" }, { "code": "431124", "name": "道县", "longitude": "111.607404379", "latitude": "25.5325299628" }, { "code": "431125", "name": "江永县", "longitude": "111.350436632", "latitude": "25.2797206679" }, { "code": "431126", "name": "宁远县", "longitude": "111.952453407", "latitude": "25.5770519375" }, { "code": "431127", "name": "蓝山县", "longitude": "112.203434936", "latitude": "25.3759347246" }, { "code": "431128", "name": "新田县", "longitude": "112.2104092", "latitude": "25.9098258028" }, { "code": "431129", "name": "江华瑶族自治县", "longitude": "111.585452038", "latitude": "25.191348924" } ] }, { "code": "4312", "name": "怀化市", "townList": [ { "code": "431202", "name": "鹤城区", "longitude": "110.046399941", "latitude": "27.5852257632" }, { "code": "431221", "name": "中方县", "longitude": "109.951461894", "latitude": "27.4460811741" }, { "code": "431222", "name": "沅陵县", "longitude": "110.400430766", "latitude": "28.4590181026" }, { "code": "431223", "name": "辰溪县", "longitude": "110.190486618", "latitude": "28.0126053138" }, { "code": "431224", "name": "溆浦县", "longitude": "110.601551129", "latitude": "27.9139633739" }, { "code": "431225", "name": "会同县", "longitude": "109.741585568", "latitude": "26.8933838173" }, { "code": "431226", "name": "麻阳苗族自治县", "longitude": "109.80943629", "latitude": "27.871930163" }, { "code": "431227", "name": "新晃侗族自治县", "longitude": "109.181471511", "latitude": "27.3587829686" }, { "code": "431228", "name": "芷江侗族自治县", "longitude": "109.69140227", "latitude": "27.4495132778" }, { "code": "431229", "name": "靖州苗族侗族自治县", "longitude": "109.702451607", "latitude": "26.5813213511" }, { "code": "431230", "name": "通道侗族自治县", "longitude": "109.790445483", "latitude": "26.1642198647" }, { "code": "431281", "name": "洪江市", "longitude": "109.843509826", "latitude": "27.2150770939" } ] }, { "code": "4313", "name": "娄底市", "townList": [ { "code": "431302", "name": "娄星区", "longitude": "112.008558425", "latitude": "27.7356048421" }, { "code": "431321", "name": "双峰县", "longitude": "112.181460497", "latitude": "27.4629826586" }, { "code": "431322", "name": "新化县", "longitude": "111.334515335", "latitude": "27.7326667511" }, { "code": "431381", "name": "冷水江市", "longitude": "111.441539723", "latitude": "27.692058849" }, { "code": "431382", "name": "涟源市", "longitude": "111.670561994", "latitude": "27.6981675323" } ] }, { "code": "4331", "name": "湘西土家族苗族自治州", "townList": [ { "code": "433101", "name": "吉首市", "longitude": "109.70444881", "latitude": "28.2674931276" }, { "code": "433122", "name": "泸溪县", "longitude": "110.226599218", "latitude": "28.2218730976" }, { "code": "433123", "name": "凤凰县", "longitude": "109.605526688", "latitude": "27.9538478097" }, { "code": "433124", "name": "花垣县", "longitude": "109.488561831", "latitude": "28.5779099344" }, { "code": "433125", "name": "保靖县", "longitude": "109.666473573", "latitude": "28.7059688725" }, { "code": "433126", "name": "古丈县", "longitude": "109.957507401", "latitude": "28.6230835278" }, { "code": "433127", "name": "永顺县", "longitude": "109.863585787", "latitude": "28.9857744857" }, { "code": "433130", "name": "龙山县", "longitude": "109.450415737", "latitude": "29.4641217659" } ] } ] }, { "code": "44", "name": "广东省", "cityList": [ { "code": "4401", "name": "广州市", "townList": [ { "code": "440103", "name": "荔湾区", "longitude": "113.250502263", "latitude": "23.131791135" }, { "code": "440104", "name": "越秀区", "longitude": "113.273426481", "latitude": "23.1352601201" }, { "code": "440105", "name": "海珠区", "longitude": "113.323539981", "latitude": "23.0889812966" }, { "code": "440106", "name": "天河区", "longitude": "113.368509424", "latitude": "23.1303578351" }, { "code": "440111", "name": "白云区", "longitude": "113.279433091", "latitude": "23.1643168345" }, { "code": "440112", "name": "黄埔区", "longitude": "113.48707084", "latitude": "23.1874915414" }, { "code": "440113", "name": "番禺区", "longitude": "113.39046958", "latitude": "22.9438307315" }, { "code": "440114", "name": "花都区", "longitude": "113.226575806", "latitude": "23.4111615049" }, { "code": "440115", "name": "南沙区", "longitude": "113.531435544", "latitude": "22.8079292965" }, { "code": "440117", "name": "从化区", "longitude": "113.593585439", "latitude": "23.5539859226" }, { "code": "440118", "name": "增城区", "longitude": "113.817545669", "latitude": "23.2665924006" } ] }, { "code": "4402", "name": "韶关市", "townList": [ { "code": "440203", "name": "武江区", "longitude": "113.594555789", "latitude": "24.7984860307" }, { "code": "440204", "name": "浈江区", "longitude": "113.617477401", "latitude": "24.8104137498" }, { "code": "440205", "name": "曲江区", "longitude": "113.611501065", "latitude": "24.6884078464" }, { "code": "440222", "name": "始兴县", "longitude": "114.068567352", "latitude": "24.9585581543" }, { "code": "440224", "name": "仁化县", "longitude": "113.755442934", "latitude": "25.0922875244" }, { "code": "440229", "name": "翁源县", "longitude": "114.136427237", "latitude": "24.3565944909" }, { "code": "440232", "name": "乳源瑶族自治县", "longitude": "113.282431365", "latitude": "24.7823333229" }, { "code": "440233", "name": "新丰县", "longitude": "114.213511731", "latitude": "24.0655465052" }, { "code": "440281", "name": "乐昌市", "longitude": "113.354578682", "latitude": "25.1355915612" }, { "code": "440282", "name": "南雄市", "longitude": "114.318578891", "latitude": "25.1235265374" } ] }, { "code": "4403", "name": "深圳市", "townList": [ { "code": "440303", "name": "罗湖区", "longitude": "114.137431902", "latitude": "22.5544848759" }, { "code": "440304", "name": "福田区", "longitude": "114.06149095", "latitude": "22.5285011313" }, { "code": "440305", "name": "南山区", "longitude": "113.936539169", "latitude": "22.5385001958" }, { "code": "440306", "name": "宝安区", "longitude": "113.890427441", "latitude": "22.5600329089" }, { "code": "440307", "name": "龙岗区", "longitude": "114.254454879", "latitude": "22.7260165508" }, { "code": "440308", "name": "盐田区", "longitude": "114.243430155", "latitude": "22.5634379148" }, { "code": "440309", "name": "龙华区", "longitude": "114.05115334", "latitude": "22.7026873382" }, { "code": "440310", "name": "坪山区", "longitude": "114.357197314", "latitude": "22.7153763651" }, { "code": "440311", "name": "光明区", "longitude": "113.942728225", "latitude": "22.7544129759" }, { "code": "440312", "name": "大鹏新区", "longitude": "114.422632133", "latitude": "22.6453340638" }, { "code": "440313", "name": "深汕特别合作区", "longitude": "114.378503594", "latitude": "22.7485655063" } ] }, { "code": "4404", "name": "珠海市", "townList": [ { "code": "440402", "name": "香洲区", "longitude": "113.550472434", "latitude": "22.2730038618" }, { "code": "440403", "name": "斗门区", "longitude": "113.303467255", "latitude": "22.2155156622" }, { "code": "440404", "name": "金湾区", "longitude": "113.369517054", "latitude": "22.1525767807" } ] }, { "code": "4405", "name": "汕头市", "townList": [ { "code": "440507", "name": "龙湖区", "longitude": "116.723524647", "latitude": "23.3777757806" }, { "code": "440511", "name": "金平区", "longitude": "116.709550067", "latitude": "23.3717503858" }, { "code": "440512", "name": "濠江区", "longitude": "116.733516589", "latitude": "23.2915463598" }, { "code": "440513", "name": "潮阳区", "longitude": "116.608514503", "latitude": "23.2708549569" }, { "code": "440514", "name": "潮南区", "longitude": "116.439491314", "latitude": "23.2563414327" }, { "code": "440515", "name": "澄海区", "longitude": "116.762425048", "latitude": "23.4723414015" }, { "code": "440523", "name": "南澳县", "longitude": "117.030496031", "latitude": "23.4278120459" } ] }, { "code": "4406", "name": "佛山市", "townList": [ { "code": "440604", "name": "禅城区", "longitude": "113.129505182", "latitude": "23.0153743688" }, { "code": "440605", "name": "南海区", "longitude": "113.149445678", "latitude": "23.035011446" }, { "code": "440606", "name": "顺德区", "longitude": "113.30045344", "latitude": "22.8104534268" }, { "code": "440607", "name": "三水区", "longitude": "112.903470855", "latitude": "23.161920494" }, { "code": "440608", "name": "高明区", "longitude": "112.899472407", "latitude": "22.9063496016" } ] }, { "code": "4407", "name": "江门市", "townList": [ { "code": "440703", "name": "蓬江区", "longitude": "113.084546429", "latitude": "22.601065786" }, { "code": "440704", "name": "江海区", "longitude": "113.11755718", "latitude": "22.5661154518" }, { "code": "440705", "name": "新会区", "longitude": "113.038454822", "latitude": "22.4651130605" }, { "code": "440781", "name": "台山市", "longitude": "112.800444825", "latitude": "22.2579234703" }, { "code": "440783", "name": "开平市", "longitude": "112.704464295", "latitude": "22.3824994902" }, { "code": "440784", "name": "鹤山市", "longitude": "112.970526667", "latitude": "22.7711694314" }, { "code": "440785", "name": "恩平市", "longitude": "112.311437578", "latitude": "22.1890352015" } ] }, { "code": "4408", "name": "湛江市", "townList": [ { "code": "440802", "name": "赤坎区", "longitude": "110.372532541", "latitude": "21.2721348127" }, { "code": "440803", "name": "霞山区", "longitude": "110.404425351", "latitude": "21.1982271853" }, { "code": "440804", "name": "坡头区", "longitude": "110.462567097", "latitude": "21.2503767386" }, { "code": "440811", "name": "麻章区", "longitude": "110.340579185", "latitude": "21.2691887666" }, { "code": "440823", "name": "遂溪县", "longitude": "110.256515306", "latitude": "21.383102962" }, { "code": "440825", "name": "徐闻县", "longitude": "110.182472744", "latitude": "20.3317236867" }, { "code": "440881", "name": "廉江市", "longitude": "110.292447706", "latitude": "21.6158164953" }, { "code": "440882", "name": "雷州市", "longitude": "110.102580506", "latitude": "20.9198805927" }, { "code": "440883", "name": "吴川市", "longitude": "110.78645034", "latitude": "21.4472627686" } ] }, { "code": "4409", "name": "茂名市", "townList": [ { "code": "440902", "name": "茂南区", "longitude": "110.925545762", "latitude": "21.6471520823" }, { "code": "440904", "name": "电白区", "longitude": "111.020471232", "latitude": "21.5203511882" }, { "code": "440981", "name": "高州市", "longitude": "110.859473865", "latitude": "21.9240488968" }, { "code": "440982", "name": "化州市", "longitude": "110.646431011", "latitude": "21.6702310939" }, { "code": "440983", "name": "信宜市", "longitude": "110.953581697", "latitude": "22.3600931417" } ] }, { "code": "4412", "name": "肇庆市", "townList": [ { "code": "441202", "name": "端州区", "longitude": "112.49156023", "latitude": "23.0575637262" }, { "code": "441203", "name": "鼎湖区", "longitude": "112.574434483", "latitude": "23.1643081127" }, { "code": "441204", "name": "高要区", "longitude": "112.464446046", "latitude": "23.0318955469" }, { "code": "441223", "name": "广宁县", "longitude": "112.447423875", "latitude": "23.6410357263" }, { "code": "441224", "name": "怀集县", "longitude": "112.173918413", "latitude": "23.9265657809" }, { "code": "441225", "name": "封开县", "longitude": "111.518525853", "latitude": "23.4297689213" }, { "code": "441226", "name": "德庆县", "longitude": "111.791553775", "latitude": "23.1513733061" }, { "code": "441284", "name": "四会市", "longitude": "112.740579141", "latitude": "23.3323810052" } ] }, { "code": "4413", "name": "惠州市", "townList": [ { "code": "441302", "name": "惠城区", "longitude": "114.38949005", "latitude": "23.0897259725" }, { "code": "441303", "name": "惠阳区", "longitude": "114.46346443", "latitude": "22.7947208786" }, { "code": "441322", "name": "博罗县", "longitude": "114.296572651", "latitude": "23.1788055924" }, { "code": "441323", "name": "惠东县", "longitude": "114.726425851", "latitude": "22.991443112" }, { "code": "441324", "name": "龙门县", "longitude": "114.261430221", "latitude": "23.7338383401" } ] }, { "code": "4414", "name": "梅州市", "townList": [ { "code": "441402", "name": "梅江区", "longitude": "116.123535977", "latitude": "24.315878769" }, { "code": "441403", "name": "梅县区", "longitude": "116.088561709", "latitude": "24.2709993147" }, { "code": "441422", "name": "大埔县", "longitude": "116.701558921", "latitude": "24.3534594686" }, { "code": "441423", "name": "丰顺县", "longitude": "116.188453821", "latitude": "23.7457383033" }, { "code": "441424", "name": "五华县", "longitude": "115.782485487", "latitude": "23.9384088996" }, { "code": "441426", "name": "平远县", "longitude": "115.897476946", "latitude": "24.5724141261" }, { "code": "441427", "name": "蕉岭县", "longitude": "116.177439248", "latitude": "24.6649925487" }, { "code": "441481", "name": "兴宁市", "longitude": "115.737579464", "latitude": "24.1422937793" } ] }, { "code": "4415", "name": "汕尾市", "townList": [ { "code": "441502", "name": "城区", "longitude": "115.371530748", "latitude": "22.7845518395" }, { "code": "441521", "name": "海丰县", "longitude": "115.329444776", "latitude": "22.972744261" }, { "code": "441523", "name": "陆河县", "longitude": "115.666482715", "latitude": "23.3076770765" }, { "code": "441581", "name": "陆丰市", "longitude": "115.658490311", "latitude": "22.9236357736" } ] }, { "code": "4416", "name": "河源市", "townList": [ { "code": "441602", "name": "源城区", "longitude": "114.70843899", "latitude": "23.7402983383" }, { "code": "441621", "name": "紫金县", "longitude": "115.190447718", "latitude": "23.6414302532" }, { "code": "441622", "name": "龙川县", "longitude": "115.266555485", "latitude": "24.105850722" }, { "code": "441623", "name": "连平县", "longitude": "114.495444196", "latitude": "24.3758080674" }, { "code": "441624", "name": "和平县", "longitude": "114.945448814", "latitude": "24.4482527677" }, { "code": "441625", "name": "东源县", "longitude": "114.753508325", "latitude": "23.7942578731" } ] }, { "code": "4417", "name": "阳江市", "townList": [ { "code": "441702", "name": "江城区", "longitude": "111.961454518", "latitude": "21.8681278868" }, { "code": "441704", "name": "阳东区", "longitude": "112.018579472", "latitude": "21.8739968443" }, { "code": "441721", "name": "阳西县", "longitude": "111.624481077", "latitude": "21.7587006275" }, { "code": "441781", "name": "阳春市", "longitude": "111.79753613", "latitude": "22.1760148073" } ] }, { "code": "4418", "name": "清远市", "townList": [ { "code": "441802", "name": "清城区", "longitude": "113.069476635", "latitude": "23.7040220379" }, { "code": "441803", "name": "清新区", "longitude": "112.991557795", "latitude": "23.7542703371" }, { "code": "441821", "name": "佛冈县", "longitude": "113.538441249", "latitude": "23.8854754211" }, { "code": "441823", "name": "阳山县", "longitude": "112.647519541", "latitude": "24.4709436359" }, { "code": "441825", "name": "连山壮族瑶族自治县", "longitude": "112.100425704", "latitude": "24.5768456041" }, { "code": "441826", "name": "连南瑶族自治县", "longitude": "112.293517282", "latitude": "24.7315485815" }, { "code": "441881", "name": "英德市", "longitude": "113.421442975", "latitude": "24.1919393552" }, { "code": "441882", "name": "连州市", "longitude": "112.383572589", "latitude": "24.786466855" } ] }, { "code": "4419", "name": "东莞市", "townList": [] }, { "code": "4420", "name": "中山市", "townList": [] }, { "code": "4451", "name": "潮州市", "townList": [ { "code": "445102", "name": "湘桥区", "longitude": "116.634461608", "latitude": "23.6806869816" }, { "code": "445103", "name": "潮安区", "longitude": "116.684526061", "latitude": "23.4683571298" }, { "code": "445122", "name": "饶平县", "longitude": "117.010449176", "latitude": "23.6703471112" } ] }, { "code": "4452", "name": "揭阳市", "townList": [ { "code": "445202", "name": "榕城区", "longitude": "116.373515895", "latitude": "23.530746418" }, { "code": "445203", "name": "揭东区", "longitude": "116.418455784", "latitude": "23.572485187" }, { "code": "445222", "name": "揭西县", "longitude": "115.848560887", "latitude": "23.4372997082" }, { "code": "445224", "name": "惠来县", "longitude": "116.301444485", "latitude": "23.0396453745" }, { "code": "445281", "name": "普宁市", "longitude": "116.172448981", "latitude": "23.3036345219" } ] }, { "code": "4453", "name": "云浮市", "townList": [ { "code": "445302", "name": "云城区", "longitude": "112.050529235", "latitude": "22.933897803" }, { "code": "445303", "name": "云安区", "longitude": "112.00956309", "latitude": "23.0768926119" }, { "code": "445321", "name": "新兴县", "longitude": "112.231496832", "latitude": "22.7018900826" }, { "code": "445322", "name": "郁南县", "longitude": "111.541553824", "latitude": "23.2401740427" }, { "code": "445381", "name": "罗定市", "longitude": "111.576480482", "latitude": "22.7742960608" } ] } ] }, { "code": "45", "name": "广西壮族自治区", "cityList": [ { "code": "4501", "name": "南宁市", "townList": [ { "code": "450102", "name": "兴宁区", "longitude": "108.375444974", "latitude": "22.8602909513" }, { "code": "450103", "name": "青秀区", "longitude": "108.50143861", "latitude": "22.7922274396" }, { "code": "450105", "name": "江南区", "longitude": "108.279494358", "latitude": "22.7870457536" }, { "code": "450107", "name": "西乡塘区", "longitude": "108.319572438", "latitude": "22.8396515093" }, { "code": "450108", "name": "良庆区", "longitude": "108.399878974", "latitude": "22.7598470296" }, { "code": "450109", "name": "邕宁区", "longitude": "108.493420245", "latitude": "22.7646004496" }, { "code": "450110", "name": "武鸣区", "longitude": "108.281516533", "latitude": "23.1645156069" }, { "code": "450123", "name": "隆安县", "longitude": "107.702573903", "latitude": "23.1715852498" }, { "code": "450124", "name": "马山县", "longitude": "108.183562156", "latitude": "23.7138777254" }, { "code": "450125", "name": "上林县", "longitude": "108.611451481", "latitude": "23.4385188777" }, { "code": "450126", "name": "宾阳县", "longitude": "108.816502379", "latitude": "23.2237005438" }, { "code": "450127", "name": "横县", "longitude": "108.373450826", "latitude": "22.8226066012" } ] }, { "code": "4502", "name": "柳州市", "townList": [ { "code": "450202", "name": "城中区", "longitude": "109.41748215", "latitude": "24.3213140699" }, { "code": "450203", "name": "鱼峰区", "longitude": "109.449416282", "latitude": "24.3185216995" }, { "code": "450204", "name": "柳南区", "longitude": "109.391551933", "latitude": "24.3415788709" }, { "code": "450205", "name": "柳北区", "longitude": "109.408531793", "latitude": "24.3678670176" }, { "code": "450206", "name": "柳江区", "longitude": "109.332444239", "latitude": "24.2608149654" }, { "code": "450222", "name": "柳城县", "longitude": "109.251561529", "latitude": "24.6563703915" }, { "code": "450223", "name": "鹿寨县", "longitude": "109.757554475", "latitude": "24.4786222669" }, { "code": "450224", "name": "融安县", "longitude": "109.404563259", "latitude": "25.2305114471" }, { "code": "450225", "name": "融水苗族自治县", "longitude": "109.262560831", "latitude": "25.0720765041" }, { "code": "450226", "name": "三江侗族自治县", "longitude": "109.614547472", "latitude": "25.7888303878" } ] }, { "code": "4503", "name": "桂林市", "townList": [ { "code": "450302", "name": "秀峰区", "longitude": "110.270436706", "latitude": "25.2796184857" }, { "code": "450303", "name": "叠彩区", "longitude": "110.308463146", "latitude": "25.3202332748" }, { "code": "450304", "name": "象山区", "longitude": "110.287422675", "latitude": "25.2679300102" }, { "code": "450305", "name": "七星区", "longitude": "110.324538054", "latitude": "25.2585670875" }, { "code": "450311", "name": "雁山区", "longitude": "110.315479272", "latitude": "25.0662135439" }, { "code": "450312", "name": "临桂区", "longitude": "110.218586692", "latitude": "25.2443019993" }, { "code": "450321", "name": "阳朔县", "longitude": "110.503475032", "latitude": "24.7845191914" }, { "code": "450323", "name": "灵川县", "longitude": "110.332537195", "latitude": "25.4155495308" }, { "code": "450324", "name": "全州县", "longitude": "111.079568955", "latitude": "25.9343430274" }, { "code": "450325", "name": "兴安县", "longitude": "110.678516328", "latitude": "25.61756722" }, { "code": "450326", "name": "永福县", "longitude": "109.989590831", "latitude": "24.9855779731" }, { "code": "450327", "name": "灌阳县", "longitude": "111.167552051", "latitude": "25.4951207521" }, { "code": "450328", "name": "龙胜各族自治县", "longitude": "110.017493997", "latitude": "25.8041167843" }, { "code": "450329", "name": "资源县", "longitude": "110.65843911", "latitude": "26.0485690773" }, { "code": "450330", "name": "平乐县", "longitude": "110.649446263", "latitude": "24.6396321281" }, { "code": "450332", "name": "恭城瑶族自治县", "longitude": "110.834559631", "latitude": "24.8371943659" }, { "code": "450381", "name": "荔浦市", "longitude": "110.401436778", "latitude": "24.4941216419" } ] }, { "code": "4504", "name": "梧州市", "townList": [ { "code": "450403", "name": "万秀区", "longitude": "111.327519691", "latitude": "23.4788457673" }, { "code": "450405", "name": "长洲区", "longitude": "111.28149914", "latitude": "23.4915095844" }, { "code": "450406", "name": "龙圩区", "longitude": "111.253448293", "latitude": "23.4214144857" }, { "code": "450421", "name": "苍梧县", "longitude": "111.55554664", "latitude": "23.8459982055" }, { "code": "450422", "name": "藤县", "longitude": "110.921499255", "latitude": "23.3810099156" }, { "code": "450423", "name": "蒙山县", "longitude": "110.531417004", "latitude": "24.2000174459" }, { "code": "450481", "name": "岑溪市", "longitude": "111.001431827", "latitude": "22.9246212787" } ] }, { "code": "4505", "name": "北海市", "townList": [ { "code": "450502", "name": "海城区", "longitude": "109.124521368", "latitude": "21.4810658382" }, { "code": "450503", "name": "银海区", "longitude": "109.146544764", "latitude": "21.4547686689" }, { "code": "450512", "name": "铁山港区", "longitude": "109.428472649", "latitude": "21.5352950428" }, { "code": "450521", "name": "合浦县", "longitude": "109.213438611", "latitude": "21.6670057356" } ] }, { "code": "4506", "name": "防城港市", "townList": [ { "code": "450602", "name": "港口区", "longitude": "108.386482544", "latitude": "21.6495655866" }, { "code": "450603", "name": "防城区", "longitude": "108.360448482", "latitude": "21.7754113052" }, { "code": "450621", "name": "上思县", "longitude": "107.990442641", "latitude": "22.1599140831" }, { "code": "450681", "name": "东兴市", "longitude": "107.977488986", "latitude": "21.5536154336" } ] }, { "code": "4507", "name": "钦州市", "townList": [ { "code": "450702", "name": "钦南区", "longitude": "108.664548613", "latitude": "21.945972441" }, { "code": "450703", "name": "钦北区", "longitude": "108.638512575", "latitude": "22.0203670502" }, { "code": "450721", "name": "灵山县", "longitude": "109.297477966", "latitude": "22.4224133267" }, { "code": "450722", "name": "浦北县", "longitude": "109.563422929", "latitude": "22.2778223269" } ] }, { "code": "4508", "name": "贵港市", "townList": [ { "code": "450802", "name": "港北区", "longitude": "109.578432986", "latitude": "23.1175636328" }, { "code": "450803", "name": "港南区", "longitude": "109.606553451", "latitude": "23.0812395784" }, { "code": "450804", "name": "覃塘区", "longitude": "109.459426729", "latitude": "23.1332510892" }, { "code": "450821", "name": "平南县", "longitude": "110.398451979", "latitude": "23.5455060988" }, { "code": "450881", "name": "桂平市", "longitude": "110.085525997", "latitude": "23.4000488837" } ] }, { "code": "4509", "name": "玉林市", "townList": [ { "code": "450902", "name": "玉州区", "longitude": "110.1574314", "latitude": "22.6344927362" }, { "code": "450903", "name": "福绵区", "longitude": "110.088537656", "latitude": "22.5637054122" }, { "code": "450921", "name": "容县", "longitude": "110.564530162", "latitude": "22.8636655999" }, { "code": "450922", "name": "陆川县", "longitude": "110.270456199", "latitude": "22.3272215278" }, { "code": "450923", "name": "博白县", "longitude": "109.982553056", "latitude": "22.2786748155" }, { "code": "450924", "name": "兴业县", "longitude": "109.881551807", "latitude": "22.7422676534" }, { "code": "450981", "name": "北流市", "longitude": "110.360570166", "latitude": "22.7139580216" } ] }, { "code": "4510", "name": "百色市", "townList": [ { "code": "451002", "name": "右江区", "longitude": "106.62558914", "latitude": "23.9070845031" }, { "code": "451003", "name": "田阳区", "longitude": "106.921412553", "latitude": "23.7420057225" }, { "code": "451022", "name": "田东县", "longitude": "107.132499435", "latitude": "23.603129804" }, { "code": "451024", "name": "德保县", "longitude": "106.621582607", "latitude": "23.3289943513" }, { "code": "451026", "name": "那坡县", "longitude": "105.83942261", "latitude": "23.3937938313" }, { "code": "451027", "name": "凌云县", "longitude": "106.568415677", "latitude": "24.3540152406" }, { "code": "451028", "name": "乐业县", "longitude": "106.563429722", "latitude": "24.7832164671" }, { "code": "451029", "name": "田林县", "longitude": "106.234497912", "latitude": "24.3005346111" }, { "code": "451030", "name": "西林县", "longitude": "105.100494105", "latitude": "24.4956677904" }, { "code": "451031", "name": "隆林各族自治县", "longitude": "105.35045947", "latitude": "24.7768136103" }, { "code": "451081", "name": "靖西市", "longitude": "106.424452697", "latitude": "23.140125669" }, { "code": "451082", "name": "平果市", "longitude": "107.596571068", "latitude": "23.3349227426" } ] }, { "code": "4511", "name": "贺州市", "townList": [ { "code": "451102", "name": "八步区", "longitude": "111.558567371", "latitude": "24.4175310409" }, { "code": "451103", "name": "平桂区", "longitude": "111.478414266", "latitude": "24.4620014228" }, { "code": "451121", "name": "昭平县", "longitude": "110.817574919", "latitude": "24.1751060506" }, { "code": "451122", "name": "钟山县", "longitude": "111.30958574", "latitude": "24.5316731079" }, { "code": "451123", "name": "富川瑶族自治县", "longitude": "111.284511249", "latitude": "24.8201599513" } ] }, { "code": "4512", "name": "河池市", "townList": [ { "code": "451202", "name": "金城江区", "longitude": "108.043507075", "latitude": "24.6956793822" }, { "code": "451203", "name": "宜州区", "longitude": "108.643531587", "latitude": "24.4910843677" }, { "code": "451221", "name": "南丹县", "longitude": "107.547480289", "latitude": "24.9818497755" }, { "code": "451222", "name": "天峨县", "longitude": "107.178456476", "latitude": "25.0056641552" }, { "code": "451223", "name": "凤山县", "longitude": "107.048419836", "latitude": "24.5532177968" }, { "code": "451224", "name": "东兰县", "longitude": "107.38050416", "latitude": "24.5168714634" }, { "code": "451225", "name": "罗城仫佬族自治县", "longitude": "108.911574453", "latitude": "24.7830849964" }, { "code": "451226", "name": "环江毛南族自治县", "longitude": "108.264443069", "latitude": "24.8320879386" }, { "code": "451227", "name": "巴马瑶族自治县", "longitude": "107.266481253", "latitude": "24.1472648043" }, { "code": "451228", "name": "都安瑶族自治县", "longitude": "108.111458048", "latitude": "23.9373312619" }, { "code": "451229", "name": "大化瑶族自治县", "longitude": "108.004410753", "latitude": "23.742818223" } ] }, { "code": "4513", "name": "来宾市", "townList": [ { "code": "451302", "name": "兴宾区", "longitude": "109.24149907", "latitude": "23.7332110381" }, { "code": "451321", "name": "忻城县", "longitude": "108.672562396", "latitude": "24.0718886366" }, { "code": "451322", "name": "象州县", "longitude": "109.71146215", "latitude": "23.9796809933" }, { "code": "451323", "name": "武宣县", "longitude": "109.669442203", "latitude": "23.6004041976" }, { "code": "451324", "name": "金秀瑶族自治县", "longitude": "110.195506259", "latitude": "24.1363194865" }, { "code": "451381", "name": "合山市", "longitude": "108.89256577", "latitude": "23.812260071" } ] }, { "code": "4514", "name": "崇左市", "townList": [ { "code": "451402", "name": "江州区", "longitude": "107.359533217", "latitude": "22.411245728" }, { "code": "451421", "name": "扶绥县", "longitude": "107.910465154", "latitude": "22.6410971363" }, { "code": "451422", "name": "宁明县", "longitude": "107.083523819", "latitude": "22.1458848442" }, { "code": "451423", "name": "龙州县", "longitude": "106.860581908", "latitude": "22.3482989058" }, { "code": "451424", "name": "大新县", "longitude": "107.207556903", "latitude": "22.8362290444" }, { "code": "451425", "name": "天等县", "longitude": "107.149472649", "latitude": "23.0875058121" }, { "code": "451481", "name": "凭祥市", "longitude": "106.773523618", "latitude": "22.100152593" } ] } ] }, { "code": "46", "name": "海南省", "cityList": [ { "code": "4601", "name": "海口市", "townList": [ { "code": "460105", "name": "秀英区", "longitude": "110.300435888", "latitude": "20.0136423852" }, { "code": "460106", "name": "龙华区", "longitude": "110.335541129", "latitude": "20.0363207335" }, { "code": "460107", "name": "琼山区", "longitude": "110.360526059", "latitude": "20.0091506445" }, { "code": "460108", "name": "美兰区", "longitude": "110.373498399", "latitude": "20.0346462176" } ] }, { "code": "4602", "name": "三亚市", "townList": [ { "code": "460202", "name": "海棠区", "longitude": "109.73711934", "latitude": "18.3592228956" }, { "code": "460203", "name": "吉阳区", "longitude": "109.614831596", "latitude": "18.2808719783" }, { "code": "460204", "name": "天涯区", "longitude": "109.333731511", "latitude": "18.3138120966" }, { "code": "460205", "name": "崖州区", "longitude": "109.121028453", "latitude": "18.3728530875" } ] }, { "code": "4603", "name": "三沙市", "townList": [] }, { "code": "4604", "name": "儋州市", "townList": [] }, { "code": "4690", "name": "海南省", "townList": [ { "code": "469001", "name": "五指山市", "longitude": "109.523540321", "latitude": "18.7809941007" }, { "code": "469002", "name": "琼海市", "longitude": "110.480544526", "latitude": "19.2642540199" }, { "code": "469005", "name": "文昌市", "longitude": "110.804508706", "latitude": "19.5490620831" }, { "code": "469006", "name": "万宁市", "longitude": "110.399434366", "latitude": "18.8001069883" }, { "code": "469007", "name": "东方市", "longitude": "108.658566527", "latitude": "19.1011047313" }, { "code": "469021", "name": "定安县", "longitude": "110.365533483", "latitude": "19.6871199479" }, { "code": "469022", "name": "屯昌县", "longitude": "110.108577325", "latitude": "19.3573749243" }, { "code": "469023", "name": "澄迈县", "longitude": "110.01351091", "latitude": "19.7443486716" }, { "code": "469024", "name": "临高县", "longitude": "109.697443015", "latitude": "19.9194747703" }, { "code": "469025", "name": "白沙黎族自治县", "longitude": "109.457470669", "latitude": "19.231378733" }, { "code": "469026", "name": "昌江黎族自治县", "longitude": "109.062464087", "latitude": "19.3039978767" }, { "code": "469027", "name": "乐东黎族自治县", "longitude": "109.180507989", "latitude": "18.7558714939" }, { "code": "469028", "name": "陵水黎族自治县", "longitude": "110.044464093", "latitude": "18.5123315957" }, { "code": "469029", "name": "保亭黎族苗族自治县", "longitude": "109.703481514", "latitude": "18.6469099554" }, { "code": "469030", "name": "琼中黎族苗族自治县", "longitude": "109.844510628", "latitude": "19.0391637892" } ] } ] }, { "code": "50", "name": "重庆市", "cityList": [ { "code": "5001", "name": "重庆市", "townList": [ { "code": "500101", "name": "万州区", "longitude": "108.415558371", "latitude": "30.8136216367" }, { "code": "500102", "name": "涪陵区", "longitude": "107.396419798", "latitude": "29.709278198" }, { "code": "500103", "name": "渝中区", "longitude": "106.575440067", "latitude": "29.559090183" }, { "code": "500104", "name": "大渡口区", "longitude": "106.48853359", "latitude": "29.4901071286" }, { "code": "500105", "name": "江北区", "longitude": "106.580415062", "latitude": "29.6128323141" }, { "code": "500106", "name": "沙坪坝区", "longitude": "106.464465111", "latitude": "29.5471925165" }, { "code": "500107", "name": "九龙坡区", "longitude": "106.517558739", "latitude": "29.5079277156" }, { "code": "500108", "name": "南岸区", "longitude": "106.668429779", "latitude": "29.5026830988" }, { "code": "500109", "name": "北碚区", "longitude": "106.40228117", "latitude": "29.8111565129" }, { "code": "500110", "name": "綦江区", "longitude": "106.657484195", "latitude": "29.0341137483" }, { "code": "500111", "name": "大足区", "longitude": "105.728404625", "latitude": "29.7131135061" }, { "code": "500112", "name": "渝北区", "longitude": "106.637559061", "latitude": "29.723927343" }, { "code": "500113", "name": "巴南区", "longitude": "106.547454257", "latitude": "29.4084747398" }, { "code": "500114", "name": "黔江区", "longitude": "108.777591198", "latitude": "29.5388125677" }, { "code": "500115", "name": "长寿区", "longitude": "107.08753107", "latitude": "29.8635200673" }, { "code": "500116", "name": "江津区", "longitude": "106.265597608", "latitude": "29.2958843745" }, { "code": "500117", "name": "合川区", "longitude": "106.282541088", "latitude": "29.9781812395" }, { "code": "500118", "name": "永川区", "longitude": "105.933499361", "latitude": "29.3620463359" }, { "code": "500119", "name": "南川区", "longitude": "107.105585124", "latitude": "29.1634785996" }, { "code": "500120", "name": "璧山区", "longitude": "106.233474563", "latitude": "29.5983466073" }, { "code": "500151", "name": "铜梁区", "longitude": "106.063449494", "latitude": "29.8505087787" }, { "code": "500152", "name": "潼南区", "longitude": "105.847399036", "latitude": "30.1973142397" }, { "code": "500153", "name": "荣昌区", "longitude": "105.601419799", "latitude": "29.4113073967" }, { "code": "500154", "name": "开州区", "longitude": "108.399497656", "latitude": "31.1666441132" }, { "code": "500155", "name": "梁平区", "longitude": "107.776097258", "latitude": "30.660553255" }, { "code": "500156", "name": "武隆区", "longitude": "107.76642519", "latitude": "29.3320268707" }, { "code": "500229", "name": "城口县", "longitude": "108.671611643", "latitude": "31.9533907463" }, { "code": "500230", "name": "丰都县", "longitude": "107.737480618", "latitude": "29.8694127892" }, { "code": "500231", "name": "垫江县", "longitude": "107.339565875", "latitude": "30.3332939685" }, { "code": "500233", "name": "忠县", "longitude": "108.044537534", "latitude": "30.3052683894" }, { "code": "500235", "name": "云阳县", "longitude": "108.7034475", "latitude": "30.936611272" }, { "code": "500236", "name": "奉节县", "longitude": "109.470472756", "latitude": "31.0246017665" }, { "code": "500237", "name": "巫山县", "longitude": "109.885545507", "latitude": "31.0805188117" }, { "code": "500238", "name": "巫溪县", "longitude": "109.576402559", "latitude": "31.4048800099" }, { "code": "500240", "name": "石柱土家族自治县", "longitude": "108.120414166", "latitude": "30.0061086979" }, { "code": "500241", "name": "秀山土家族苗族自治县", "longitude": "109.0135739", "latitude": "28.4534478643" }, { "code": "500242", "name": "酉阳土家族苗族自治县", "longitude": "108.774586007", "latitude": "28.8470402587" }, { "code": "500243", "name": "彭水苗族土家族自治县", "longitude": "108.172578036", "latitude": "29.2994622904" } ] } ] }, { "code": "51", "name": "四川省", "cityList": [ { "code": "5101", "name": "成都市", "townList": [ { "code": "510104", "name": "锦江区", "longitude": "104.089561757", "latitude": "30.6619044903" }, { "code": "510105", "name": "青羊区", "longitude": "104.067445475", "latitude": "30.680037807" }, { "code": "510106", "name": "金牛区", "longitude": "104.057403587", "latitude": "30.6973560429" }, { "code": "510107", "name": "武侯区", "longitude": "104.049424478", "latitude": "30.6487126853" }, { "code": "510108", "name": "成华区", "longitude": "104.10859155", "latitude": "30.665589284" }, { "code": "510112", "name": "龙泉驿区", "longitude": "104.281396964", "latitude": "30.562697841" }, { "code": "510113", "name": "青白江区", "longitude": "104.257512458", "latitude": "30.8844213727" }, { "code": "510114", "name": "新都区", "longitude": "104.165392845", "latitude": "30.8294074682" }, { "code": "510115", "name": "温江区", "longitude": "103.863573063", "latitude": "30.6884868366" }, { "code": "510116", "name": "双流区", "longitude": "103.930391542", "latitude": "30.5803993528" }, { "code": "510117", "name": "郫都区", "longitude": "103.905445688", "latitude": "30.7995376536" }, { "code": "510118", "name": "新津区", "longitude": "103.817433038", "latitude": "30.4163639533" }, { "code": "510121", "name": "金堂县", "longitude": "104.418442633", "latitude": "30.8683584239" }, { "code": "510129", "name": "大邑县", "longitude": "103.527529818", "latitude": "30.5931554024" }, { "code": "510131", "name": "蒲江县", "longitude": "103.512571324", "latitude": "30.2025004281" }, { "code": "510181", "name": "都江堰市", "longitude": "103.653533604", "latitude": "30.9942568935" }, { "code": "510182", "name": "彭州市", "longitude": "103.965561371", "latitude": "30.9955640026" }, { "code": "510183", "name": "邛崃市", "longitude": "103.47048113", "latitude": "30.4163986009" }, { "code": "510184", "name": "崇州市", "longitude": "103.679433369", "latitude": "30.6365958914" }, { "code": "510185", "name": "简阳市", "longitude": "104.553494063", "latitude": "30.4174514914" } ] }, { "code": "5103", "name": "自贡市", "townList": [ { "code": "510302", "name": "自流井区", "longitude": "104.783447326", "latitude": "29.3434985623" }, { "code": "510303", "name": "贡井区", "longitude": "104.721556592", "latitude": "29.3514762695" }, { "code": "510304", "name": "大安区", "longitude": "104.780416353", "latitude": "29.3699285413" }, { "code": "510311", "name": "沿滩区", "longitude": "104.880409075", "latitude": "29.2787972053" }, { "code": "510321", "name": "荣县", "longitude": "104.423874674", "latitude": "29.450986724" }, { "code": "510322", "name": "富顺县", "longitude": "104.981494406", "latitude": "29.1868862578" } ] }, { "code": "5104", "name": "攀枝花市", "townList": [ { "code": "510402", "name": "东区", "longitude": "101.710596871", "latitude": "26.5521064776" }, { "code": "510403", "name": "西区", "longitude": "101.637413448", "latitude": "26.6038676268" }, { "code": "510411", "name": "仁和区", "longitude": "101.744449963", "latitude": "26.5040194933" }, { "code": "510421", "name": "米易县", "longitude": "102.117538429", "latitude": "26.9025174484" }, { "code": "510422", "name": "盐边县", "longitude": "101.860498548", "latitude": "26.688767482" } ] }, { "code": "5105", "name": "泸州市", "townList": [ { "code": "510502", "name": "江阳区", "longitude": "105.441573161", "latitude": "28.8844983438" }, { "code": "510503", "name": "纳溪区", "longitude": "105.378005021", "latitude": "28.7790014448" }, { "code": "510504", "name": "龙马潭区", "longitude": "105.444594162", "latitude": "28.9190839634" }, { "code": "510521", "name": "泸县", "longitude": "105.388309663", "latitude": "29.1578276127" }, { "code": "510522", "name": "合江县", "longitude": "105.837368275", "latitude": "28.8180064223" }, { "code": "510524", "name": "叙永县", "longitude": "105.451174969", "latitude": "28.1617859961" }, { "code": "510525", "name": "古蔺县", "longitude": "105.819142195", "latitude": "28.0447579619" } ] }, { "code": "5106", "name": "德阳市", "townList": [ { "code": "510603", "name": "旌阳区", "longitude": "104.423438828", "latitude": "31.1485962916" }, { "code": "510604", "name": "罗江区", "longitude": "104.517414161", "latitude": "31.3241786398" }, { "code": "510623", "name": "中江县", "longitude": "104.685530151", "latitude": "31.0389536953" }, { "code": "510681", "name": "广汉市", "longitude": "104.288421893", "latitude": "30.9824152397" }, { "code": "510682", "name": "什邡市", "longitude": "104.174427104", "latitude": "31.1328890482" }, { "code": "510683", "name": "绵竹市", "longitude": "104.227609305", "latitude": "31.3435922582" } ] }, { "code": "5107", "name": "绵阳市", "townList": [ { "code": "510703", "name": "涪城区", "longitude": "104.763420335", "latitude": "31.4613143886" }, { "code": "510704", "name": "游仙区", "longitude": "104.772428992", "latitude": "31.4799044741" }, { "code": "510705", "name": "安州区", "longitude": "104.573555021", "latitude": "31.5407505279" }, { "code": "510722", "name": "三台县", "longitude": "105.101489798", "latitude": "31.1015855712" }, { "code": "510723", "name": "盐亭县", "longitude": "105.395503215", "latitude": "31.2143187648" }, { "code": "510725", "name": "梓潼县", "longitude": "105.177566843", "latitude": "31.6483134677" }, { "code": "510726", "name": "北川羌族自治县", "longitude": "104.361585553", "latitude": "31.9630841034" }, { "code": "510727", "name": "平武县", "longitude": "104.535421503", "latitude": "32.4146819777" }, { "code": "510781", "name": "江油市", "longitude": "104.752411601", "latitude": "31.7841281934" } ] }, { "code": "5108", "name": "广元市", "townList": [ { "code": "510802", "name": "利州区", "longitude": "105.852426223", "latitude": "32.4402078127" }, { "code": "510811", "name": "昭化区", "longitude": "105.723692306", "latitude": "32.3377696131" }, { "code": "510812", "name": "朝天区", "longitude": "105.896588809", "latitude": "32.6497262403" }, { "code": "510821", "name": "旺苍县", "longitude": "106.296491245", "latitude": "32.2350973831" }, { "code": "510822", "name": "青川县", "longitude": "105.245407055", "latitude": "32.5816168573" }, { "code": "510823", "name": "剑阁县", "longitude": "105.531576019", "latitude": "32.2934785168" }, { "code": "510824", "name": "苍溪县", "longitude": "105.941482615", "latitude": "31.7386844006" } ] }, { "code": "5109", "name": "遂宁市", "townList": [ { "code": "510903", "name": "船山区", "longitude": "105.574522838", "latitude": "30.5314706078" }, { "code": "510904", "name": "安居区", "longitude": "105.46246731", "latitude": "30.3614964697" }, { "code": "510921", "name": "蓬溪县", "longitude": "105.713446054", "latitude": "30.7637514418" }, { "code": "510923", "name": "大英县", "longitude": "105.243403923", "latitude": "30.6008101299" }, { "code": "510981", "name": "射洪市", "longitude": "105.39450951", "latitude": "30.8771385223" } ] }, { "code": "5110", "name": "内江市", "townList": [ { "code": "511002", "name": "市中区", "longitude": "105.074574218", "latitude": "29.5927101487" }, { "code": "511011", "name": "东兴区", "longitude": "105.082547488", "latitude": "29.5984857286" }, { "code": "511024", "name": "威远县", "longitude": "104.674498229", "latitude": "29.5336349314" }, { "code": "511025", "name": "资中县", "longitude": "104.858494822", "latitude": "29.7702340326" }, { "code": "511083", "name": "隆昌市", "longitude": "105.294290942", "latitude": "29.3452383653" } ] }, { "code": "5111", "name": "乐山市", "townList": [ { "code": "511102", "name": "市中区", "longitude": "103.767558656", "latitude": "29.5613639416" }, { "code": "511111", "name": "沙湾区", "longitude": "103.556435661", "latitude": "29.4192724992" }, { "code": "511112", "name": "五通桥区", "longitude": "103.824455081", "latitude": "29.4131850144" }, { "code": "511113", "name": "金口河区", "longitude": "103.085097994", "latitude": "29.2508012854" }, { "code": "511123", "name": "犍为县", "longitude": "103.955506536", "latitude": "29.2142194638" }, { "code": "511124", "name": "井研县", "longitude": "104.076510714", "latitude": "29.6573030591" }, { "code": "511126", "name": "夹江县", "longitude": "103.5784101", "latitude": "29.743846303" }, { "code": "511129", "name": "沐川县", "longitude": "103.908467037", "latitude": "28.9628882782" }, { "code": "511132", "name": "峨边彝族自治县", "longitude": "103.268577253", "latitude": "29.2360891096" }, { "code": "511133", "name": "马边彝族自治县", "longitude": "103.552454191", "latitude": "28.8417360148" }, { "code": "511181", "name": "峨眉山市", "longitude": "103.491545574", "latitude": "29.6069755275" } ] }, { "code": "5113", "name": "南充市", "townList": [ { "code": "511302", "name": "顺庆区", "longitude": "106.098410658", "latitude": "30.8027530986" }, { "code": "511303", "name": "高坪区", "longitude": "106.125540473", "latitude": "30.7872549316" }, { "code": "511304", "name": "嘉陵区", "longitude": "106.078432973", "latitude": "30.7648955601" }, { "code": "511321", "name": "南部县", "longitude": "106.04357827", "latitude": "31.3537053015" }, { "code": "511322", "name": "营山县", "longitude": "106.572408029", "latitude": "31.0830029702" }, { "code": "511323", "name": "蓬安县", "longitude": "106.418481942", "latitude": "31.0346307783" }, { "code": "511324", "name": "仪陇县", "longitude": "106.309430168", "latitude": "31.27759736" }, { "code": "511325", "name": "西充县", "longitude": "105.907611377", "latitude": "31.0006880208" }, { "code": "511381", "name": "阆中市", "longitude": "106.011565266", "latitude": "31.5640745536" } ] }, { "code": "5114", "name": "眉山市", "townList": [ { "code": "511402", "name": "东坡区", "longitude": "103.838524802", "latitude": "30.0482721344" }, { "code": "511403", "name": "彭山区", "longitude": "103.87955823", "latitude": "30.1988544169" }, { "code": "511421", "name": "仁寿县", "longitude": "104.140476904", "latitude": "30.0016639843" }, { "code": "511423", "name": "洪雅县", "longitude": "103.379602245", "latitude": "29.9106158375" }, { "code": "511424", "name": "丹棱县", "longitude": "103.519583317", "latitude": "30.0203627949" }, { "code": "511425", "name": "青神县", "longitude": "103.853558832", "latitude": "29.8370547437" } ] }, { "code": "5115", "name": "宜宾市", "townList": [ { "code": "511502", "name": "翠屏区", "longitude": "104.626437986", "latitude": "28.772051773" }, { "code": "511503", "name": "南溪区", "longitude": "104.976513302", "latitude": "28.851503648" }, { "code": "511504", "name": "叙州区", "longitude": "104.539442756", "latitude": "28.6962463948" }, { "code": "511523", "name": "江安县", "longitude": "105.073594885", "latitude": "28.7296097219" }, { "code": "511524", "name": "长宁县", "longitude": "104.927564455", "latitude": "28.5881334527" }, { "code": "511525", "name": "高县", "longitude": "104.52441132", "latitude": "28.4425108041" }, { "code": "511526", "name": "珙县", "longitude": "104.715574595", "latitude": "28.4443197652" }, { "code": "511527", "name": "筠连县", "longitude": "104.517406424", "latitude": "28.1701744576" }, { "code": "511528", "name": "兴文县", "longitude": "105.242402301", "latitude": "28.3099048841" }, { "code": "511529", "name": "屏山县", "longitude": "104.352675339", "latitude": "28.8342749665" } ] }, { "code": "5116", "name": "广安市", "townList": [ { "code": "511602", "name": "广安区", "longitude": "106.648531156", "latitude": "30.4797681001" }, { "code": "511603", "name": "前锋区", "longitude": "106.904479596", "latitude": "30.5064351578" }, { "code": "511621", "name": "岳池县", "longitude": "106.44641062", "latitude": "30.5441198646" }, { "code": "511622", "name": "武胜县", "longitude": "106.302461743", "latitude": "30.3554956604" }, { "code": "511623", "name": "邻水县", "longitude": "106.936402589", "latitude": "30.3410725183" }, { "code": "511681", "name": "华蓥市", "longitude": "106.789461816", "latitude": "30.3963070843" } ] }, { "code": "5117", "name": "达州市", "townList": [ { "code": "511702", "name": "通川区", "longitude": "107.511447112", "latitude": "31.2209318041" }, { "code": "511703", "name": "达川区", "longitude": "107.518410597", "latitude": "31.2023933606" }, { "code": "511722", "name": "宣汉县", "longitude": "107.733533566", "latitude": "31.3597548237" }, { "code": "511723", "name": "开江县", "longitude": "107.875424874", "latitude": "31.0893721491" }, { "code": "511724", "name": "大竹县", "longitude": "107.211579707", "latitude": "30.7420766179" }, { "code": "511725", "name": "渠县", "longitude": "106.979582967", "latitude": "30.8422992835" }, { "code": "511781", "name": "万源市", "longitude": "108.041540697", "latitude": "32.0874208478" } ] }, { "code": "5118", "name": "雅安市", "townList": [ { "code": "511802", "name": "雨城区", "longitude": "103.039575205", "latitude": "30.0110616444" }, { "code": "511803", "name": "名山区", "longitude": "103.115485794", "latitude": "30.0759136634" }, { "code": "511822", "name": "荥经县", "longitude": "102.853435513", "latitude": "29.7991935127" }, { "code": "511823", "name": "汉源县", "longitude": "102.65857589", "latitude": "29.350217386" }, { "code": "511824", "name": "石棉县", "longitude": "102.366404538", "latitude": "29.2343048776" }, { "code": "511825", "name": "天全县", "longitude": "102.764530228", "latitude": "30.0724729533" }, { "code": "511826", "name": "芦山县", "longitude": "102.934527718", "latitude": "30.1498731896" }, { "code": "511827", "name": "宝兴县", "longitude": "102.821484234", "latitude": "30.3740821124" } ] }, { "code": "5119", "name": "巴中市", "townList": [ { "code": "511902", "name": "巴州区", "longitude": "106.775513108", "latitude": "31.8576856026" }, { "code": "511903", "name": "恩阳区", "longitude": "106.635581902", "latitude": "31.8026140442" }, { "code": "511921", "name": "通江县", "longitude": "107.251516843", "latitude": "31.9177143469" }, { "code": "511922", "name": "南江县", "longitude": "106.834483451", "latitude": "32.3525316542" }, { "code": "511923", "name": "平昌县", "longitude": "107.1105931", "latitude": "31.5661858101" } ] }, { "code": "5120", "name": "资阳市", "townList": [ { "code": "512002", "name": "雁江区", "longitude": "104.68307571", "latitude": "30.1133631388" }, { "code": "512021", "name": "安岳县", "longitude": "105.342454233", "latitude": "30.1033927345" }, { "code": "512022", "name": "乐至县", "longitude": "105.02747697", "latitude": "30.282348346" } ] }, { "code": "5132", "name": "阿坝藏族羌族自治州", "townList": [ { "code": "513201", "name": "马尔康市", "longitude": "102.224017467", "latitude": "31.9080835163" }, { "code": "513221", "name": "汶川县", "longitude": "103.596517884", "latitude": "31.4830053205" }, { "code": "513222", "name": "理县", "longitude": "103.173511389", "latitude": "31.4425504376" }, { "code": "513223", "name": "茂县", "longitude": "103.859589797", "latitude": "31.6868093971" }, { "code": "513224", "name": "松潘县", "longitude": "103.610579689", "latitude": "32.6617965599" }, { "code": "513225", "name": "九寨沟县", "longitude": "104.249546734", "latitude": "33.2575915095" }, { "code": "513226", "name": "金川县", "longitude": "102.070610421", "latitude": "31.4820059503" }, { "code": "513227", "name": "小金县", "longitude": "102.369426359", "latitude": "31.0022086971" }, { "code": "513228", "name": "黑水县", "longitude": "102.996517356", "latitude": "32.0678054494" }, { "code": "513230", "name": "壤塘县", "longitude": "100.985583487", "latitude": "32.2710933163" }, { "code": "513231", "name": "阿坝县", "longitude": "101.713609708", "latitude": "32.9082209186" }, { "code": "513232", "name": "若尔盖县", "longitude": "102.974390654", "latitude": "33.5843766547" }, { "code": "513233", "name": "红原县", "longitude": "102.550615209", "latitude": "32.7966052788" } ] }, { "code": "5133", "name": "甘孜藏族自治州", "townList": [ { "code": "513301", "name": "康定市", "longitude": "101.963555221", "latitude": "30.0044073843" }, { "code": "513322", "name": "泸定县", "longitude": "102.241432096", "latitude": "29.920401665" }, { "code": "513323", "name": "丹巴县", "longitude": "101.896437068", "latitude": "30.8847697993" }, { "code": "513324", "name": "九龙县", "longitude": "101.513415667", "latitude": "29.0064319029" }, { "code": "513325", "name": "雅江县", "longitude": "101.020500353", "latitude": "30.0375689679" }, { "code": "513326", "name": "道孚县", "longitude": "101.131540346", "latitude": "30.9853262774" }, { "code": "513327", "name": "炉霍县", "longitude": "100.682396934", "latitude": "31.3979918829" }, { "code": "513328", "name": "甘孜县", "longitude": "99.9992103509", "latitude": "31.628956694" }, { "code": "513329", "name": "新龙县", "longitude": "100.318398241", "latitude": "30.9454695253" }, { "code": "513330", "name": "德格县", "longitude": "98.5874016114", "latitude": "31.8121064947" }, { "code": "513331", "name": "白玉县", "longitude": "98.8311002182", "latitude": "31.2153144488" }, { "code": "513332", "name": "石渠县", "longitude": "98.1094806224", "latitude": "32.9840034205" }, { "code": "513333", "name": "色达县", "longitude": "100.339413649", "latitude": "32.2743304132" }, { "code": "513334", "name": "理塘县", "longitude": "100.27557458", "latitude": "30.0000306218" }, { "code": "513335", "name": "巴塘县", "longitude": "99.1167266958", "latitude": "30.0116617074" }, { "code": "513336", "name": "乡城县", "longitude": "99.8050595709", "latitude": "28.9367334752" }, { "code": "513337", "name": "稻城县", "longitude": "100.30446156", "latitude": "29.0431215581" }, { "code": "513338", "name": "得荣县", "longitude": "99.2929841982", "latitude": "28.7187800515" } ] }, { "code": "5134", "name": "凉山彝族自治州", "townList": [ { "code": "513401", "name": "西昌市", "longitude": "102.271483829", "latitude": "27.9005808963" }, { "code": "513422", "name": "木里藏族自治县", "longitude": "101.286396977", "latitude": "27.9345985592" }, { "code": "513423", "name": "盐源县", "longitude": "101.515429129", "latitude": "27.4281548677" }, { "code": "513424", "name": "德昌县", "longitude": "102.182595511", "latitude": "27.408504193" }, { "code": "513425", "name": "会理县", "longitude": "102.273502681", "latitude": "27.8877523004" }, { "code": "513426", "name": "会东县", "longitude": "102.584462182", "latitude": "26.6408237758" }, { "code": "513427", "name": "宁南县", "longitude": "102.758093409", "latitude": "27.0672560355" }, { "code": "513428", "name": "普格县", "longitude": "102.546596719", "latitude": "27.3819962138" }, { "code": "513429", "name": "布拖县", "longitude": "102.818478493", "latitude": "27.7121287338" }, { "code": "513430", "name": "金阳县", "longitude": "103.254548955", "latitude": "27.7021445117" }, { "code": "513431", "name": "昭觉县", "longitude": "102.849422782", "latitude": "28.020506268" }, { "code": "513432", "name": "喜德县", "longitude": "102.419567157", "latitude": "28.3127098325" }, { "code": "513433", "name": "冕宁县", "longitude": "102.183574574", "latitude": "28.5552944454" }, { "code": "513434", "name": "越西县", "longitude": "102.514474481", "latitude": "28.6458275643" }, { "code": "513435", "name": "甘洛县", "longitude": "102.778596513", "latitude": "28.9648231905" }, { "code": "513436", "name": "美姑县", "longitude": "103.138585799", "latitude": "28.3340196239" }, { "code": "513437", "name": "雷波县", "longitude": "103.578428695", "latitude": "28.2689506176" } ] } ] }, { "code": "52", "name": "贵州省", "cityList": [ { "code": "5201", "name": "贵阳市", "townList": [ { "code": "520102", "name": "南明区", "longitude": "106.720527635", "latitude": "26.5743361815" }, { "code": "520103", "name": "云岩区", "longitude": "106.730534759", "latitude": "26.6103810764" }, { "code": "520111", "name": "花溪区", "longitude": "106.676440777", "latitude": "26.4158794564" }, { "code": "520112", "name": "乌当区", "longitude": "106.757558034", "latitude": "26.6365291356" }, { "code": "520113", "name": "白云区", "longitude": "106.62959684", "latitude": "26.6835884991" }, { "code": "520115", "name": "观山湖区", "longitude": "106.604779084", "latitude": "26.6220712679" }, { "code": "520121", "name": "开阳县", "longitude": "106.971559559", "latitude": "27.063673574" }, { "code": "520122", "name": "息烽县", "longitude": "106.74756178", "latitude": "27.0964752671" }, { "code": "520123", "name": "修文县", "longitude": "106.598492203", "latitude": "26.8448624476" }, { "code": "520181", "name": "清镇市", "longitude": "106.47752261", "latitude": "26.5619878985" } ] }, { "code": "5202", "name": "六盘水市", "townList": [ { "code": "520201", "name": "钟山区", "longitude": "104.850529817", "latitude": "26.5807040796" }, { "code": "520203", "name": "六枝特区", "longitude": "105.483429347", "latitude": "26.2192142906" }, { "code": "520221", "name": "水城县", "longitude": "104.837554602", "latitude": "26.5988331083" }, { "code": "520281", "name": "盘州市", "longitude": "104.478581839", "latitude": "25.7156512581" } ] }, { "code": "5203", "name": "遵义市", "townList": [ { "code": "520302", "name": "红花岗区", "longitude": "106.900496587", "latitude": "27.6508702607" }, { "code": "520303", "name": "汇川区", "longitude": "106.940457528", "latitude": "27.7563433801" }, { "code": "520304", "name": "播州区", "longitude": "106.836503548", "latitude": "27.542500878" }, { "code": "520322", "name": "桐梓县", "longitude": "106.832489021", "latitude": "28.1394683842" }, { "code": "520323", "name": "绥阳县", "longitude": "107.197492288", "latitude": "27.9530800059" }, { "code": "520324", "name": "正安县", "longitude": "107.460574891", "latitude": "28.5590917288" }, { "code": "520325", "name": "道真仡佬族苗族自治县", "longitude": "107.619483788", "latitude": "28.8686498144" }, { "code": "520326", "name": "务川仡佬族苗族自治县", "longitude": "107.905456293", "latitude": "28.5690771106" }, { "code": "520327", "name": "凤冈县", "longitude": "107.72354763", "latitude": "27.960695339" }, { "code": "520328", "name": "湄潭县", "longitude": "107.47259853", "latitude": "27.754498365" }, { "code": "520329", "name": "余庆县", "longitude": "107.911460207", "latitude": "27.221379028" }, { "code": "520330", "name": "习水县", "longitude": "106.20342804", "latitude": "28.3391178865" }, { "code": "520381", "name": "赤水市", "longitude": "105.703488595", "latitude": "28.5961189087" }, { "code": "520382", "name": "仁怀市", "longitude": "106.407526555", "latitude": "27.7977521585" } ] }, { "code": "5204", "name": "安顺市", "townList": [ { "code": "520402", "name": "西秀区", "longitude": "105.972406321", "latitude": "26.2514976632" }, { "code": "520403", "name": "平坝区", "longitude": "106.263583787", "latitude": "26.4111864713" }, { "code": "520422", "name": "普定县", "longitude": "105.748485706", "latitude": "26.3082334513" }, { "code": "520423", "name": "镇宁布依族苗族自治县", "longitude": "105.776583445", "latitude": "26.063829083" }, { "code": "520424", "name": "关岭布依族苗族自治县", "longitude": "105.625475972", "latitude": "25.949877046" }, { "code": "520425", "name": "紫云苗族布依族自治县", "longitude": "106.090413751", "latitude": "25.757408729" } ] }, { "code": "5205", "name": "毕节市", "townList": [ { "code": "520502", "name": "七星关区", "longitude": "105.311580718", "latitude": "27.3040952234" }, { "code": "520521", "name": "大方县", "longitude": "105.618451312", "latitude": "27.1470607506" }, { "code": "520522", "name": "黔西县", "longitude": "105.298588795", "latitude": "27.2902150834" }, { "code": "520523", "name": "金沙县", "longitude": "106.226441639", "latitude": "27.4653548726" }, { "code": "520524", "name": "织金县", "longitude": "105.777589547", "latitude": "26.6692218857" }, { "code": "520525", "name": "纳雍县", "longitude": "105.389486623", "latitude": "26.7837172291" }, { "code": "520526", "name": "威宁彝族回族苗族自治县", "longitude": "104.259480634", "latitude": "26.8792471906" }, { "code": "520527", "name": "赫章县", "longitude": "104.710322922", "latitude": "27.1187760984" } ] }, { "code": "5206", "name": "铜仁市", "townList": [ { "code": "520602", "name": "碧江区", "longitude": "109.187435362", "latitude": "27.6967734718" }, { "code": "520603", "name": "万山区", "longitude": "109.160311566", "latitude": "27.6770511943" }, { "code": "520621", "name": "江口县", "longitude": "108.845400059", "latitude": "27.705921695" }, { "code": "520622", "name": "玉屏侗族自治县", "longitude": "108.912577501", "latitude": "27.2415231865" }, { "code": "520623", "name": "石阡县", "longitude": "108.230463855", "latitude": "27.5197220598" }, { "code": "520624", "name": "思南县", "longitude": "108.259417319", "latitude": "27.944547878" }, { "code": "520625", "name": "印江土家族苗族自治县", "longitude": "108.416591678", "latitude": "27.999823252" }, { "code": "520626", "name": "德江县", "longitude": "108.126411062", "latitude": "28.2704232785" }, { "code": "520627", "name": "沿河土家族自治县", "longitude": "108.51047754", "latitude": "28.5701016801" }, { "code": "520628", "name": "松桃苗族自治县", "longitude": "109.209403513", "latitude": "28.160420179" } ] }, { "code": "5223", "name": "黔西南布依族苗族自治州", "townList": [ { "code": "522301", "name": "兴义市", "longitude": "104.902460948", "latitude": "25.0981133103" }, { "code": "522302", "name": "兴仁市", "longitude": "105.192567725", "latitude": "25.4408987536" }, { "code": "522323", "name": "普安县", "longitude": "104.959545838", "latitude": "25.7899517691" }, { "code": "522324", "name": "晴隆县", "longitude": "105.225483615", "latitude": "25.8410479005" }, { "code": "522325", "name": "贞丰县", "longitude": "105.656559588", "latitude": "25.3921239653" }, { "code": "522326", "name": "望谟县", "longitude": "106.106444552", "latitude": "25.1843549239" }, { "code": "522327", "name": "册亨县", "longitude": "105.818510507", "latitude": "24.9896374943" }, { "code": "522328", "name": "安龙县", "longitude": "105.449542748", "latitude": "25.1039904312" } ] }, { "code": "5226", "name": "黔东南苗族侗族自治州", "townList": [ { "code": "522601", "name": "凯里市", "longitude": "107.987468891", "latitude": "26.5730794257" }, { "code": "522622", "name": "黄平县", "longitude": "107.923547806", "latitude": "26.9112886431" }, { "code": "522623", "name": "施秉县", "longitude": "108.130439782", "latitude": "27.0398220517" }, { "code": "522624", "name": "三穗县", "longitude": "108.681545002", "latitude": "26.9586664652" }, { "code": "522625", "name": "镇远县", "longitude": "108.436580773", "latitude": "27.0548209139" }, { "code": "522626", "name": "岑巩县", "longitude": "108.822480962", "latitude": "27.1799024174" }, { "code": "522627", "name": "天柱县", "longitude": "109.214445702", "latitude": "26.915804084" }, { "code": "522628", "name": "锦屏县", "longitude": "109.207438469", "latitude": "26.6826316319" }, { "code": "522629", "name": "剑河县", "longitude": "108.447517103", "latitude": "26.7340475589" }, { "code": "522630", "name": "台江县", "longitude": "108.32855163", "latitude": "26.6723725396" }, { "code": "522631", "name": "黎平县", "longitude": "109.143566971", "latitude": "26.2368740502" }, { "code": "522632", "name": "榕江县", "longitude": "108.527553699", "latitude": "25.9377253733" }, { "code": "522633", "name": "从江县", "longitude": "108.911561428", "latitude": "25.7598813279" }, { "code": "522634", "name": "雷山县", "longitude": "108.084528915", "latitude": "26.3842051217" }, { "code": "522635", "name": "麻江县", "longitude": "107.595551402", "latitude": "26.4968075956" }, { "code": "522636", "name": "丹寨县", "longitude": "107.79551349", "latitude": "26.2044211699" } ] }, { "code": "5227", "name": "黔南布依族苗族自治州", "townList": [ { "code": "522701", "name": "都匀市", "longitude": "107.525404431", "latitude": "26.2661179578" }, { "code": "522702", "name": "福泉市", "longitude": "107.526432812", "latitude": "26.6925257008" }, { "code": "522722", "name": "荔波县", "longitude": "107.893409387", "latitude": "25.4170975663" }, { "code": "522723", "name": "贵定县", "longitude": "107.240554359", "latitude": "26.590659655" }, { "code": "522725", "name": "瓮安县", "longitude": "107.477552236", "latitude": "27.0841256026" }, { "code": "522726", "name": "独山县", "longitude": "107.551497781", "latitude": "25.8282878071" }, { "code": "522727", "name": "平塘县", "longitude": "107.329566644", "latitude": "25.8282017069" }, { "code": "522728", "name": "罗甸县", "longitude": "106.758548057", "latitude": "25.430837683" }, { "code": "522729", "name": "长顺县", "longitude": "106.458421222", "latitude": "26.0284545457" }, { "code": "522730", "name": "龙里县", "longitude": "106.986585965", "latitude": "26.4590806306" }, { "code": "522731", "name": "惠水县", "longitude": "106.663452627", "latitude": "26.1382098894" }, { "code": "522732", "name": "三都水族自治县", "longitude": "107.876429257", "latitude": "25.9894794994" } ] } ] }, { "code": "53", "name": "云南省", "cityList": [ { "code": "5301", "name": "昆明市", "townList": [ { "code": "530102", "name": "五华区", "longitude": "102.713423281", "latitude": "25.049834962" }, { "code": "530103", "name": "盘龙区", "longitude": "102.758526212", "latitude": "25.1223722798" }, { "code": "530111", "name": "官渡区", "longitude": "102.750481707", "latitude": "25.0211964239" }, { "code": "530112", "name": "西山区", "longitude": "102.671557124", "latitude": "25.0431987609" }, { "code": "530113", "name": "东川区", "longitude": "103.194451867", "latitude": "26.0890542376" }, { "code": "530114", "name": "呈贡区", "longitude": "102.827472597", "latitude": "24.8918712109" }, { "code": "530115", "name": "晋宁区", "longitude": "102.602418052", "latitude": "24.6760988125" }, { "code": "530124", "name": "富民县", "longitude": "102.504473197", "latitude": "25.2280850922" }, { "code": "530125", "name": "宜良县", "longitude": "103.147557984", "latitude": "24.9252869897" }, { "code": "530126", "name": "石林彝族自治县", "longitude": "103.296508177", "latitude": "24.7777019613" }, { "code": "530127", "name": "嵩明县", "longitude": "103.04356394", "latitude": "25.3444094591" }, { "code": "530128", "name": "禄劝彝族苗族自治县", "longitude": "102.477423242", "latitude": "25.5576718002" }, { "code": "530129", "name": "寻甸回族彝族自治县", "longitude": "103.263573871", "latitude": "25.5638935804" }, { "code": "530181", "name": "安宁市", "longitude": "102.484409184", "latitude": "24.9256017263" } ] }, { "code": "5303", "name": "曲靖市", "townList": [ { "code": "530302", "name": "麒麟区", "longitude": "103.811430369", "latitude": "25.5021018284" }, { "code": "530303", "name": "沾益区", "longitude": "103.828485328", "latitude": "25.6066307989" }, { "code": "530304", "name": "马龙区", "longitude": "103.585446886", "latitude": "25.4339663748" }, { "code": "530322", "name": "陆良县", "longitude": "103.673432497", "latitude": "25.0356394704" }, { "code": "530323", "name": "师宗县", "longitude": "103.991556345", "latitude": "24.8279949695" }, { "code": "530324", "name": "罗平县", "longitude": "104.315510194", "latitude": "24.8905197249" }, { "code": "530325", "name": "富源县", "longitude": "104.261474243", "latitude": "25.6802795021" }, { "code": "530326", "name": "会泽县", "longitude": "103.303487292", "latitude": "26.4242150456" }, { "code": "530381", "name": "宣威市", "longitude": "104.111576069", "latitude": "26.2255983783" } ] }, { "code": "5304", "name": "玉溪市", "townList": [ { "code": "530402", "name": "红塔区", "longitude": "102.551564618", "latitude": "24.3598014437" }, { "code": "530403", "name": "江川区", "longitude": "102.760527008", "latitude": "24.293438701" }, { "code": "530423", "name": "通海县", "longitude": "102.732422891", "latitude": "24.1178912016" }, { "code": "530424", "name": "华宁县", "longitude": "102.935491859", "latitude": "24.1985810272" }, { "code": "530425", "name": "易门县", "longitude": "102.169535496", "latitude": "24.6774044776" }, { "code": "530426", "name": "峨山彝族自治县", "longitude": "102.412564506", "latitude": "24.1747742391" }, { "code": "530427", "name": "新平彝族傣族自治县", "longitude": "101.996427713", "latitude": "24.0762627053" }, { "code": "530428", "name": "元江哈尼族彝族傣族自治县", "longitude": "102.004414637", "latitude": "23.6030009055" }, { "code": "530481", "name": "澄江市", "longitude": "102.914554872", "latitude": "24.6794149088" } ] }, { "code": "5305", "name": "保山市", "townList": [ { "code": "530502", "name": "隆阳区", "longitude": "99.1720708393", "latitude": "25.1268883222" }, { "code": "530521", "name": "施甸县", "longitude": "99.1954693622", "latitude": "24.7288350001" }, { "code": "530523", "name": "龙陵县", "longitude": "98.6957499123", "latitude": "24.592546947" }, { "code": "530524", "name": "昌宁县", "longitude": "99.611616576", "latitude": "24.8339849199" }, { "code": "530581", "name": "腾冲市", "longitude": "98.4975950355", "latitude": "25.0266168603" } ] }, { "code": "5306", "name": "昭通市", "townList": [ { "code": "530602", "name": "昭阳区", "longitude": "103.713470423", "latitude": "27.3261442061" }, { "code": "530621", "name": "鲁甸县", "longitude": "103.564412165", "latitude": "27.1931072191" }, { "code": "530622", "name": "巧家县", "longitude": "102.93651934", "latitude": "26.9147050386" }, { "code": "530623", "name": "盐津县", "longitude": "104.241578842", "latitude": "28.1143840385" }, { "code": "530624", "name": "大关县", "longitude": "103.897514897", "latitude": "27.7540214019" }, { "code": "530625", "name": "永善县", "longitude": "103.644569043", "latitude": "28.2347224814" }, { "code": "530626", "name": "绥江县", "longitude": "103.964552383", "latitude": "28.6042779317" }, { "code": "530627", "name": "镇雄县", "longitude": "104.880404224", "latitude": "27.4477946346" }, { "code": "530628", "name": "彝良县", "longitude": "104.05444303", "latitude": "27.6316901655" }, { "code": "530629", "name": "威信县", "longitude": "105.055576763", "latitude": "27.852537464" }, { "code": "530681", "name": "水富市", "longitude": "104.422432984", "latitude": "28.6361069753" } ] }, { "code": "5307", "name": "丽江市", "townList": [ { "code": "530702", "name": "古城区", "longitude": "100.232480339", "latitude": "26.883161684" }, { "code": "530721", "name": "玉龙纳西族自治县", "longitude": "100.243527341", "latitude": "26.8273918036" }, { "code": "530722", "name": "永胜县", "longitude": "100.757581411", "latitude": "26.6899502454" }, { "code": "530723", "name": "华坪县", "longitude": "101.272430123", "latitude": "26.6352230146" }, { "code": "530724", "name": "宁蒗彝族自治县", "longitude": "100.858590386", "latitude": "27.2877278261" } ] }, { "code": "5308", "name": "普洱市", "townList": [ { "code": "530802", "name": "思茅区", "longitude": "100.983555103", "latitude": "22.7924979844" }, { "code": "530821", "name": "宁洱哈尼族彝族自治县", "longitude": "101.052442469", "latitude": "23.0545901795" }, { "code": "530822", "name": "墨江哈尼族自治县", "longitude": "101.698583562", "latitude": "23.4377257723" }, { "code": "530823", "name": "景东彝族自治县", "longitude": "100.838488645", "latitude": "24.4518637755" }, { "code": "530824", "name": "景谷傣族彝族自治县", "longitude": "100.70945658", "latitude": "23.5032040712" }, { "code": "530825", "name": "镇沅彝族哈尼族拉祜族自治县", "longitude": "101.115568823", "latitude": "24.0103308336" }, { "code": "530826", "name": "江城哈尼族彝族自治县", "longitude": "101.868479184", "latitude": "22.5916838594" }, { "code": "530827", "name": "孟连傣族拉祜族佤族自治县", "longitude": "99.5909628256", "latitude": "22.3353076156" }, { "code": "530828", "name": "澜沧拉祜族自治县", "longitude": "99.9385882832", "latitude": "22.5618319181" }, { "code": "530829", "name": "西盟佤族自治县", "longitude": "99.5966221503", "latitude": "22.650656011" } ] }, { "code": "5309", "name": "临沧市", "townList": [ { "code": "530902", "name": "临翔区", "longitude": "100.08844253", "latitude": "23.9014019386" }, { "code": "530921", "name": "凤庆县", "longitude": "99.9349892222", "latitude": "24.5864724583" }, { "code": "530922", "name": "云县", "longitude": "100.129531024", "latitude": "24.4428072753" }, { "code": "530923", "name": "永德县", "longitude": "99.2650756426", "latitude": "24.0248712828" }, { "code": "530924", "name": "镇康县", "longitude": "98.8318712241", "latitude": "23.7683154801" }, { "code": "530925", "name": "双江拉祜族佤族布朗族傣族自治县", "longitude": "99.834130983", "latitude": "23.4798365046" }, { "code": "530926", "name": "耿马傣族佤族自治县", "longitude": "99.4039421761", "latitude": "23.5434909951" }, { "code": "530927", "name": "沧源佤族自治县", "longitude": "99.2527216961", "latitude": "23.1528787339" } ] }, { "code": "5323", "name": "楚雄彝族自治州", "townList": [ { "code": "532301", "name": "楚雄市", "longitude": "101.552472284", "latitude": "25.0388603883" }, { "code": "532322", "name": "双柏县", "longitude": "101.648407001", "latitude": "24.6948985304" }, { "code": "532323", "name": "牟定县", "longitude": "101.553480991", "latitude": "25.3188459037" }, { "code": "532324", "name": "南华县", "longitude": "101.28042055", "latitude": "25.1985870712" }, { "code": "532325", "name": "姚安县", "longitude": "101.248527201", "latitude": "25.5097754435" }, { "code": "532326", "name": "大姚县", "longitude": "101.330567467", "latitude": "25.7276006006" }, { "code": "532327", "name": "永仁县", "longitude": "101.672817285", "latitude": "26.055544738" }, { "code": "532328", "name": "元谋县", "longitude": "101.880445242", "latitude": "25.7108953199" }, { "code": "532329", "name": "武定县", "longitude": "102.41053182", "latitude": "25.5360895878" }, { "code": "532331", "name": "禄丰县", "longitude": "101.534412481", "latitude": "25.0517735653" } ] }, { "code": "5325", "name": "红河哈尼族彝族自治州", "townList": [ { "code": "532501", "name": "个旧市", "longitude": "103.166518608", "latitude": "23.3649415346" }, { "code": "532502", "name": "开远市", "longitude": "103.273553237", "latitude": "23.7199077969" }, { "code": "532503", "name": "蒙自市", "longitude": "103.371545882", "latitude": "23.4020798852" }, { "code": "532504", "name": "弥勒市", "longitude": "103.421489063", "latitude": "24.4179822254" }, { "code": "532523", "name": "屏边苗族自治县", "longitude": "103.693431832", "latitude": "22.9899895855" }, { "code": "532524", "name": "建水县", "longitude": "102.833439592", "latitude": "23.6409385635" }, { "code": "532525", "name": "石屏县", "longitude": "102.50244662", "latitude": "23.7120044524" }, { "code": "532527", "name": "泸西县", "longitude": "103.772523141", "latitude": "24.5380371675" }, { "code": "532528", "name": "元阳县", "longitude": "102.841432804", "latitude": "23.2261980519" }, { "code": "532529", "name": "红河县", "longitude": "102.427550578", "latitude": "23.3744887384" }, { "code": "532530", "name": "金平苗族瑶族傣族自治县", "longitude": "103.232468606", "latitude": "22.7855606062" }, { "code": "532531", "name": "绿春县", "longitude": "102.398493988", "latitude": "23.0001649366" }, { "code": "532532", "name": "河口瑶族自治县", "longitude": "103.945443628", "latitude": "22.5354656029" } ] }, { "code": "5326", "name": "文山壮族苗族自治州", "townList": [ { "code": "532601", "name": "文山市", "longitude": "104.238543827", "latitude": "23.3919441319" }, { "code": "532622", "name": "砚山县", "longitude": "104.343550891", "latitude": "23.6114865767" }, { "code": "532623", "name": "西畴县", "longitude": "104.678525422", "latitude": "23.4432712753" }, { "code": "532624", "name": "麻栗坡县", "longitude": "104.709549481", "latitude": "23.1315855836" }, { "code": "532625", "name": "马关县", "longitude": "104.400414977", "latitude": "23.0189935772" }, { "code": "532626", "name": "丘北县", "longitude": "104.173441741", "latitude": "24.0569938962" }, { "code": "532627", "name": "广南县", "longitude": "105.061582385", "latitude": "24.0521985109" }, { "code": "532628", "name": "富宁县", "longitude": "105.637490179", "latitude": "23.6313804095" } ] }, { "code": "5328", "name": "西双版纳傣族自治州", "townList": [ { "code": "532801", "name": "景洪市", "longitude": "100.954313911", "latitude": "21.8557359455" }, { "code": "532822", "name": "勐海县", "longitude": "100.45357749", "latitude": "21.9582079476" }, { "code": "532823", "name": "勐腊县", "longitude": "101.571528308", "latitude": "21.4652808809" } ] }, { "code": "5329", "name": "大理白族自治州", "townList": [ { "code": "532901", "name": "大理市", "longitude": "100.308072389", "latitude": "25.684613546" }, { "code": "532922", "name": "漾濞彝族自治县", "longitude": "99.9644137582", "latitude": "25.676295763" }, { "code": "532923", "name": "祥云县", "longitude": "100.557446579", "latitude": "25.4898725062" }, { "code": "532924", "name": "宾川县", "longitude": "100.578456688", "latitude": "25.8352490282" }, { "code": "532925", "name": "弥渡县", "longitude": "100.497586015", "latitude": "25.3493360287" }, { "code": "532926", "name": "南涧彝族自治县", "longitude": "100.515548622", "latitude": "25.0494267621" }, { "code": "532927", "name": "巍山彝族回族自治县", "longitude": "100.313460335", "latitude": "25.2334387298" }, { "code": "532928", "name": "永平县", "longitude": "99.5474948999", "latitude": "25.4702064833" }, { "code": "532929", "name": "云龙县", "longitude": "99.3774160229", "latitude": "25.8919450739" }, { "code": "532930", "name": "洱源县", "longitude": "99.9692097215", "latitude": "26.1200933419" }, { "code": "532931", "name": "剑川县", "longitude": "99.9120912351", "latitude": "26.5425165342" }, { "code": "532932", "name": "鹤庆县", "longitude": "100.182492063", "latitude": "26.5661973133" } ] }, { "code": "5331", "name": "德宏傣族景颇族自治州", "townList": [ { "code": "533102", "name": "瑞丽市", "longitude": "97.8624855842", "latitude": "24.0228168931" }, { "code": "533103", "name": "芒市", "longitude": "98.5841816248", "latitude": "24.4371524605" }, { "code": "533122", "name": "梁河县", "longitude": "98.3031336316", "latitude": "24.8107844583" }, { "code": "533123", "name": "盈江县", "longitude": "97.9499348171", "latitude": "24.697454542" }, { "code": "533124", "name": "陇川县", "longitude": "97.797534862", "latitude": "24.1918288486" } ] }, { "code": "5333", "name": "怒江傈僳族自治州", "townList": [ { "code": "533301", "name": "泸水市", "longitude": "98.8645861633", "latitude": "25.82902677" }, { "code": "533323", "name": "福贡县", "longitude": "98.8756494245", "latitude": "26.9080552085" }, { "code": "533324", "name": "贡山独龙族怒族自治县", "longitude": "98.6723994487", "latitude": "27.7470678753" }, { "code": "533325", "name": "兰坪白族普米族自治县", "longitude": "99.42328467", "latitude": "26.4592079047" } ] }, { "code": "5334", "name": "迪庆藏族自治州", "townList": [ { "code": "533401", "name": "香格里拉市", "longitude": "99.7074445739", "latitude": "27.8357601253" }, { "code": "533422", "name": "德钦县", "longitude": "98.9244526561", "latitude": "28.4700860068" }, { "code": "533423", "name": "维西傈僳族自治县", "longitude": "99.2934656899", "latitude": "27.183170204" } ] } ] }, { "code": "54", "name": "西藏自治区", "cityList": [ { "code": "5401", "name": "拉萨市", "townList": [ { "code": "540102", "name": "城关区", "longitude": "91.1451003524", "latitude": "29.6583312529" }, { "code": "540103", "name": "堆龙德庆区", "longitude": "91.0099631342", "latitude": "29.651625675" }, { "code": "540104", "name": "达孜区", "longitude": "91.3563181184", "latitude": "29.6754090638" }, { "code": "540121", "name": "林周县", "longitude": "91.2695005739", "latitude": "29.8987332059" }, { "code": "540122", "name": "当雄县", "longitude": "91.1074517468", "latitude": "30.4792217269" }, { "code": "540123", "name": "尼木县", "longitude": "90.1711800662", "latitude": "29.4375189813" }, { "code": "540124", "name": "曲水县", "longitude": "90.7499586655", "latitude": "29.3589870583" }, { "code": "540127", "name": "墨竹工卡县", "longitude": "91.7372663986", "latitude": "29.8397526051" } ] }, { "code": "5402", "name": "日喀则市", "townList": [ { "code": "540202", "name": "桑珠孜区", "longitude": "88.9029517189", "latitude": "29.2555828142" }, { "code": "540221", "name": "南木林县", "longitude": "89.1057042131", "latitude": "29.6879380366" }, { "code": "540222", "name": "江孜县", "longitude": "89.612012195", "latitude": "28.9176346842" }, { "code": "540223", "name": "定日县", "longitude": "87.1295977393", "latitude": "28.6639519833" }, { "code": "540224", "name": "萨迦县", "longitude": "88.0282694882", "latitude": "28.9049315126" }, { "code": "540225", "name": "拉孜县", "longitude": "87.6436473181", "latitude": "29.08750968" }, { "code": "540226", "name": "昂仁县", "longitude": "87.2424273368", "latitude": "29.301060484" }, { "code": "540227", "name": "谢通门县", "longitude": "88.2682068", "latitude": "29.4381424141" }, { "code": "540228", "name": "白朗县", "longitude": "89.2687419919", "latitude": "29.1118589519" }, { "code": "540229", "name": "仁布县", "longitude": "89.8486249679", "latitude": "29.236788327" }, { "code": "540230", "name": "康马县", "longitude": "89.6882449158", "latitude": "28.5614439525" }, { "code": "540231", "name": "定结县", "longitude": "87.7723767434", "latitude": "28.3699107694" }, { "code": "540232", "name": "仲巴县", "longitude": "84.0381168769", "latitude": "29.775982232" }, { "code": "540233", "name": "亚东县", "longitude": "88.9134407831", "latitude": "27.4911087801" }, { "code": "540234", "name": "吉隆县", "longitude": "85.304073769", "latitude": "28.858501665" }, { "code": "540235", "name": "聂拉木县", "longitude": "85.988770403", "latitude": "28.1608393605" }, { "code": "540236", "name": "萨嘎县", "longitude": "85.2398257013", "latitude": "29.3346596888" }, { "code": "540237", "name": "岗巴县", "longitude": "88.5265292815", "latitude": "28.2803630423" } ] }, { "code": "5403", "name": "昌都市", "townList": [ { "code": "540302", "name": "卡若区", "longitude": "97.2131497676", "latitude": "31.0721392707" }, { "code": "540321", "name": "江达县", "longitude": "98.224594521", "latitude": "31.505207018" }, { "code": "540322", "name": "贡觉县", "longitude": "98.2773341273", "latitude": "30.8659669584" }, { "code": "540323", "name": "类乌齐县", "longitude": "96.6067171924", "latitude": "31.2177931123" }, { "code": "540324", "name": "丁青县", "longitude": "95.6026438442", "latitude": "31.4184029646" }, { "code": "540325", "name": "察雅县", "longitude": "97.5751236796", "latitude": "30.6598646994" }, { "code": "540326", "name": "八宿县", "longitude": "96.9243604462", "latitude": "30.0590289914" }, { "code": "540327", "name": "左贡县", "longitude": "97.847366833", "latitude": "29.6768485372" }, { "code": "540328", "name": "芒康县", "longitude": "98.5996854804", "latitude": "29.6857761177" }, { "code": "540329", "name": "洛隆县", "longitude": "95.8313066135", "latitude": "30.7471265075" }, { "code": "540330", "name": "边坝县", "longitude": "94.8544520121", "latitude": "30.8323265434" } ] }, { "code": "5404", "name": "林芝市", "townList": [ { "code": "540402", "name": "巴宜区", "longitude": "94.3675442767", "latitude": "29.6416445464" }, { "code": "540421", "name": "工布江达县", "longitude": "94.4905845536", "latitude": "29.5806817351" }, { "code": "540422", "name": "米林县", "longitude": "94.2199385781", "latitude": "29.2209165412" }, { "code": "540423", "name": "墨脱县", "longitude": "95.3394952975", "latitude": "29.3309377019" }, { "code": "540424", "name": "波密县", "longitude": "95.7739001216", "latitude": "29.8650600905" }, { "code": "540425", "name": "察隅县", "longitude": "97.4732697492", "latitude": "28.6674441372" }, { "code": "540426", "name": "朗县", "longitude": "93.0813682344", "latitude": "29.0519024191" } ] }, { "code": "5405", "name": "山南市", "townList": [ { "code": "540502", "name": "乃东区", "longitude": "91.7786819656", "latitude": "29.234229155" }, { "code": "540521", "name": "扎囊县", "longitude": "91.3436271276", "latitude": "29.2511643158" }, { "code": "540522", "name": "贡嘎县", "longitude": "90.9905823725", "latitude": "29.2955859203" }, { "code": "540523", "name": "桑日县", "longitude": "92.0240940004", "latitude": "29.2655752864" }, { "code": "540524", "name": "琼结县", "longitude": "91.690100778", "latitude": "29.0308655819" }, { "code": "540525", "name": "曲松县", "longitude": "92.210174663", "latitude": "29.0684248156" }, { "code": "540526", "name": "措美县", "longitude": "91.4399175732", "latitude": "28.4442579902" }, { "code": "540527", "name": "洛扎县", "longitude": "90.8664520019", "latitude": "28.3916346174" }, { "code": "540528", "name": "加查县", "longitude": "92.6004488815", "latitude": "29.1460874748" }, { "code": "540529", "name": "隆子县", "longitude": "92.468965521", "latitude": "28.4140189984" }, { "code": "540530", "name": "错那县", "longitude": "91.9637500583", "latitude": "27.9970042659" }, { "code": "540531", "name": "浪卡子县", "longitude": "90.4046468835", "latitude": "28.9739920178" } ] }, { "code": "5406", "name": "那曲市", "townList": [ { "code": "540602", "name": "色尼区", "longitude": "92.0598468367", "latitude": "31.4761172927" }, { "code": "540621", "name": "嘉黎县", "longitude": "93.238731515", "latitude": "30.6470624556" }, { "code": "540622", "name": "比如县", "longitude": "93.6859659386", "latitude": "31.4863572621" }, { "code": "540623", "name": "聂荣县", "longitude": "92.3086544663", "latitude": "32.1137074831" }, { "code": "540624", "name": "安多县", "longitude": "91.688890678", "latitude": "32.2712680231" }, { "code": "540625", "name": "申扎县", "longitude": "88.7164811082", "latitude": "30.9363932858" }, { "code": "540626", "name": "索县", "longitude": "93.7921729584", "latitude": "31.8924243092" }, { "code": "540627", "name": "班戈县", "longitude": "92.0581861393", "latitude": "31.4843793694" }, { "code": "540628", "name": "巴青县", "longitude": "94.0598815648", "latitude": "31.9245494243" }, { "code": "540629", "name": "尼玛县", "longitude": "87.2432924109", "latitude": "31.7909533266" }, { "code": "540630", "name": "双湖县", "longitude": "88.8434279361", "latitude": "33.1935031658" } ] }, { "code": "5425", "name": "阿里地区", "townList": [ { "code": "542521", "name": "普兰县", "longitude": "81.183094732", "latitude": "30.3001625911" }, { "code": "542522", "name": "札达县", "longitude": "79.8093232122", "latitude": "31.48534307" }, { "code": "542523", "name": "噶尔县", "longitude": "80.1028771461", "latitude": "32.4971568236" }, { "code": "542524", "name": "日土县", "longitude": "79.7391091383", "latitude": "33.3871860439" }, { "code": "542525", "name": "革吉县", "longitude": "81.1516643696", "latitude": "32.39335602" }, { "code": "542526", "name": "改则县", "longitude": "84.0691133625", "latitude": "32.3083566432" }, { "code": "542527", "name": "措勤县", "longitude": "85.1659522055", "latitude": "31.0226663793" } ] } ] }, { "code": "61", "name": "陕西省", "cityList": [ { "code": "6101", "name": "西安市", "townList": [ { "code": "610102", "name": "新城区", "longitude": "108.967391039", "latitude": "34.2727244695" }, { "code": "610103", "name": "碑林区", "longitude": "108.946974261", "latitude": "34.263047135" }, { "code": "610104", "name": "莲湖区", "longitude": "108.950426449", "latitude": "34.2710172031" }, { "code": "610111", "name": "灞桥区", "longitude": "109.071415356", "latitude": "34.279127675" }, { "code": "610112", "name": "未央区", "longitude": "108.953401188", "latitude": "34.2991481066" }, { "code": "610113", "name": "雁塔区", "longitude": "108.951440456", "latitude": "34.22063524" }, { "code": "610114", "name": "阎良区", "longitude": "109.232463118", "latitude": "34.6683632747" }, { "code": "610115", "name": "临潼区", "longitude": "109.220435796", "latitude": "34.3727474328" }, { "code": "610116", "name": "长安区", "longitude": "108.913580472", "latitude": "34.1632902673" }, { "code": "610117", "name": "高陵区", "longitude": "109.094386914", "latitude": "34.5410931061" }, { "code": "610118", "name": "鄠邑区", "longitude": "108.946465551", "latitude": "34.3472688166" }, { "code": "610122", "name": "蓝田县", "longitude": "109.329388127", "latitude": "34.1576206547" }, { "code": "610124", "name": "周至县", "longitude": "108.22842184", "latitude": "34.1693852696" } ] }, { "code": "6102", "name": "铜川市", "townList": [ { "code": "610202", "name": "王益区", "longitude": "109.081417359", "latitude": "35.0753220965" }, { "code": "610203", "name": "印台区", "longitude": "109.106434089", "latitude": "35.1208592829" }, { "code": "610204", "name": "耀州区", "longitude": "108.9864379", "latitude": "34.9159603091" }, { "code": "610222", "name": "宜君县", "longitude": "109.123536748", "latitude": "35.4045821942" } ] }, { "code": "6103", "name": "宝鸡市", "townList": [ { "code": "610302", "name": "渭滨区", "longitude": "107.156419168", "latitude": "34.3774811327" }, { "code": "610303", "name": "金台区", "longitude": "107.153423678", "latitude": "34.3823510847" }, { "code": "610304", "name": "陈仓区", "longitude": "107.375436921", "latitude": "34.3563068072" }, { "code": "610322", "name": "凤翔县", "longitude": "107.244575367", "latitude": "34.3689156429" }, { "code": "610323", "name": "岐山县", "longitude": "107.627447279", "latitude": "34.4497769624" }, { "code": "610324", "name": "扶风县", "longitude": "107.906453065", "latitude": "34.3814633512" }, { "code": "610326", "name": "眉县", "longitude": "107.756398136", "latitude": "34.2803758631" }, { "code": "610327", "name": "陇县", "longitude": "106.870583654", "latitude": "34.8987802531" }, { "code": "610328", "name": "千阳县", "longitude": "107.139466166", "latitude": "34.6485446008" }, { "code": "610329", "name": "麟游县", "longitude": "107.799514106", "latitude": "34.6837486672" }, { "code": "610330", "name": "凤县", "longitude": "106.522557822", "latitude": "33.9165830163" }, { "code": "610331", "name": "太白县", "longitude": "107.325529132", "latitude": "34.0642484412" } ] }, { "code": "6104", "name": "咸阳市", "townList": [ { "code": "610402", "name": "秦都区", "longitude": "108.712431992", "latitude": "34.3351451161" }, { "code": "610403", "name": "杨陵区", "longitude": "108.091515319", "latitude": "34.2780125077" }, { "code": "610404", "name": "渭城区", "longitude": "108.743450571", "latitude": "34.3681102294" }, { "code": "610422", "name": "三原县", "longitude": "108.9474465", "latitude": "34.6230789553" }, { "code": "610423", "name": "泾阳县", "longitude": "108.849378847", "latitude": "34.5333165328" }, { "code": "610424", "name": "乾县", "longitude": "108.245377626", "latitude": "34.5340182661" }, { "code": "610425", "name": "礼泉县", "longitude": "108.431615492", "latitude": "34.4873907685" }, { "code": "610426", "name": "永寿县", "longitude": "108.148468786", "latitude": "34.6980355356" }, { "code": "610428", "name": "长武县", "longitude": "107.80556078", "latitude": "35.2116573387" }, { "code": "610429", "name": "旬邑县", "longitude": "108.340467037", "latitude": "35.1179639197" }, { "code": "610430", "name": "淳化县", "longitude": "108.587441764", "latitude": "34.8047769113" }, { "code": "610431", "name": "武功县", "longitude": "108.206551065", "latitude": "34.2661376676" }, { "code": "610481", "name": "兴平市", "longitude": "108.496394009", "latitude": "34.3054765203" }, { "code": "610482", "name": "彬州市", "longitude": "108.084565578", "latitude": "35.0496105718" } ] }, { "code": "6105", "name": "渭南市", "townList": [ { "code": "610502", "name": "临渭区", "longitude": "109.498596276", "latitude": "34.5040004704" }, { "code": "610503", "name": "华州区", "longitude": "109.778477372", "latitude": "34.5187307401" }, { "code": "610522", "name": "潼关县", "longitude": "110.25250762", "latitude": "34.5503268485" }, { "code": "610523", "name": "大荔县", "longitude": "109.948453303", "latitude": "34.8018327605" }, { "code": "610524", "name": "合阳县", "longitude": "110.155396213", "latitude": "35.2438721969" }, { "code": "610525", "name": "澄城县", "longitude": "109.938433603", "latitude": "35.1965728156" }, { "code": "610526", "name": "蒲城县", "longitude": "109.592496511", "latitude": "34.9612741288" }, { "code": "610527", "name": "白水县", "longitude": "109.597520554", "latitude": "35.1832875146" }, { "code": "610528", "name": "富平县", "longitude": "109.186437447", "latitude": "34.7572604403" }, { "code": "610581", "name": "韩城市", "longitude": "110.44955264", "latitude": "35.4820867873" }, { "code": "610582", "name": "华阴市", "longitude": "110.098600757", "latitude": "34.5718001588" } ] }, { "code": "6106", "name": "延安市", "townList": [ { "code": "610602", "name": "宝塔区", "longitude": "109.495910972", "latitude": "36.5911150196" }, { "code": "610603", "name": "安塞区", "longitude": "109.33541944", "latitude": "36.8700982593" }, { "code": "610621", "name": "延长县", "longitude": "110.018471726", "latitude": "36.5853288017" }, { "code": "610622", "name": "延川县", "longitude": "110.200540287", "latitude": "36.884136961" }, { "code": "610625", "name": "志丹县", "longitude": "108.77557748", "latitude": "36.8280211359" }, { "code": "610626", "name": "吴起县", "longitude": "108.182589664", "latitude": "36.9325760995" }, { "code": "610627", "name": "甘泉县", "longitude": "109.357523505", "latitude": "36.2826886191" }, { "code": "610628", "name": "富县", "longitude": "109.386596534", "latitude": "35.993367978" }, { "code": "610629", "name": "洛川县", "longitude": "109.438403968", "latitude": "35.7683004294" }, { "code": "610630", "name": "宜川县", "longitude": "110.175413065", "latitude": "36.0563974379" }, { "code": "610631", "name": "黄龙县", "longitude": "109.846549077", "latitude": "35.5902337681" }, { "code": "610632", "name": "黄陵县", "longitude": "109.269605985", "latitude": "35.585076349" }, { "code": "610681", "name": "子长市", "longitude": "109.68138986", "latitude": "37.1488169184" } ] }, { "code": "6107", "name": "汉中市", "townList": [ { "code": "610702", "name": "汉台区", "longitude": "107.038401676", "latitude": "33.0741910931" }, { "code": "610703", "name": "南郑区", "longitude": "106.942433183", "latitude": "33.0056145997" }, { "code": "610722", "name": "城固县", "longitude": "107.34061258", "latitude": "33.1623993852" }, { "code": "610723", "name": "洋县", "longitude": "107.552464281", "latitude": "33.2288625893" }, { "code": "610724", "name": "西乡县", "longitude": "107.773392819", "latitude": "32.9893974419" }, { "code": "610725", "name": "勉县", "longitude": "106.679425949", "latitude": "33.159804747" }, { "code": "610726", "name": "宁强县", "longitude": "106.264588644", "latitude": "32.8353801992" }, { "code": "610727", "name": "略阳县", "longitude": "106.163544006", "latitude": "33.3331937777" }, { "code": "610728", "name": "镇巴县", "longitude": "107.901445641", "latitude": "32.5428333657" }, { "code": "610729", "name": "留坝县", "longitude": "106.927414414", "latitude": "33.6238252167" }, { "code": "610730", "name": "佛坪县", "longitude": "107.997424284", "latitude": "33.5306931016" } ] }, { "code": "6108", "name": "榆林市", "townList": [ { "code": "610802", "name": "榆阳区", "longitude": "109.72755917", "latitude": "38.2824196267" }, { "code": "610803", "name": "横山区", "longitude": "109.300491345", "latitude": "37.9685733942" }, { "code": "610822", "name": "府谷县", "longitude": "111.073628115", "latitude": "39.0337956298" }, { "code": "610824", "name": "靖边县", "longitude": "108.800600499", "latitude": "37.605063194" }, { "code": "610825", "name": "定边县", "longitude": "107.607569574", "latitude": "37.6004598653" }, { "code": "610826", "name": "绥德县", "longitude": "110.269426485", "latitude": "37.5089072889" }, { "code": "610827", "name": "米脂县", "longitude": "110.190451417", "latitude": "37.7613975143" }, { "code": "610828", "name": "佳县", "longitude": "110.497477419", "latitude": "38.0256116786" }, { "code": "610829", "name": "吴堡县", "longitude": "110.746455008", "latitude": "37.4582698741" }, { "code": "610830", "name": "清涧县", "longitude": "110.127559162", "latitude": "37.0948528878" }, { "code": "610831", "name": "子洲县", "longitude": "110.042398452", "latitude": "37.6170258875" }, { "code": "610881", "name": "神木市", "longitude": "110.506242994", "latitude": "38.8364395533" } ] }, { "code": "6109", "name": "安康市", "townList": [ { "code": "610902", "name": "汉滨区", "longitude": "109.033596065", "latitude": "32.7011961057" }, { "code": "610921", "name": "汉阴县", "longitude": "108.515506986", "latitude": "32.8991208573" }, { "code": "610922", "name": "石泉县", "longitude": "108.254426796", "latitude": "33.0446021103" }, { "code": "610923", "name": "宁陕县", "longitude": "108.320564", "latitude": "33.3165554865" }, { "code": "610924", "name": "紫阳县", "longitude": "108.541594317", "latitude": "32.5257856194" }, { "code": "610925", "name": "岚皋县", "longitude": "108.908615358", "latitude": "32.3128807765" }, { "code": "610926", "name": "平利县", "longitude": "109.368546701", "latitude": "32.3948041232" }, { "code": "610927", "name": "镇坪县", "longitude": "109.533496793", "latitude": "31.8896432958" }, { "code": "610928", "name": "旬阳县", "longitude": "109.035601083", "latitude": "32.6905127706" }, { "code": "610929", "name": "白河县", "longitude": "110.119586881", "latitude": "32.8148464853" } ] }, { "code": "6110", "name": "商洛市", "townList": [ { "code": "611002", "name": "商州区", "longitude": "109.947471635", "latitude": "33.8688552931" }, { "code": "611021", "name": "洛南县", "longitude": "110.15442748", "latitude": "34.0970705388" }, { "code": "611022", "name": "丹凤县", "longitude": "110.333560289", "latitude": "33.7015373229" }, { "code": "611023", "name": "商南县", "longitude": "110.888408478", "latitude": "33.5375334767" }, { "code": "611024", "name": "山阳县", "longitude": "109.888548632", "latitude": "33.5379683828" }, { "code": "611025", "name": "镇安县", "longitude": "109.159574609", "latitude": "33.4290446501" }, { "code": "611026", "name": "柞水县", "longitude": "109.120502272", "latitude": "33.6920262419" } ] } ] }, { "code": "62", "name": "甘肃省", "cityList": [ { "code": "6201", "name": "兰州市", "townList": [ { "code": "620102", "name": "城关区", "longitude": "103.831474901", "latitude": "36.0631814754" }, { "code": "620103", "name": "七里河区", "longitude": "103.792413882", "latitude": "36.0721292584" }, { "code": "620104", "name": "西固区", "longitude": "103.634580077", "latitude": "36.0941093658" }, { "code": "620105", "name": "安宁区", "longitude": "103.725535037", "latitude": "36.109753755" }, { "code": "620111", "name": "红古区", "longitude": "102.865427813", "latitude": "36.3518634232" }, { "code": "620121", "name": "永登县", "longitude": "103.266624438", "latitude": "36.7420952134" }, { "code": "620122", "name": "皋兰县", "longitude": "103.95346416", "latitude": "36.3381421487" }, { "code": "620123", "name": "榆中县", "longitude": "104.119565879", "latitude": "35.8488510482" } ] }, { "code": "6202", "name": "嘉峪关市", "townList": [] }, { "code": "6203", "name": "金昌市", "townList": [ { "code": "620302", "name": "金川区", "longitude": "102.200585886", "latitude": "38.5257722456" }, { "code": "620321", "name": "永昌县", "longitude": "101.979463583", "latitude": "38.2529409569" } ] }, { "code": "6204", "name": "白银市", "townList": [ { "code": "620402", "name": "白银区", "longitude": "104.155412761", "latitude": "36.5414635681" }, { "code": "620403", "name": "平川区", "longitude": "104.83161394", "latitude": "36.7334987519" }, { "code": "620421", "name": "靖远县", "longitude": "104.682515078", "latitude": "36.5770962888" }, { "code": "620422", "name": "会宁县", "longitude": "105.059606933", "latitude": "35.6985080531" }, { "code": "620423", "name": "景泰县", "longitude": "104.069444384", "latitude": "37.1874062601" } ] }, { "code": "6205", "name": "天水市", "townList": [ { "code": "620502", "name": "秦州区", "longitude": "105.730415494", "latitude": "34.5873157431" }, { "code": "620503", "name": "麦积区", "longitude": "105.895596989", "latitude": "34.5763368614" }, { "code": "620521", "name": "清水县", "longitude": "106.143595066", "latitude": "34.7538829064" }, { "code": "620522", "name": "秦安县", "longitude": "105.681574803", "latitude": "34.8648761116" }, { "code": "620523", "name": "甘谷县", "longitude": "105.342475343", "latitude": "34.7383001374" }, { "code": "620524", "name": "武山县", "longitude": "104.897428383", "latitude": "34.7276691016" }, { "code": "620525", "name": "张家川回族自治县", "longitude": "106.211390363", "latitude": "34.994905013" } ] }, { "code": "6206", "name": "武威市", "townList": [ { "code": "620602", "name": "凉州区", "longitude": "102.648574797", "latitude": "37.9341219484" }, { "code": "620621", "name": "民勤县", "longitude": "103.10040028", "latitude": "38.6306248264" }, { "code": "620622", "name": "古浪县", "longitude": "102.903629782", "latitude": "37.4758019066" }, { "code": "620623", "name": "天祝藏族自治县", "longitude": "103.14862132", "latitude": "36.9775961765" } ] }, { "code": "6207", "name": "张掖市", "townList": [ { "code": "620702", "name": "甘州区", "longitude": "100.484557721", "latitude": "38.9347814718" }, { "code": "620721", "name": "肃南裕固族自治县", "longitude": "99.621905418", "latitude": "38.843100205" }, { "code": "620722", "name": "民乐县", "longitude": "100.819429037", "latitude": "38.436842234" }, { "code": "620723", "name": "临泽县", "longitude": "100.170554761", "latitude": "39.1585144447" }, { "code": "620724", "name": "高台县", "longitude": "99.8257595043", "latitude": "39.3836460468" }, { "code": "620725", "name": "山丹县", "longitude": "101.095615582", "latitude": "38.7904526633" } ] }, { "code": "6208", "name": "平凉市", "townList": [ { "code": "620802", "name": "崆峒区", "longitude": "106.681414528", "latitude": "35.5488148922" }, { "code": "620821", "name": "泾川县", "longitude": "107.374518134", "latitude": "35.3386685978" }, { "code": "620822", "name": "灵台县", "longitude": "107.627461203", "latitude": "35.071581817" }, { "code": "620823", "name": "崇信县", "longitude": "107.041415132", "latitude": "35.3086158398" }, { "code": "620825", "name": "庄浪县", "longitude": "106.042585822", "latitude": "35.2081921258" }, { "code": "620826", "name": "静宁县", "longitude": "105.738415803", "latitude": "35.5282571891" }, { "code": "620881", "name": "华亭市", "longitude": "106.659485992", "latitude": "35.2235507629" } ] }, { "code": "6209", "name": "酒泉市", "townList": [ { "code": "620902", "name": "肃州区", "longitude": "98.514321853", "latitude": "39.75124551" }, { "code": "620921", "name": "金塔县", "longitude": "98.9083682362", "latitude": "39.9900292541" }, { "code": "620922", "name": "瓜州县", "longitude": "95.7887363645", "latitude": "40.526105979" }, { "code": "620923", "name": "肃北蒙古族自治县", "longitude": "94.8836923954", "latitude": "39.5183297384" }, { "code": "620924", "name": "阿克塞哈萨克族自治县", "longitude": "94.3467601904", "latitude": "39.6400453169" }, { "code": "620981", "name": "玉门市", "longitude": "97.0517116912", "latitude": "40.2976200209" }, { "code": "620982", "name": "敦煌市", "longitude": "94.6685270258", "latitude": "40.1478674842" } ] }, { "code": "6210", "name": "庆阳市", "townList": [ { "code": "621002", "name": "西峰区", "longitude": "107.657391125", "latitude": "35.736864476" }, { "code": "621021", "name": "庆城县", "longitude": "107.888406197", "latitude": "36.0217263606" }, { "code": "621022", "name": "环县", "longitude": "107.314469644", "latitude": "36.5744271089" }, { "code": "621023", "name": "华池县", "longitude": "107.996389526", "latitude": "36.4675751299" }, { "code": "621024", "name": "合水县", "longitude": "108.026447188", "latitude": "35.8252622164" }, { "code": "621025", "name": "正宁县", "longitude": "108.366374617", "latitude": "35.4982187809" }, { "code": "621026", "name": "宁县", "longitude": "107.934570926", "latitude": "35.5079329745" }, { "code": "621027", "name": "镇原县", "longitude": "107.20757587", "latitude": "35.6832305863" } ] }, { "code": "6211", "name": "定西市", "townList": [ { "code": "621102", "name": "安定区", "longitude": "104.616500403", "latitude": "35.5856000167" }, { "code": "621121", "name": "通渭县", "longitude": "105.248403622", "latitude": "35.2172168213" }, { "code": "621122", "name": "陇西县", "longitude": "104.641380591", "latitude": "35.0101971623" }, { "code": "621123", "name": "渭源县", "longitude": "104.221584011", "latitude": "35.142391958" }, { "code": "621124", "name": "临洮县", "longitude": "103.865601078", "latitude": "35.4005870403" }, { "code": "621125", "name": "漳县", "longitude": "104.478595326", "latitude": "34.8542499818" }, { "code": "621126", "name": "岷县", "longitude": "104.04339604", "latitude": "34.4444076407" } ] }, { "code": "6212", "name": "陇南市", "townList": [ { "code": "621202", "name": "武都区", "longitude": "104.932593361", "latitude": "33.3980721881" }, { "code": "621221", "name": "成县", "longitude": "105.748477903", "latitude": "33.7566351874" }, { "code": "621222", "name": "文县", "longitude": "104.689558422", "latitude": "32.9496012808" }, { "code": "621223", "name": "宕昌县", "longitude": "104.3993858", "latitude": "34.0534862914" }, { "code": "621224", "name": "康县", "longitude": "105.615391875", "latitude": "33.335376402" }, { "code": "621225", "name": "西和县", "longitude": "105.307610489", "latitude": "34.0167873584" }, { "code": "621226", "name": "礼县", "longitude": "105.183590969", "latitude": "34.1946850612" }, { "code": "621227", "name": "徽县", "longitude": "106.09441787", "latitude": "33.7751941871" }, { "code": "621228", "name": "两当县", "longitude": "106.311419466", "latitude": "33.9151228352" } ] }, { "code": "6229", "name": "临夏回族自治州", "townList": [ { "code": "622901", "name": "临夏市", "longitude": "103.249549178", "latitude": "35.6098987727" }, { "code": "622921", "name": "临夏县", "longitude": "103.249549178", "latitude": "35.6098987727" }, { "code": "622922", "name": "康乐县", "longitude": "103.715475542", "latitude": "35.3761097607" }, { "code": "622923", "name": "永靖县", "longitude": "103.292507495", "latitude": "35.9633303045" }, { "code": "622924", "name": "广河县", "longitude": "103.582409996", "latitude": "35.4941013617" }, { "code": "622925", "name": "和政县", "longitude": "103.357523703", "latitude": "35.4305899042" }, { "code": "622926", "name": "东乡族自治县", "longitude": "103.395613204", "latitude": "35.6693297286" }, { "code": "622927", "name": "积石山保安族东乡族撒拉族自治县", "longitude": "102.882518075", "latitude": "35.7234993236" } ] }, { "code": "6230", "name": "甘南藏族自治州", "townList": [ { "code": "623001", "name": "合作市", "longitude": "102.917571573", "latitude": "35.0059354282" }, { "code": "623021", "name": "临潭县", "longitude": "103.360533296", "latitude": "34.6986394115" }, { "code": "623022", "name": "卓尼县", "longitude": "103.513615784", "latitude": "34.5949164328" }, { "code": "623023", "name": "舟曲县", "longitude": "104.377489962", "latitude": "33.7908149736" }, { "code": "623024", "name": "迭部县", "longitude": "103.228440346", "latitude": "34.0620200541" }, { "code": "623025", "name": "玛曲县", "longitude": "102.07860004", "latitude": "34.0033581683" }, { "code": "623026", "name": "碌曲县", "longitude": "102.494424134", "latitude": "34.5970872716" }, { "code": "623027", "name": "夏河县", "longitude": "102.52857708", "latitude": "35.2083243255" } ] } ] }, { "code": "63", "name": "青海省", "cityList": [ { "code": "6301", "name": "西宁市", "townList": [ { "code": "630102", "name": "城东区", "longitude": "101.809569038", "latitude": "36.6057076457" }, { "code": "630103", "name": "城中区", "longitude": "101.79048355", "latitude": "36.6288005706" }, { "code": "630104", "name": "城西区", "longitude": "101.772414224", "latitude": "36.6344969795" }, { "code": "630105", "name": "城北区", "longitude": "101.772404882", "latitude": "36.6562936308" }, { "code": "630106", "name": "湟中区", "longitude": "101.578616758", "latitude": "36.5066275463" }, { "code": "630121", "name": "大通回族土族自治县", "longitude": "101.692563758", "latitude": "36.9326664634" }, { "code": "630123", "name": "湟源县", "longitude": "101.262448612", "latitude": "36.6885875149" } ] }, { "code": "6302", "name": "海东市", "townList": [ { "code": "630202", "name": "乐都区", "longitude": "102.409188326", "latitude": "36.4839116203" }, { "code": "630203", "name": "平安区", "longitude": "102.114427878", "latitude": "36.5065535732" }, { "code": "630222", "name": "民和回族土族自治县", "longitude": "102.836389638", "latitude": "36.3255614019" }, { "code": "630223", "name": "互助土族自治县", "longitude": "101.964569049", "latitude": "36.8500216138" }, { "code": "630224", "name": "化隆回族自治县", "longitude": "102.270448273", "latitude": "36.1009882509" }, { "code": "630225", "name": "循化撒拉族自治县", "longitude": "102.47520875", "latitude": "35.8595265686" } ] }, { "code": "6322", "name": "海北藏族自治州", "townList": [ { "code": "632221", "name": "门源回族自治县", "longitude": "101.628438039", "latitude": "37.3821806263" }, { "code": "632222", "name": "祁连县", "longitude": "100.259621572", "latitude": "38.1829248716" }, { "code": "632223", "name": "海晏县", "longitude": "101.000585549", "latitude": "36.9023760225" }, { "code": "632224", "name": "刚察县", "longitude": "100.153606071", "latitude": "37.3273200723" } ] }, { "code": "6323", "name": "黄南藏族自治州", "townList": [ { "code": "632301", "name": "同仁市", "longitude": "102.025437781", "latitude": "35.5218651505" }, { "code": "632322", "name": "尖扎县", "longitude": "102.046995856", "latitude": "35.949128587" }, { "code": "632323", "name": "泽库县", "longitude": "101.473594513", "latitude": "35.0420144951" }, { "code": "632324", "name": "河南蒙古族自治县", "longitude": "101.62247338", "latitude": "34.7403960711" } ] }, { "code": "6325", "name": "海南藏族自治州", "townList": [ { "code": "632521", "name": "共和县", "longitude": "100.62662348", "latitude": "36.2887033179" }, { "code": "632522", "name": "同德县", "longitude": "100.585423866", "latitude": "35.2598577758" }, { "code": "632523", "name": "贵德县", "longitude": "101.439533104", "latitude": "36.0461580808" }, { "code": "632524", "name": "兴海县", "longitude": "99.9943800723", "latitude": "35.5946298799" }, { "code": "632525", "name": "贵南县", "longitude": "100.753593215", "latitude": "35.5924154546" } ] }, { "code": "6326", "name": "果洛藏族自治州", "townList": [ { "code": "632621", "name": "玛沁县", "longitude": "100.245564349", "latitude": "34.483569486" }, { "code": "632622", "name": "班玛县", "longitude": "100.743604596", "latitude": "32.9385039275" }, { "code": "632623", "name": "甘德县", "longitude": "99.9075106956", "latitude": "33.9750036776" }, { "code": "632624", "name": "达日县", "longitude": "99.6580101131", "latitude": "33.754937374" }, { "code": "632625", "name": "久治县", "longitude": "101.488532256", "latitude": "33.4347734994" }, { "code": "632626", "name": "玛多县", "longitude": "98.2158838321", "latitude": "34.9207486462" } ] }, { "code": "6327", "name": "玉树藏族自治州", "townList": [ { "code": "632701", "name": "玉树市", "longitude": "97.0153764011", "latitude": "32.9995556509" }, { "code": "632722", "name": "杂多县", "longitude": "95.3069648788", "latitude": "32.8992406759" }, { "code": "632723", "name": "称多县", "longitude": "97.1150000093", "latitude": "33.3742256989" }, { "code": "632724", "name": "治多县", "longitude": "95.6197935744", "latitude": "33.8579532677" }, { "code": "632725", "name": "囊谦县", "longitude": "96.4869182713", "latitude": "32.2091943687" }, { "code": "632726", "name": "曲麻莱县", "longitude": "95.803750014", "latitude": "34.132298667" } ] }, { "code": "6328", "name": "海西蒙古族藏族自治州", "townList": [ { "code": "632801", "name": "格尔木市", "longitude": "94.9333102104", "latitude": "36.412371047" }, { "code": "632802", "name": "德令哈市", "longitude": "97.3674703", "latitude": "37.3753459075" }, { "code": "632803", "name": "茫崖市", "longitude": "90.4175664999", "latitude": "38.3568242514" }, { "code": "632821", "name": "乌兰县", "longitude": "98.4867356993", "latitude": "36.935747859" }, { "code": "632822", "name": "都兰县", "longitude": "98.1027047938", "latitude": "36.3076110287" }, { "code": "632823", "name": "天峻县", "longitude": "99.029242968", "latitude": "37.3069033951" } ] } ] }, { "code": "64", "name": "宁夏回族自治区", "cityList": [ { "code": "6401", "name": "银川市", "townList": [ { "code": "640104", "name": "兴庆区", "longitude": "106.295493767", "latitude": "38.4795789295" }, { "code": "640105", "name": "西夏区", "longitude": "106.15658124", "latitude": "38.4968174696" }, { "code": "640106", "name": "金凤区", "longitude": "106.246287376", "latitude": "38.480384721" }, { "code": "640121", "name": "永宁县", "longitude": "106.259604575", "latitude": "38.2830015415" }, { "code": "640122", "name": "贺兰县", "longitude": "106.356518265", "latitude": "38.5604066896" }, { "code": "640181", "name": "灵武市", "longitude": "106.346440355", "latitude": "38.1086586668" } ] }, { "code": "6402", "name": "石嘴山市", "townList": [ { "code": "640202", "name": "大武口区", "longitude": "106.374610498", "latitude": "39.0248477566" }, { "code": "640205", "name": "惠农区", "longitude": "106.788430022", "latitude": "39.2453881084" }, { "code": "640221", "name": "平罗县", "longitude": "106.536518478", "latitude": "38.9196068259" } ] }, { "code": "6403", "name": "吴忠市", "townList": [ { "code": "640302", "name": "利通区", "longitude": "106.219407021", "latitude": "37.9907460809" }, { "code": "640303", "name": "红寺堡区", "longitude": "106.072648604", "latitude": "37.424673158" }, { "code": "640323", "name": "盐池县", "longitude": "107.413379549", "latitude": "37.7892956499" }, { "code": "640324", "name": "同心县", "longitude": "105.920599078", "latitude": "36.9862696292" }, { "code": "640381", "name": "青铜峡市", "longitude": "106.085370317", "latitude": "38.027412224" } ] }, { "code": "6404", "name": "固原市", "townList": [ { "code": "640402", "name": "原州区", "longitude": "106.294514614", "latitude": "36.0093676758" }, { "code": "640422", "name": "西吉县", "longitude": "105.735385909", "latitude": "35.9700764209" }, { "code": "640423", "name": "隆德县", "longitude": "106.118498297", "latitude": "35.6317623151" }, { "code": "640424", "name": "泾源县", "longitude": "106.337393431", "latitude": "35.5043616377" }, { "code": "640425", "name": "彭阳县", "longitude": "106.638390275", "latitude": "35.8659338464" } ] }, { "code": "6405", "name": "中卫市", "townList": [ { "code": "640502", "name": "沙坡头区", "longitude": "105.180302902", "latitude": "37.522707205" }, { "code": "640521", "name": "中宁县", "longitude": "105.691537191", "latitude": "37.4974208056" }, { "code": "640522", "name": "海原县", "longitude": "105.650555146", "latitude": "36.5707814897" } ] } ] }, { "code": "65", "name": "新疆维吾尔自治区", "cityList": [ { "code": "6501", "name": "乌鲁木齐市", "townList": [ { "code": "650102", "name": "天山区", "longitude": "87.6384077776", "latitude": "43.8002713583" }, { "code": "650103", "name": "沙依巴克区", "longitude": "87.6046700277", "latitude": "43.8072623528" }, { "code": "650104", "name": "新市区", "longitude": "87.5759084412", "latitude": "43.8613940027" }, { "code": "650105", "name": "水磨沟区", "longitude": "87.6488966622", "latitude": "43.8382511638" }, { "code": "650106", "name": "头屯河区", "longitude": "87.4345067099", "latitude": "43.8826530226" }, { "code": "650107", "name": "达坂城区", "longitude": "88.3173976566", "latitude": "43.3699427463" }, { "code": "650109", "name": "米东区", "longitude": "87.6621342718", "latitude": "43.9792474264" }, { "code": "650121", "name": "乌鲁木齐县", "longitude": "87.4160287452", "latitude": "43.4770860658" } ] }, { "code": "6502", "name": "克拉玛依市", "townList": [ { "code": "650202", "name": "独山子区", "longitude": "84.8936132833", "latitude": "44.3344073924" }, { "code": "650203", "name": "克拉玛依区", "longitude": "84.8742945846", "latitude": "45.6084714679" }, { "code": "650204", "name": "白碱滩区", "longitude": "85.1395101237", "latitude": "45.6939516298" }, { "code": "650205", "name": "乌尔禾区", "longitude": "85.7003048264", "latitude": "46.0952951847" } ] }, { "code": "6504", "name": "吐鲁番市", "townList": [ { "code": "650402", "name": "高昌区", "longitude": "89.1924588827", "latitude": "42.9485486917" }, { "code": "650421", "name": "鄯善县", "longitude": "90.2200938861", "latitude": "42.8747592285" }, { "code": "650422", "name": "托克逊县", "longitude": "88.6601643595", "latitude": "42.798545831" } ] }, { "code": "6505", "name": "哈密市", "townList": [ { "code": "650502", "name": "伊州区", "longitude": "93.5213204624", "latitude": "42.8328249247" }, { "code": "650521", "name": "巴里坤哈萨克自治县", "longitude": "93.016803971", "latitude": "43.6061561015" }, { "code": "650522", "name": "伊吾县", "longitude": "94.7038256713", "latitude": "43.2606765275" } ] }, { "code": "6523", "name": "昌吉回族自治州", "townList": [ { "code": "652301", "name": "昌吉市", "longitude": "87.273864622", "latitude": "44.0201268459" }, { "code": "652302", "name": "阜康市", "longitude": "87.9936779051", "latitude": "44.1631373213" }, { "code": "652323", "name": "呼图壁县", "longitude": "86.9051438067", "latitude": "44.1976545961" }, { "code": "652324", "name": "玛纳斯县", "longitude": "86.2206434522", "latitude": "44.3100628588" }, { "code": "652325", "name": "奇台县", "longitude": "89.6010808117", "latitude": "44.026897819" }, { "code": "652327", "name": "吉木萨尔县", "longitude": "89.1871228581", "latitude": "44.0057177952" }, { "code": "652328", "name": "木垒哈萨克自治县", "longitude": "90.2925147373", "latitude": "43.8403083028" } ] }, { "code": "6527", "name": "博尔塔拉蒙古自治州", "townList": [ { "code": "652701", "name": "博乐市", "longitude": "82.0579722546", "latitude": "44.8600097846" }, { "code": "652702", "name": "阿拉山口市", "longitude": "82.5746468519", "latitude": "45.1984584855" }, { "code": "652722", "name": "精河县", "longitude": "82.9006553162", "latitude": "44.6066459435" }, { "code": "652723", "name": "温泉县", "longitude": "81.0311455465", "latitude": "44.9748566387" } ] }, { "code": "6528", "name": "巴音郭楞蒙古自治州", "townList": [ { "code": "652801", "name": "库尔勒市", "longitude": "86.1814943099", "latitude": "41.7323732214" }, { "code": "652822", "name": "轮台县", "longitude": "84.2582121521", "latitude": "41.7838130005" }, { "code": "652823", "name": "尉犁县", "longitude": "86.2660365364", "latitude": "41.3501227821" }, { "code": "652824", "name": "若羌县", "longitude": "88.1753244419", "latitude": "39.0289910372" }, { "code": "652825", "name": "且末县", "longitude": "85.5359903857", "latitude": "38.1513876941" }, { "code": "652826", "name": "焉耆回族自治县", "longitude": "86.5812220263", "latitude": "42.0648508587" }, { "code": "652827", "name": "和静县", "longitude": "86.3903982207", "latitude": "42.3293650359" }, { "code": "652828", "name": "和硕县", "longitude": "86.8836890373", "latitude": "42.2880650624" }, { "code": "652829", "name": "博湖县", "longitude": "86.63846915", "latitude": "41.9864303568" } ] }, { "code": "6529", "name": "阿克苏地区", "townList": [ { "code": "652901", "name": "阿克苏市", "longitude": "80.2699267573", "latitude": "41.173859927" }, { "code": "652902", "name": "库车市", "longitude": "82.9684587873", "latitude": "41.7234475148" }, { "code": "652922", "name": "温宿县", "longitude": "80.2455643526", "latitude": "41.2825672499" }, { "code": "652924", "name": "沙雅县", "longitude": "82.7888237361", "latitude": "41.227749329" }, { "code": "652925", "name": "新和县", "longitude": "82.6158230305", "latitude": "41.5539996285" }, { "code": "652926", "name": "拜城县", "longitude": "81.858516272", "latitude": "41.800706602" }, { "code": "652927", "name": "乌什县", "longitude": "79.2308689909", "latitude": "41.220871107" }, { "code": "652928", "name": "阿瓦提县", "longitude": "80.3818492459", "latitude": "40.6493588029" }, { "code": "652929", "name": "柯坪县", "longitude": "79.0532135356", "latitude": "40.514055521" } ] }, { "code": "6530", "name": "克孜勒苏柯尔克孜自治州", "townList": [ { "code": "653001", "name": "阿图什市", "longitude": "76.1793014582", "latitude": "39.719461672" }, { "code": "653022", "name": "阿克陶县", "longitude": "75.9537252667", "latitude": "39.1538885176" }, { "code": "653023", "name": "阿合奇县", "longitude": "78.5421647462", "latitude": "41.1456525751" }, { "code": "653024", "name": "乌恰县", "longitude": "75.2653336324", "latitude": "39.725123591" } ] }, { "code": "6531", "name": "喀什地区", "townList": [ { "code": "653101", "name": "喀什市", "longitude": "76.0003127379", "latitude": "39.4736495329" }, { "code": "653121", "name": "疏附县", "longitude": "75.8691686674", "latitude": "39.3812915552" }, { "code": "653122", "name": "疏勒县", "longitude": "76.0566143951", "latitude": "39.4067091087" }, { "code": "653123", "name": "英吉沙县", "longitude": "76.1820754257", "latitude": "38.9356708635" }, { "code": "653124", "name": "泽普县", "longitude": "77.2665594238", "latitude": "38.1907255163" }, { "code": "653125", "name": "莎车县", "longitude": "77.2524367137", "latitude": "38.4201567524" }, { "code": "653126", "name": "叶城县", "longitude": "77.4200976219", "latitude": "37.8891668444" }, { "code": "653127", "name": "麦盖提县", "longitude": "77.6160038604", "latitude": "38.9044962236" }, { "code": "653128", "name": "岳普湖县", "longitude": "76.7841477157", "latitude": "39.2393873339" }, { "code": "653129", "name": "伽师县", "longitude": "76.7303855683", "latitude": "39.4938516059" }, { "code": "653130", "name": "巴楚县", "longitude": "78.5544880605", "latitude": "39.8053345575" }, { "code": "653131", "name": "塔什库尔干塔吉克自治县", "longitude": "75.2390901759", "latitude": "37.7859046158" } ] }, { "code": "6532", "name": "和田地区", "townList": [ { "code": "653201", "name": "和田市", "longitude": "79.9202124698", "latitude": "37.1183355445" }, { "code": "653221", "name": "和田县", "longitude": "79.9202124698", "latitude": "37.1183355445" }, { "code": "653222", "name": "墨玉县", "longitude": "79.7354792654", "latitude": "37.2829934469" }, { "code": "653223", "name": "皮山县", "longitude": "78.2898710624", "latitude": "37.6272487144" }, { "code": "653224", "name": "洛浦县", "longitude": "80.1953876119", "latitude": "37.079611031" }, { "code": "653225", "name": "策勒县", "longitude": "80.8132012687", "latitude": "37.0041223594" }, { "code": "653226", "name": "于田县", "longitude": "81.6837829147", "latitude": "36.8629541361" }, { "code": "653227", "name": "民丰县", "longitude": "82.7027134276", "latitude": "37.0702569682" } ] }, { "code": "6540", "name": "伊犁哈萨克自治州", "townList": [ { "code": "654002", "name": "伊宁市", "longitude": "81.2842424053", "latitude": "43.9152994362" }, { "code": "654003", "name": "奎屯市", "longitude": "84.9094492417", "latitude": "44.43205721" }, { "code": "654004", "name": "霍尔果斯市", "longitude": "80.4271297724", "latitude": "44.2353085561" }, { "code": "654021", "name": "伊宁县", "longitude": "81.2842424053", "latitude": "43.9152994362" }, { "code": "654022", "name": "察布查尔锡伯自治县", "longitude": "81.167689062", "latitude": "43.8412255621" }, { "code": "654023", "name": "霍城县", "longitude": "80.8852811232", "latitude": "44.0622495074" }, { "code": "654024", "name": "巩留县", "longitude": "82.2382256094", "latitude": "43.4884855595" }, { "code": "654025", "name": "新源县", "longitude": "83.2670223015", "latitude": "43.4359270022" }, { "code": "654026", "name": "昭苏县", "longitude": "81.1373775391", "latitude": "43.1634967415" }, { "code": "654027", "name": "特克斯县", "longitude": "81.8425872492", "latitude": "43.2242482135" }, { "code": "654028", "name": "尼勒克县", "longitude": "82.5180075317", "latitude": "43.8045948362" } ] }, { "code": "6542", "name": "塔城地区", "townList": [ { "code": "654201", "name": "塔城市", "longitude": "82.9935571638", "latitude": "46.7573833651" }, { "code": "654202", "name": "乌苏市", "longitude": "84.720088147", "latitude": "44.4240480345" }, { "code": "654221", "name": "额敏县", "longitude": "83.6333744548", "latitude": "46.5318848613" }, { "code": "654223", "name": "沙湾县", "longitude": "103.556435661", "latitude": "29.4192724992" }, { "code": "654224", "name": "托里县", "longitude": "83.6129094383", "latitude": "45.942742805" }, { "code": "654225", "name": "裕民县", "longitude": "82.9894387025", "latitude": "46.2074535469" }, { "code": "654226", "name": "和布克赛尔蒙古自治县", "longitude": "85.7452787613", "latitude": "46.8042225308" } ] }, { "code": "6543", "name": "阿勒泰地区", "townList": [ { "code": "654301", "name": "阿勒泰市", "longitude": "88.139226564", "latitude": "47.8327526485" }, { "code": "654321", "name": "布尔津县", "longitude": "86.8813601703", "latitude": "47.7079517239" }, { "code": "654322", "name": "富蕴县", "longitude": "89.5319534081", "latitude": "46.9999510531" }, { "code": "654323", "name": "福海县", "longitude": "87.4931572463", "latitude": "47.1181407375" }, { "code": "654324", "name": "哈巴河县", "longitude": "86.4248176847", "latitude": "48.0661489025" }, { "code": "654325", "name": "青河县", "longitude": "90.3894444072", "latitude": "46.6801939671" }, { "code": "654326", "name": "吉木乃县", "longitude": "85.8808182407", "latitude": "47.4490184133" } ] }, { "code": "6590", "name": "自治区直辖县级行政单位", "townList": [ { "code": "659001", "name": "石河子市", "longitude": "87.5628045892", "latitude": "44.1712481034" }, { "code": "659002", "name": "阿拉尔市", "longitude": "87.5628045892", "latitude": "44.1712481034" }, { "code": "659003", "name": "图木舒克市", "longitude": "87.5628045892", "latitude": "44.1712481034" }, { "code": "659004", "name": "五家渠市", "longitude": "87.5628045892", "latitude": "44.1712481034" }, { "code": "659005", "name": "北屯市", "longitude": "87.5628045892", "latitude": "44.1712481034" }, { "code": "659006", "name": "铁门关市", "longitude": "87.5628045892", "latitude": "44.1712481034" }, { "code": "659007", "name": "双河市", "longitude": "82.37838193", "latitude": "44.8529588415" }, { "code": "659008", "name": "可克达拉市", "longitude": "87.5628045892", "latitude": "44.1712481034" }, { "code": "659009", "name": "昆玉市", "longitude": "87.5628045892", "latitude": "44.1712481034" }, { "code": "659010", "name": "胡杨河市", "longitude": "87.5628045892", "latitude": "44.1712481034" } ] } ] } ] ================================================ FILE: app/src/main/assets/bander.txt ================================================ {"data":[{"title":"全民反诈在行动","url":"https://fzapph5.gjfzpt.cn/AdDetail/?","openType":1,"imgPath":"https://oss.gjfzpt.cn/preventfraud-static/h5/files/banners/30e2560fcc82c933a72e9728dfccb1c0.jpg","sort":1,"isShow":1,"extraID":323720567456927745,"startTime":null,"endTime":null,"name":null,"description":null,"id":323717979617497089,"createTime":"2022-05-12 17:44:28","updateTime":"2022-05-12 17:44:28","nodeID":0},{"title":null,"url":null,"openType":0,"imgPath":"https://oss.gjfzpt.cn/preventfraud-static/h5/files/banners/306dd120fd9cb87af9a8fbcd6d0790c7.png","sort":3,"isShow":1,"extraID":null,"startTime":null,"endTime":null,"name":null,"description":null,"id":222537046026227713,"createTime":"2021-08-06 10:52:50","updateTime":"2021-08-06 10:52:50","nodeID":0}],"code":0,"msg":"成功"} ================================================ FILE: app/src/main/assets/casecategorys.txt ================================================ {"data":[{"code":1,"name":"出租出售手机卡"},{"code":2,"name":"出租出售银行卡含第三方支付账号"},{"code":3,"name":"收购两卡人员"},{"code":4,"name":"带队办卡人员"},{"code":0,"name":"其他"}],"code":0,"msg":"成功"} ================================================ FILE: app/src/main/assets/lottie_off.json ================================================ {"v":"5.7.10","fr":25,"ip":0,"op":60,"w":400,"h":360,"nm":"Calls warning-02","ddd":0,"assets":[{"id":"image_0","w":400,"h":400,"u":"images/","p":"img_0.png","e":0},{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"04","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":18,"s":[70]},{"t":56,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"t":56,"s":[150,150,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96.5,-79.188],[0.54,-106.878],[-95.5,-79.188],[-95.5,-21.148],[-1.99,107.052],[0.54,107.882],[4.63,106.502],[96.5,-21.118]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"03","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[60]},{"t":36,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"t":36,"s":[150,150,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96.5,-79.188],[0.54,-106.878],[-95.5,-79.188],[-95.5,-21.148],[-1.99,107.052],[0.54,107.882],[4.63,106.502],[96.5,-21.118]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"iPhone","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199,187,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.99,0.45],[-8.07,-9.62],[1.93,-4.72],[4.95,-3],[0.73,-0.46],[18.91,28.24],[-11.63,7.33],[0,0],[0,0],[-4.45,-0.76],[-3.21,-6.13],[8.69,-5.59],[0.22,-0.13],[-8.4,-12.52],[-2.33,1.47]],"o":[[0,0],[1.2,-0.73],[6.93,-3.22],[5,5.98],[-1.43,3.52],[-0.3,0.19],[-11.47,7.22],[-18.98,-28.31],[0,0],[0,0],[5.88,-3.88],[4.46,0.78],[6.76,12.95],[-0.63,0.41],[-2.12,1.35],[8.49,12.67],[0,0]],"v":[[1.31,22.06],[4.37,20.12],[7.53,18.39],[28.64,27.06],[33.18,43.03],[24.04,51.97],[20.17,54.31],[-36.5,16.76],[-48.75,-49.06],[-47.22,-50.06],[-45.56,-51.15],[-31.46,-55.81],[-20.01,-45.55],[-23.43,-20.87],[-26.49,-18.97],[-16.61,3.92],[1.3,22.06]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-2.41,-2.41],[1.89,-2.43],[0,0],[0,0],[0,0],[0,-3.41],[3.07,-0.35],[0,0],[0,0],[0,0],[1.89,-2.43],[0,0],[2.43,1.89],[0,0],[0,0],[0.35,0.8],[0,0],[0.08,0.44],[0,0],[0,0],[0,0],[-0.04,0.29],[0,0],[0,0],[-0.54,0.69],[0,0],[0,0]],"o":[[2.23,2.23],[0,0],[0,0],[0,0],[3.41,0],[0,3.17],[0,0],[0,0],[0,0],[2.23,2.23],[0,0],[-2.23,2.23],[0,0],[0,0],[-0.63,-0.57],[0,0],[-0.18,-0.4],[0,0],[0,0],[0,0],[0,-0.29],[0,0],[0,0],[0.2,-0.81],[0,0],[0,0],[2.41,-2.41]],"v":[[30.37,-49.19],[30.88,-41.03],[30.37,-40.45],[18.07,-28.16],[48.82,-28.16],[55,-21.98],[49.54,-15.84],[48.82,-15.8],[18.12,-15.8],[30.37,-3.55],[30.88,4.61],[30.37,5.19],[22.21,5.7],[21.63,5.19],[-0.97,-17.4],[-2.47,-19.47],[-2.5,-19.56],[-2.89,-20.82],[-2.98,-21.46],[-2.98,-21.46],[-3,-21.98],[-2.94,-22.85],[-2.81,-23.51],[-2.81,-23.51],[-1.7,-25.79],[-1.19,-26.37],[21.63,-49.19]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"iPhone","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"light","sr":1,"ks":{"o":{"a":0,"k":16,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,127,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-88,-10.91],[0.04,-36],[88,-10.91],[0.01,36]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"亮面","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"border-blue","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[52.55,-17.29],[0,54.72],[0,0]],"o":[[0,0],[0,0],[0,54.71],[-52.56,-17.29],[0,0],[0,0]],"v":[[0.04,-99],[88,-73.62],[88,-21.57],[0.01,99],[-88,-21.59],[-88,-73.62]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-47.67,-17.04],[0,0],[0,0],[-0.64,49.59],[0,0],[0,0]],"o":[[0,0],[0,0],[0,50.23],[0,0],[0,0],[47.17,-16.86],[0,0],[0,0],[0,0]],"v":[[0.04,-90.675],[-80,-67.605],[-80,-21.595],[-0.42,90.395],[0.01,90.545],[0.45,90.395],[79.99,-20.035],[80,-21.575],[80,-67.605]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.109803921569,0.219607843137,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"描边","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"main","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[52.55,-17.29],[0,0],[0,54.72]],"o":[[0,0],[0,0],[0,0],[0,54.71],[0,0],[-52.56,-17.29],[0,0]],"v":[[-88,-73.62],[0.04,-99],[88,-73.62],[88,-21.57],[0.01,99],[0.01,99],[-88,-21.59]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.176,0.29,0.922,0.5,0.422,0.504,0.961,1,0.667,0.718,1],"ix":9}},"s":{"a":0,"k":[82.367,0],"ix":5},"e":{"a":0,"k":[-81.43,0],"ix":6},"t":1,"nm":"Gradient","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"主体","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"mask","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,180,0],"ix":2,"l":2},"a":{"a":0,"k":[200,180,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[296,110.312],[200.04,82.622],[104,110.312],[104,168.352],[197.51,296.552],[200.04,297.382],[204.13,296.002],[296,168.382]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"w":400,"h":360,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":1,"nm":"Blue Solid 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[200,200,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"s","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[296,120.312],[200.04,92.622],[104,120.312],[104,178.352],[197.51,306.552],[200.04,307.382],[204.13,306.002],[296,178.382]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"sw":400,"sh":400,"sc":"#2d4aeb","ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":2,"nm":"img_1.png","cl":"png","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":60,"s":[360]}],"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[200,200,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"border-blue","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176470588235,0.290196078431,0.921568687289,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"border-white","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917647058824,0.929411764706,0.992156862745,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} ================================================ FILE: app/src/main/assets/lottie_on.json ================================================ {"v":"5.7.10","fr":25,"ip":0,"op":60,"w":400,"h":360,"nm":"calls protect","ddd":0,"assets":[{"id":"image_0","w":400,"h":400,"u":"images/","p":"img_0.png","e":0},{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"border-blue-n","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[52.55,-17.29],[0,54.72],[0,0]],"o":[[0,0],[0,0],[0,54.71],[-52.56,-17.29],[0,0],[0,0]],"v":[[0.04,-99],[88,-73.62],[88,-21.57],[0.01,99],[-88,-21.59],[-88,-73.62]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-47.67,-17.04],[0,0],[0,0],[-0.64,49.59],[0,0],[0,0]],"o":[[0,0],[0,0],[0,50.23],[0,0],[0,0],[47.17,-16.86],[0,0],[0,0],[0,0]],"v":[[0.04,-90.675],[-80,-67.605],[-80,-21.595],[-0.42,90.395],[0.01,90.545],[0.45,90.395],[79.99,-20.035],[80,-21.575],[80,-67.605]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.109803921569,0.219607843137,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"描边","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"iPhone 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199,187,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.99,0.45],[-8.07,-9.62],[1.93,-4.72],[4.95,-3],[0.73,-0.46],[18.91,28.24],[-11.63,7.33],[0,0],[0,0],[-4.45,-0.76],[-3.21,-6.13],[8.69,-5.59],[0.22,-0.13],[-8.4,-12.52],[-2.33,1.47]],"o":[[0,0],[1.2,-0.73],[6.93,-3.22],[5,5.98],[-1.43,3.52],[-0.3,0.19],[-11.47,7.22],[-18.98,-28.31],[0,0],[0,0],[5.88,-3.88],[4.46,0.78],[6.76,12.95],[-0.63,0.41],[-2.12,1.35],[8.49,12.67],[0,0]],"v":[[1.31,22.06],[4.37,20.12],[7.53,18.39],[28.64,27.06],[33.18,43.03],[24.04,51.97],[20.17,54.31],[-36.5,16.76],[-48.75,-49.06],[-47.22,-50.06],[-45.56,-51.15],[-31.46,-55.81],[-20.01,-45.55],[-23.43,-20.87],[-26.49,-18.97],[-16.61,3.92],[1.3,22.06]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-2.41,-2.41],[1.89,-2.43],[0,0],[0,0],[0,0],[0,-3.41],[3.07,-0.35],[0,0],[0,0],[0,0],[1.89,-2.43],[0,0],[2.43,1.89],[0,0],[0,0],[0.35,0.8],[0,0],[0.08,0.44],[0,0],[0,0],[0,0],[-0.04,0.29],[0,0],[0,0],[-0.54,0.69],[0,0],[0,0]],"o":[[2.23,2.23],[0,0],[0,0],[0,0],[3.41,0],[0,3.17],[0,0],[0,0],[0,0],[2.23,2.23],[0,0],[-2.23,2.23],[0,0],[0,0],[-0.63,-0.57],[0,0],[-0.18,-0.4],[0,0],[0,0],[0,0],[0,-0.29],[0,0],[0,0],[0.2,-0.81],[0,0],[0,0],[2.41,-2.41]],"v":[[30.37,-49.19],[30.88,-41.03],[30.37,-40.45],[18.07,-28.16],[48.82,-28.16],[55,-21.98],[49.54,-15.84],[48.82,-15.8],[18.12,-15.8],[30.37,-3.55],[30.88,4.61],[30.37,5.19],[22.21,5.7],[21.63,5.19],[-0.97,-17.4],[-2.47,-19.47],[-2.5,-19.56],[-2.89,-20.82],[-2.98,-21.46],[-2.98,-21.46],[-3,-21.98],[-2.94,-22.85],[-2.81,-23.51],[-2.81,-23.51],[-1.7,-25.79],[-1.19,-26.37],[21.63,-49.19]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"iPhone","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"light","sr":1,"ks":{"o":{"a":0,"k":16,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,127,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-88,-10.91],[0.04,-36],[88,-10.91],[0.01,36]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"亮面","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"main","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[52.55,-17.29],[0,0],[0,54.72]],"o":[[0,0],[0,0],[0,0],[0,54.71],[0,0],[-52.56,-17.29],[0,0]],"v":[[-88,-73.62],[0.04,-99],[88,-73.62],[88,-21.57],[0.01,99],[0.01,99],[-88,-21.59]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.176,0.29,0.922,0.5,0.422,0.504,0.961,1,0.667,0.718,1],"ix":9}},"s":{"a":0,"k":[82.367,0],"ix":5},"e":{"a":0,"k":[-81.43,0],"ix":6},"t":1,"nm":"Gradient","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"主体","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"border-white 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":90,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917647058824,0.929411764706,0.992156862745,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":2,"nm":"jdjb.png","cl":"png","tt":1,"refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[200,200,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"border-white 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":2,"nm":"jdjb.png","cl":"png","tt":1,"refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[200,200,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"border 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176470588235,0.290196078431,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"border","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"ball","sr":1,"ks":{"o":{"a":0,"k":60,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[291,258,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"椭圆形备份 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1500,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"round2","sr":1,"ks":{"o":{"a":0,"k":80,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[274,75,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10,10],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"椭圆形备份","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1500,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"mask-ball","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,180,0],"ix":2,"l":2},"a":{"a":0,"k":[200,180,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[305,68],[305,180],[95,180],[95,68]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"w":400,"h":360,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"round -ball","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[75]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[75]},{"t":60,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.562,"y":0.562},"o":{"x":0.167,"y":0.167},"t":0,"s":[200,231.5,0],"to":[90.57,0,0],"ti":[0,28.72,0]},{"i":{"x":0.656,"y":0.656},"o":{"x":0.311,"y":0.311},"t":14.943,"s":[364,180,0],"to":[0,-28.72,0],"ti":[90.57,0,0]},{"i":{"x":0.689,"y":0.689},"o":{"x":0.343,"y":0.343},"t":29.991,"s":[200.008,125,0],"to":[-90.57,0,0],"ti":[0,-28.72,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.437,"y":0.437},"t":45.041,"s":[36,180,0],"to":[0,28.72,0],"ti":[-90.57,0,0]},{"t":60,"s":[200,232,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[160,160,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[50,50,100]},{"t":60,"s":[160,160,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-6,-6],[-6,6],[6,6],[6,-6]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.057699502683,1,0.916920860141,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1500,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"ring-03","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,181,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[92.84,0],[0,-32.17],[-92.84,0],[0,32.17]],"o":[[-92.84,0],[0,32.17],[92.84,0],[0,-32.17]],"v":[[0,-53.5],[-166,-2.5],[0,53.5],[166,-2.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-90.57,0],[0,-28.72],[90.57,0],[0,28.72]],"o":[[90.57,0],[0,28.72],[-90.57,0],[0,-28.72]],"v":[[0,-52.5],[162,-2.5],[0,49.5],[-162,-2.5]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.176,0.29,0.922,0.5,0.588,0.645,0.961,1,1,1,1,0,0,0.5,0.5,1,1],"ix":9}},"s":{"a":0,"k":[0,-53.5],"ix":5},"e":{"a":0,"k":[0,66.836],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse Path 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1500,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"round","sr":1,"ks":{"o":{"a":0,"k":90,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[85,126,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[12,12],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"椭圆形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1500,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"border-blue-n","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[52.55,-17.29],[0,54.72],[0,0]],"o":[[0,0],[0,0],[0,54.71],[-52.56,-17.29],[0,0],[0,0]],"v":[[0.04,-99],[88,-73.62],[88,-21.57],[0.01,99],[-88,-21.59],[-88,-73.62]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-47.67,-17.04],[0,0],[0,0],[-0.64,49.59],[0,0],[0,0]],"o":[[0,0],[0,0],[0,50.23],[0,0],[0,0],[47.17,-16.86],[0,0],[0,0],[0,0]],"v":[[0.04,-90.675],[-80,-67.605],[-80,-21.595],[-0.42,90.395],[0.01,90.545],[0.45,90.395],[79.99,-20.035],[80,-21.575],[80,-67.605]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.109803921569,0.219607843137,0.823529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"描边","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"iPhone","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[199,187,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.99,0.45],[-8.07,-9.62],[1.93,-4.72],[4.95,-3],[0.73,-0.46],[18.91,28.24],[-11.63,7.33],[0,0],[0,0],[-4.45,-0.76],[-3.21,-6.13],[8.69,-5.59],[0.22,-0.13],[-8.4,-12.52],[-2.33,1.47]],"o":[[0,0],[1.2,-0.73],[6.93,-3.22],[5,5.98],[-1.43,3.52],[-0.3,0.19],[-11.47,7.22],[-18.98,-28.31],[0,0],[0,0],[5.88,-3.88],[4.46,0.78],[6.76,12.95],[-0.63,0.41],[-2.12,1.35],[8.49,12.67],[0,0]],"v":[[1.31,22.06],[4.37,20.12],[7.53,18.39],[28.64,27.06],[33.18,43.03],[24.04,51.97],[20.17,54.31],[-36.5,16.76],[-48.75,-49.06],[-47.22,-50.06],[-45.56,-51.15],[-31.46,-55.81],[-20.01,-45.55],[-23.43,-20.87],[-26.49,-18.97],[-16.61,3.92],[1.3,22.06]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-2.41,-2.41],[1.89,-2.43],[0,0],[0,0],[0,0],[0,-3.41],[3.07,-0.35],[0,0],[0,0],[0,0],[1.89,-2.43],[0,0],[2.43,1.89],[0,0],[0,0],[0.35,0.8],[0,0],[0.08,0.44],[0,0],[0,0],[0,0],[-0.04,0.29],[0,0],[0,0],[-0.54,0.69],[0,0],[0,0]],"o":[[2.23,2.23],[0,0],[0,0],[0,0],[3.41,0],[0,3.17],[0,0],[0,0],[0,0],[2.23,2.23],[0,0],[-2.23,2.23],[0,0],[0,0],[-0.63,-0.57],[0,0],[-0.18,-0.4],[0,0],[0,0],[0,0],[0,-0.29],[0,0],[0,0],[0.2,-0.81],[0,0],[0,0],[2.41,-2.41]],"v":[[30.37,-49.19],[30.88,-41.03],[30.37,-40.45],[18.07,-28.16],[48.82,-28.16],[55,-21.98],[49.54,-15.84],[48.82,-15.8],[18.12,-15.8],[30.37,-3.55],[30.88,4.61],[30.37,5.19],[22.21,5.7],[21.63,5.19],[-0.97,-17.4],[-2.47,-19.47],[-2.5,-19.56],[-2.89,-20.82],[-2.98,-21.46],[-2.98,-21.46],[-3,-21.98],[-2.94,-22.85],[-2.81,-23.51],[-2.81,-23.51],[-1.7,-25.79],[-1.19,-26.37],[21.63,-49.19]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"iPhone","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"light","sr":1,"ks":{"o":{"a":0,"k":16,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,127,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-88,-10.91],[0.04,-36],[88,-10.91],[0.01,36]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"亮面","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"main","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[52.55,-17.29],[0,0],[0,54.72]],"o":[[0,0],[0,0],[0,0],[0,54.71],[0,0],[-52.56,-17.29],[0,0]],"v":[[-88,-73.62],[0.04,-99],[88,-73.62],[88,-21.57],[0.01,99],[0.01,99],[-88,-21.59]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.176,0.29,0.922,0.5,0.422,0.504,0.961,1,0.667,0.718,1],"ix":9}},"s":{"a":0,"k":[82.367,0],"ix":5},"e":{"a":0,"k":[-81.43,0],"ix":6},"t":1,"nm":"Gradient","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"主体","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"border-white 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":90,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917647058824,0.929411764706,0.992156862745,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":2,"nm":"jdjb.png","cl":"png","tt":1,"refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[200,200,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"border-white 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":2,"nm":"jdjb.png","cl":"png","tt":1,"refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[200,190,0],"ix":2,"l":2},"a":{"a":0,"k":[200,200,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"border-btm 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.176470588235,0.290196078431,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"border-btm","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,189.998,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-55.83,-18.37],[0,0],[0,0],[0,57.55]],"o":[[0,0],[0,0],[0,0],[0,58.19],[0,0],[0,0],[54.99,-18.87],[0,0]],"v":[[96,-79.688],[0.04,-107.378],[-96,-79.688],[-96,-21.648],[-2.49,106.552],[0.04,107.382],[4.13,106.002],[96,-21.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.917647058824,0.929411764706,0.992156862745,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"底部","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":120,"st":0,"bm":0}],"markers":[]} ================================================ FILE: app/src/main/assets/noticelist.txt ================================================ {"data":[{"id":"224794800006762497","title":"系统服务升级维护通知","content":"
尊敬的用户:
为了给您提供更优质的体验,国家反诈中心计划于2021年08月14日(周六)00:00至06:00对系统进行升级维护,期间国家反诈中心APP将无法登录使用。
由此给您带来的不便,我们深表歉意,敬请谅解。
特此通告。
国家反诈中心
","vaildStartTime":"2021-08-12 15:30:00","vaildEndTime":"2021-08-13 23:59:59","isRead":true,"url":"#/announcements?noticeID=224794800006762497"}],"code":0,"msg":""} ================================================ FILE: app/src/main/assets/paymenttypes.txt ================================================ {"data":[{"text":"微信支付"},{"text":"支付宝"},{"text":"腾讯支付"},{"text":"云闪付"},{"text":"银行卡"}],"code":0,"msg":"成功"} ================================================ FILE: app/src/main/assets/positions.txt ================================================ {"data":[{"positionId":1,"positionName":"农、林、牧、渔业"},{"positionId":2,"positionName":"金融、保险、投资"},{"positionId":3,"positionName":"房地产业"},{"positionId":4,"positionName":"信息传输、软件和信息技术服务业"},{"positionId":5,"positionName":"教育、学生"},{"positionId":6,"positionName":"文化、体育和娱乐业"},{"positionId":7,"positionName":"批发和零售业"},{"positionId":8,"positionName":"建筑业"},{"positionId":9,"positionName":"住宿和餐饮业"},{"positionId":10,"positionName":"制造业"},{"positionId":11,"positionName":"交通运输、仓储和邮政业"},{"positionId":12,"positionName":"科学研究和技术服务业"},{"positionId":13,"positionName":"租赁和商务服务业"},{"positionId":14,"positionName":"卫生和社会工作"},{"positionId":15,"positionName":"居民服务、修理和其他服务业"},{"positionId":16,"positionName":"水利、环境和公共设施管理业"},{"positionId":17,"positionName":"电力、热力、燃气及水生产和供应业"},{"positionId":18,"positionName":"采矿业"},{"positionId":19,"positionName":"公共管理、社会保障和社会组织"},{"positionId":21,"positionName":"旅游、购物、休闲"},{"positionId":22,"positionName":"机械设备、通用零部件"},{"positionId":23,"positionName":"家具、生活用品、食品"},{"positionId":24,"positionName":"工艺品、礼品"},{"positionId":25,"positionName":"新闻、出版、科研"},{"positionId":26,"positionName":"广告、会展、商务办公、咨询"},{"positionId":27,"positionName":"贸易、市场"},{"positionId":28,"positionName":"党政机关、社会团体"},{"positionId":29,"positionName":"离退休人员"},{"positionId":20,"positionName":"国际组织"},{"positionId":30,"positionName":"其他行业"}],"code":0,"msg":"请求成功"} ================================================ FILE: app/src/main/assets/qalist.txt ================================================ {"data":[{"qaList":[{"id":"162818727157567489","qaClassifyCode":1,"question":"实名认证时提示身份信息不存在","answer":"您可以在人脸识别提示身份信息不存在时,点击人工审核,上传手持身份证正反面照片,审核通过后,即可完成实名认证。","isShow":1,"sort":1,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0},{"id":"162818727161761792","qaClassifyCode":1,"question":"如何更换绑定手机号","answer":"您可以点击我的-设置-账号与安全-修改手机号,来更换绑定手机号。","isShow":1,"sort":2,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0},{"id":"162818727165956096","qaClassifyCode":1,"question":"如何修改密码","answer":"您可以点击我的-设置-账号与安全-修改密码,来修改或找回您的密码。","isShow":1,"sort":3,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0},{"id":"162818727170150400","qaClassifyCode":1,"question":"如何修改个人信息","answer":"您可以点击我的-点击查看个人信息,来修改个人信息。","isShow":1,"sort":4,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0}],"code":1,"text":"账号/登录","isShow":1,"sort":1,"description":null,"id":162817625368432641,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0},{"qaList":[{"id":"162818727174344704","qaClassifyCode":2,"question":"举报非法可疑信息对我有什么帮助","answer":"您的有效举报,可让上亿用户受益,同时他人的举报也可让您避免上当受骗。","isShow":1,"sort":1,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0},{"id":"162818727178539008","qaClassifyCode":2,"question":"如何删除已发布的信息","answer":"暂不支持删除已举报的信息,国家反诈中心将严格保护举报人的权益,不泄露举报人的任何个人信息。举报人应当实事求是,保证所举报内容与事实一致。","isShow":1,"sort":2,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0},{"id":"162818727186927616","qaClassifyCode":2,"question":"是否可修改举报信息","answer":"暂不支持修改举报内容,请您提交时,确保所填信息正确。如填写错误,请重新提交举报内容。","isShow":1,"sort":4,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0}],"code":2,"text":"我要举报","isShow":1,"sort":2,"description":null,"id":162817814489600001,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0},{"qaList":[{"id":"162818727191121920","qaClassifyCode":3,"question":"身份证X无法输入","answer":"身份证X输入是支持的,请切换为英文输入法输入X,大小写均支持。","isShow":1,"sort":1,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0},{"id":"173374256003026945","qaClassifyCode":3,"question":"人工审核通过后未立即生效","answer":"警员审批人工审核同意后,用户(提交方)需退出重新登录APP,人工审核即可生效。(我的-设置-退出登录)","isShow":1,"sort":2,"description":null,"createTime":"2021-03-23 18:36:31","updateTime":"2021-03-23 18:36:31","nodeID":0},{"id":"162818727195316224","qaClassifyCode":3,"question":"上传文件一直显示失败","answer":"建议您更换WIFI网络、使用4G网络试试。如不行请退出进程重新进入APP。如还是不能上传,请在意见反馈中及时与我们联系。","isShow":1,"sort":3,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0},{"id":"162818727199510528","qaClassifyCode":3,"question":" 录音录到一半自己就停了","answer":"建议您录制时确保手机内存充足,如还是无法正常录制,请在意见反馈中及时与我们联系。","isShow":1,"sort":4,"description":null,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0}],"code":3,"text":"功能使用","isShow":1,"sort":3,"description":null,"id":162817834714533889,"createTime":"2021-02-27 16:09:39","updateTime":"2021-02-27 16:09:39","nodeID":0}],"code":0,"msg":"成功"} ================================================ FILE: app/src/main/assets/socialaccounttypes.txt ================================================ {"data":[{"text":"微信"},{"text":"QQ"},{"text":"陌陌"},{"text":"探探"},{"text":"世纪佳缘"},{"text":"百合网"},{"text":"Soul"},{"text":"Blue"},{"text":"微信公众号"},{"text":"微博号"},{"text":"抖音服务号"},{"text":"快手服务号"},{"text":"钉钉号"},{"text":"YY号"},{"text":"米聊"},{"text":"易信"},{"text":"比邻"}],"code":0,"msg":"成功"} ================================================ FILE: app/src/main/assets/xccasecategorys.txt ================================================ {"data":[{"id":248014190760038401,"name":"冒充电商物流客服类","sort":1,"children":[{"id":248014190810370048,"name":"冒充电商客服","sort":1,"children":null},{"id":248014190814564352,"name":"冒充物流客服","sort":2,"children":null},{"id":248014190818758656,"name":"其他","sort":3,"children":null}]},{"id":248014190764232704,"name":"冒充公检法及政府机关类","sort":2,"children":[{"id":248014190822952960,"name":"冒充公检法","sort":1,"children":null},{"id":248014190827147264,"name":"冒充其他单位组织","sort":2,"children":null}]},{"id":248014190768427008,"name":"刷单返利类","sort":3,"children":[{"id":248014190831341568,"name":"刷单返利","sort":1,"children":null}]},{"id":248014190772621312,"name":"贷款、代办信用卡类","sort":4,"children":[{"id":248014190835535872,"name":"虚假贷款","sort":1,"children":null},{"id":248014190839730176,"name":"虚假代办信用卡","sort":2,"children":null},{"id":248014190843924480,"name":"虚假提额套现","sort":3,"children":null},{"id":248014190848118784,"name":"其他","sort":4,"children":null}]},{"id":248014190776815616,"name":"冒充军警购物类","sort":5,"children":[{"id":248014190852313088,"name":"冒充军警购物诈骗","sort":1,"children":null}]},{"id":248014190781009920,"name":"虚假网络投资理财类","sort":6,"children":[{"id":248014190856507392,"name":"虚假网络投资理财","sort":1,"children":null}]},{"id":248014190785204224,"name":"虚假购物、服务类","sort":7,"children":[{"id":248014190869090304,"name":"虚假购物","sort":1,"children":null},{"id":248014190873284608,"name":"虚假服务","sort":2,"children":null},{"id":248014190877478912,"name":"其他","sort":3,"children":null}]},{"id":248014190789398528,"name":"网络婚恋、交友类(非虚假网络投资理财类)","sort":8,"children":[{"id":248014190881673216,"name":"冒充外国军人","sort":1,"children":null},{"id":248014190885867520,"name":"网络婚恋","sort":2,"children":null},{"id":248014190890061824,"name":"网络交友","sort":3,"children":null},{"id":248014190894256128,"name":"其他","sort":4,"children":null}]},{"id":248014190793592832,"name":"虚假征信类","sort":9,"children":[{"id":248014190898450432,"name":"消除校园贷记录","sort":1,"children":null},{"id":248014190902644736,"name":"消除不良记录","sort":2,"children":null},{"id":248014190906839040,"name":"其他","sort":3,"children":null}]},{"id":248014190797787136,"name":"冒充领导、熟人等特定身份类","sort":10,"children":[{"id":248014190911033344,"name":"冒充领导","sort":1,"children":null},{"id":248014190915227648,"name":"冒充熟人","sort":2,"children":null},{"id":248014190919421952,"name":"冒充公众人物","sort":3,"children":null},{"id":248014190923616256,"name":"冒充其他身份","sort":4,"children":null}]},{"id":248014190801981440,"name":"网络游戏产品虚假交易类","sort":11,"children":[{"id":248014190927810560,"name":"游戏币、点卡虚假充值","sort":1,"children":null},{"id":248014190932004864,"name":"游戏账号、装备虚假交易","sort":2,"children":null},{"id":248014190936199168,"name":"其他","sort":3,"children":null}]},{"id":248014190806175744,"name":"其他诈骗类型","sort":12,"children":[{"id":248014190940393472,"name":"虚假中奖诈骗","sort":1,"children":null},{"id":248014190944587776,"name":"虚假招聘","sort":2,"children":null},{"id":248014190948782080,"name":"充值(红包)返利","sort":3,"children":null},{"id":248014190952976384,"name":"机票退、改签诈骗","sort":4,"children":null},{"id":248014190957170688,"name":"PS图片诈骗","sort":5,"children":null},{"id":248014190961364992,"name":"重金求子(慈善捐款)","sort":6,"children":null},{"id":248014190965559296,"name":"其他","sort":7,"children":null}]}],"code":0,"msg":"成功"} ================================================ FILE: app/src/main/java/com/demo/antizha/ITimerState.kt ================================================ package com.demo.antizha interface ITimerState { fun timeCount(i: Int) fun timeOver() } ================================================ FILE: app/src/main/java/com/demo/antizha/OnWebListener.kt ================================================ package com.demo.antizha import com.demo.antizha.util.Parameters interface OnWebListener { fun shouldIntercept(aVar: Parameters?) fun webJsFinish() } ================================================ FILE: app/src/main/java/com/demo/antizha/UserInfoBean.kt ================================================ package com.demo.antizha import android.content.Context import android.content.SharedPreferences import android.graphics.* import android.provider.Settings import android.text.TextUtils import com.demo.antizha.ui.HiCore import com.demo.antizha.util.AddressBean import com.demo.antizha.util.CRC64 import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.TypeAdapter import com.google.gson.stream.JsonReader import com.google.gson.stream.JsonWriter import com.hjq.toast.ToastUtils import org.w3c.dom.Document import org.w3c.dom.NodeList import java.io.File import java.io.FileInputStream import java.io.IOException import java.nio.charset.StandardCharsets import java.security.InvalidKeyException import java.security.NoSuchAlgorithmException import java.text.SimpleDateFormat import java.util.* import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec import javax.xml.parsers.DocumentBuilder import javax.xml.parsers.DocumentBuilderFactory object UserInfoBean { var perfectProgress: Int = 0 //进度 var accountId: String = "" //账号ID var clusterID: Long = 0 var exp: Long = 0 //token的过期时间 var imei: String = "" //设备码 var useorigimei: Boolean = false//是否使用原始的机器码 var name: String = "" //名字 var id: String = "" //身份证前后2个字符 var mobileNumber: String = "" //电话前2后3 var region: String = "" //地区,比如 安徽省.淮北市.杜集区 var adcode: String = "" //地区码,比如 安徽省淮北市杜集区 adcode:340602 var addr: String = "" //详细地址 var professionName: String = "" //职业 var acctoken: String = "" //用户TOKEN只能正常注册登录后获得,否则服务器会拒绝 var longitude: String = "" //设置地区的经度,每天会略做随机修改 var latitude: String = "" //设置地区的纬度,每天会略做随机修改 var refTudeTime: String = "" //上次刷新经纬度的日期,和当前不同就该刷新了 var version: String = "" var innerVersion = 0 var getVerTime: String = "" //上次获取新颁布的日期,和当前不同就该刷新了 fun init() { val context: Context = HiCore.context val settings: SharedPreferences = context.getSharedPreferences("setting", 0) accountId = settings.getString("account", "").toString() imei = settings.getString("imei", "").toString() useorigimei = settings.getBoolean("originalimei", false) if (TextUtils.isEmpty(imei)) { val timei = Settings.System.getString(context.contentResolver, Settings.Secure.ANDROID_ID) imei = if (useorigimei) timei else toHexStr(CRC64.digest(timei.toByteArray()).bytes) } name = settings.getString("name", "").toString() id = settings.getString("id", "").toString() mobileNumber = settings.getString("phone", "").toString() region = settings.getString("region", "").toString() adcode = settings.getString("adcode", "").toString() addr = settings.getString("address", "").toString() professionName = settings.getString("work", "").toString() longitude = settings.getString("longitude", "").toString() latitude = settings.getString("latitude", "").toString() refTudeTime = settings.getString("refTudeTime", "").toString() version = settings.getString("version", "2.0.8").toString() innerVersion = settings.getInt("innerVersion", 144) getVerTime = settings.getString("getVerTime", "").toString() clusterID = 365268909 exp = (System.currentTimeMillis() + 86400000L * 30L) / 1000 if (TextUtils.isEmpty(region)) { region = "北京市.北京市.东城区" adcode = "110101" } checkLongitudeLatitude() if (TextUtils.isEmpty(version)) { version = BuildConfig.VERSION_NAME innerVersion = BuildConfig.VERSION_CODE } getToken() calcProgress() } fun commit() { val context: Context = HiCore.context val settings: SharedPreferences = context.getSharedPreferences("setting", 0) val editor: SharedPreferences.Editor = settings.edit() editor.putString("account", accountId) editor.putString("imei", imei) editor.putBoolean("originalimei", useorigimei) editor.putString("name", name) editor.putString("id", id) editor.putString("phone", mobileNumber) editor.putString("region", region) editor.putString("adcode", adcode) editor.putString("address", addr) editor.putString("work", professionName) editor.putString("longitude", longitude) editor.putString("latitude", latitude) editor.putString("refTudeTime", refTudeTime) editor.putString("version", version) editor.putInt("innerVersion", innerVersion) editor.putString("getVerTime", getVerTime) editor.apply() calcProgress() } fun setVer(ver: String, verCode: Int) { if (!TextUtils.equals(ver, version) || innerVersion != verCode) { val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) // HH:mm:ss val currentDate = Date(System.currentTimeMillis()) getVerTime = simpleDateFormat.format(currentDate) version = ver innerVersion = verCode commit() } } fun calcProgress() { perfectProgress = 0 if (!TextUtils.isEmpty(name)) { perfectProgress += 30 } if (!TextUtils.isEmpty(id)) { perfectProgress += 30 } if (!TextUtils.isEmpty(region)) { perfectProgress += 20 } if (!TextUtils.isEmpty(addr)) { perfectProgress += 20 } if (perfectProgress >= 100) { perfectProgress = 100 } } fun isVerified(): Boolean { if (TextUtils.isEmpty(name)) return false if (TextUtils.isEmpty(id)) return false if (TextUtils.isEmpty(mobileNumber)) return false if (TextUtils.isEmpty(accountId)) return false return true } fun checkLongitudeLatitude() { val simpleDateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()) // HH:mm:ss val currentDate = Date(System.currentTimeMillis()) val dateString = simpleDateFormat.format(currentDate) if (!dateString.equals(refTudeTime)) { val regions = TextUtils.split(region, "\\.") if (regions.size != 3) return val provinces: List = AddressBean.getHiProvince() for (province in provinces) { if (province.name != regions[0]) continue for (city in province.cityList) { if (city.name != regions[1]) continue for (town in city.townList) { if (town.name == regions[2]) { val random = Random() val flongitude = town.longitude.toFloat() + (random.nextInt(200) - 100).toFloat() / 1000.0F val flatitude = town.latitude.toFloat() + (random.nextInt(200) - 100).toFloat() / 1000.0F longitude = flongitude.toString() latitude = flatitude.toString() refTudeTime = dateString commit() } } } } } } fun getToken() { try { ///sdcard/Android/data/com.demo.antizha/files/note_national.xml val path = HiCore.context.getExternalFilesDir(null)?.path val file = File(path, "note_national.xml") //file.exists()总是返回false if (!file.canRead()) return val iStream = FileInputStream(file) val factory: DocumentBuilderFactory = DocumentBuilderFactory.newInstance() val builder: DocumentBuilder = factory.newDocumentBuilder() val document: Document = builder.parse(iStream) val stringList: NodeList = document.getElementsByTagName("string") for (i in 0 until stringList.length) { val node = stringList.item(i) val nodeName = node.attributes.item(0).textContent if (nodeName.equals("sp_user_bean")) { class TokenPackage(val token: String) val value = node.textContent val token = Gson().fromJson(value, TokenPackage::class.java) if (token != null) { val tokenSub: List = token.token.split(".") if (tokenSub.size != 3) return val payLoadJson = String(Base64.getUrlDecoder().decode(tokenSub[1]), charset("UTF-8")) val gsonBuilder = GsonBuilder().registerTypeAdapter( PayLoads::class.java, PayLoadAdapter() ) val gson = gsonBuilder.create() val pl = gson.fromJson(payLoadJson, PayLoads::class.java) val currentTime = System.currentTimeMillis() / 1000 if (pl.getExp() < currentTime) { ToastUtils.show("Token Is Expire!") return } acctoken = token.token return } } } } catch (err: Exception) { } } private fun hmacSha1(seed: ByteArray, input: ByteArray): ByteArray? { val secretKeySpec = SecretKeySpec(seed, "HmacSHA256") return try { val instance: Mac = Mac.getInstance("HmacSHA256") instance.init(secretKeySpec) instance.doFinal(input) } catch (unused: InvalidKeyException) { null } catch (unused: NoSuchAlgorithmException) { null } } class TokenModel { var ClusterID: Long = 0 lateinit var ID: String lateinit var MobileNumber: String lateinit var RegionCode: String var Role: String = "Client" var TokenType: Int = 1 } open class PayLoad(var name: String, var value: Any) class PayLoads { var sub: ArrayList = ArrayList() fun getExp(): Long { for (i in sub) { if (i.name == "exp") return i.value as Long } return 0 } } class PayLoadAdapter : TypeAdapter() { @Throws(IOException::class) override fun write(out: JsonWriter, value: PayLoads) { out.beginObject() for (payLoad in value.sub) { when (payLoad.value) { is String -> { out.name(payLoad.name).value(payLoad.value as String) } is Long -> { out.name(payLoad.name).value(payLoad.value as Long) } is Int -> { out.name(payLoad.name).value(payLoad.value as Int) } } } out.endObject() } @Throws(IOException::class) override fun read(jread: JsonReader?): PayLoads { val pl = PayLoads() if (jread == null) return pl jread.beginObject() while (jread.hasNext()) { when (val name = jread.nextName()) { "exp" -> pl.sub.add(PayLoad("exp", jread.nextLong())) else -> pl.sub.add(PayLoad(name, jread.nextString())) } } jread.endObject() return pl } } fun makeToken(): String { //伪造TOKEN的算法应该是正确的,但是没有正确的seed,算不出正确的TOKEN val headerJson = """{"alg":"HS256","typ":"JWT"}""" val header = Base64.getUrlEncoder().withoutPadding().encodeToString( headerJson.toByteArray(StandardCharsets.UTF_8) ) val gsonBuilder = GsonBuilder().registerTypeAdapter(PayLoads::class.java, PayLoadAdapter()) val gson = gsonBuilder.create() val tm = TokenModel() tm.ClusterID = clusterID tm.ID = accountId tm.MobileNumber = mobileNumber tm.RegionCode = adcode val pl = PayLoads() pl.sub.add(PayLoad("TokenModel", gson.toJson(tm))) pl.sub.add(PayLoad("exp", exp)) pl.sub.add(PayLoad("iss", "PreventFraudAPI")) pl.sub.add(PayLoad("aud", "PreventFraudAPP")) val payLoadJson = gson.toJson(pl) val payload = Base64.getUrlEncoder().withoutPadding() .encodeToString(payLoadJson.toByteArray(StandardCharsets.UTF_8)) val seed = "hicore2020051518".toByteArray(charset("UTF_8")) val value = ("$header.$payload").toByteArray(charset("UTF_8")) val sign = Base64.getUrlEncoder().withoutPadding().encodeToString(hmacSha1(seed, value)) return String.format("Bearer %s.%s.%s", header, payload, sign) } } class Dp2Px(context: Context) { var density: Float = 0.0F fun dp2px(value: Int): Int { return (value * density + 0.5).toInt() } init { density = context.resources.displayMetrics.density } } lateinit var dp2px: Dp2Px fun toHexStr(byteArray: ByteArray) = with(StringBuilder()) { byteArray.forEach { val hex = it.toInt() and (0xFF) val hexStr = Integer.toHexString(hex) if (hexStr.length == 1) append("0").append(hexStr) else append(hexStr) } toString() } fun getRoundBitmapByShader( bitmap: Bitmap?, outWidth: Int, outHeight: Int, radius: Float, boarder: Float ): Bitmap? { if (bitmap == null) { return null } val height = bitmap.height val width = bitmap.width val widthScale = outWidth * 1f / width val heightScale = outHeight * 1f / height val matrix = Matrix() matrix.setScale(widthScale, heightScale) //创建输出的bitmap val desBitmap = Bitmap.createBitmap(outWidth, outHeight, Bitmap.Config.ARGB_8888) //创建canvas并传入desBitmap,这样绘制的内容都会在desBitmap上 val canvas = Canvas(desBitmap) val paint = Paint(Paint.ANTI_ALIAS_FLAG) //创建着色器 val bitmapShader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP) //给着色器配置matrix bitmapShader.setLocalMatrix(matrix) paint.shader = bitmapShader //创建矩形区域并且预留出border val rect = RectF(boarder, boarder, (outWidth - boarder), (outHeight - boarder)) //把传入的bitmap绘制到圆角矩形区域内 canvas.drawRoundRect(rect, radius, radius, paint) if (boarder > 0) { //绘制boarder val boarderPaint = Paint(Paint.ANTI_ALIAS_FLAG) boarderPaint.color = Color.GREEN boarderPaint.style = Paint.Style.STROKE boarderPaint.strokeWidth = boarder canvas.drawRoundRect(rect, radius, radius, boarderPaint) } return desBitmap } fun str2time(str: String): Long { return try { val date = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).parse(str) date?.time ?: 0 } catch (e2: Exception) { e2.printStackTrace() 0 } } fun optimizationTimeStr(str: String): String { if (TextUtils.isEmpty(str)) { return "" } val currentTimeMillis: Long = (System.currentTimeMillis() - str2time(str)) / 1000 return when { currentTimeMillis < 30 -> { "刚刚" } currentTimeMillis < 3600 -> { (currentTimeMillis / 60).toString() + "分钟前" } currentTimeMillis >= 86400 -> { str.substring(0, 11) } else -> { (currentTimeMillis / 3600).toString() + "小时前" } } } ================================================ FILE: app/src/main/java/com/demo/antizha/WebViewFrag.kt ================================================ package com.demo.antizha import android.app.Activity import android.text.TextUtils import android.webkit.JavascriptInterface import com.demo.antizha.ui.HiWebView import com.demo.antizha.util.UrlUtils class WebViewFrag { companion object { var mActivity: Activity? = null var mListener: OnWebListener? = null } class JsObject { @JavascriptInterface fun getHCData(): String { return HiWebView.getH5Data() } @JavascriptInterface fun getPageParams(str: String?) { if (mActivity != null && TextUtils.equals("pageFinish=1", str) && mActivity != null && mListener != null ) { mListener!!.webJsFinish() } } @JavascriptInterface fun sendWebMsg(str: String?) { if (str != null && mActivity != null && mListener != null && !TextUtils.isEmpty(str)) { mListener!!.shouldIntercept(UrlUtils.string2Param(str)) } } } /* renamed from: a */ fun init(activity: Activity?, onWebListener: OnWebListener?) { mActivity = activity mListener = onWebListener } } ================================================ FILE: app/src/main/java/com/demo/antizha/adapter/AppDeleteAdapter.kt ================================================ package com.demo.antizha.adapter import android.text.format.Formatter import android.widget.TextView import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.demo.antizha.R import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.activity.BaseUploadActivity import com.demo.antizha.util.AppUtil.AppInfoBean class AppDeleteAdapter(i: Int, list: ArrayList?, /* renamed from: a */ private var upStates: List) : BaseQuickAdapter(i, list) { init { addChildClickViewIds(R.id.iv_clear) } public override fun convert(holder: BaseViewHolder, item: AppInfoBean) { if (item.appIcon != null) holder.setImageDrawable(R.id.app_icon, item.appIcon) val formatFileSize: String = Formatter.formatFileSize(HiCore.app, item.size) holder.setText(R.id.tv_app_name, item.appName) holder.setText(R.id.tv_app_version, "版本:" + item.version + " | " + formatFileSize) } override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { super.onBindViewHolder(holder, position) val tvUpState = holder.getView(R.id.tv_upload_state) if (position < upStates.size) { BaseUploadActivity.showUpState(tvUpState, upStates[position]) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/adapter/HRecyclerViewAdapter.kt ================================================ package com.demo.antizha.adapter import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.demo.antizha.R import com.demo.antizha.util.NotchUtils.dp2px class HRecyclerViewAdapter(private var context: Context, i: Int) : RecyclerView.Adapter() { private var shareStrings: Array private var shareImages: IntArray private var onItemClickListener: ((Int, String) -> Unit)? = null private var shareType = i private var widthPixels = 0 init { this.widthPixels = context.resources.displayMetrics.widthPixels if (shareType == 5) { shareStrings = arrayOf("微信好友", "QQ好友", "钉钉", "复制链接") shareImages = intArrayOf(R.drawable.iv_share_wx, R.drawable.iv_login_qq, R.drawable.iv_share_dding, R.drawable.iv_share_copy) } else { shareStrings = arrayOf("微信好友", "朋友圈", "QQ好友", "QQ空间", "微博", "钉钉", "复制链接") shareImages = intArrayOf(R.drawable.iv_share_wx, R.drawable.iv_share_wxcicle, R.drawable.iv_login_qq, R.drawable.iv_share_qzone, R.drawable.iv_share_sina, R.drawable.iv_share_dding, R.drawable.iv_share_copy) } } inner class HImageHolder(view: View) : RecyclerView.ViewHolder(view) { var flShareItem: FrameLayout = view.findViewById(R.id.fl_share_item) var ivImage: ImageView = view.findViewById(R.id.image) var tvName: TextView = view.findViewById(R.id.tv_name) init { if (this@HRecyclerViewAdapter.shareType == 5) { this@HRecyclerViewAdapter.setShareItemWidth(flShareItem) } } } override fun getItemCount(): Int { return shareStrings.size } fun setOnItemClickListener(onItemClickListener: (Int, String) -> Unit) { this.onItemClickListener = onItemClickListener } override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): HImageHolder { return HImageHolder(LayoutInflater.from(context) .inflate(R.layout.item_hrecyclerview, viewGroup, false)) } override fun onBindViewHolder(hImageHolder: HImageHolder, i: Int) { hImageHolder.tvName.text = shareStrings[i] hImageHolder.ivImage.setImageResource(shareImages[i]) if (shareType == 1 && i == shareStrings.size - 1) { hImageHolder.tvName.text = "生成海报" hImageHolder.ivImage.setImageResource(R.drawable.iv_share_download) } hImageHolder.itemView.setOnClickListener { view -> if (onItemClickListener != null) onItemClickListener!!(hImageHolder.layoutPosition, shareStrings[i]) } } fun setShareItemWidth(frameLayout: FrameLayout) { val layoutParams = frameLayout.layoutParams layoutParams.width = (widthPixels - dp2px(16.0f)) / shareStrings.size frameLayout.layoutParams = layoutParams } } ================================================ FILE: app/src/main/java/com/demo/antizha/adapter/HeadFootAdapter.kt ================================================ package com.demo.antizha.adapter import android.view.View import androidx.recyclerview.widget.RecyclerView abstract class HeadFootAdapter : RecyclerView.Adapter() { var _footerView: View? = null var _headerView: View? = null override fun getItemCount(): Int { if (_headerView == null && _footerView == null) { return getItemCount() } if (_headerView == null && _footerView != null) { return getItemCount() + 1 } return if (_headerView == null || _footerView != null) { getItemCount() + 2 } else getItemCount() + 1 } override fun getItemViewType(i: Int): Int { return if (_headerView == null || i != 0) { if (_footerView == null || i != getItemCount() - 1) 2 else 1 } else 0 } } ================================================ FILE: app/src/main/java/com/demo/antizha/adapter/HomeNewCaseAdapter.kt ================================================ package com.demo.antizha.adapter import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.demo.antizha.R import com.demo.antizha.UserInfoBean import com.demo.antizha.optimizationTimeStr import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.activity.PromosWebDetActivity class NewCaseBean( val id: String, val updateTime: String, val createTime: String, val title: String, val author: String, var cdnCover: String, var localFilePath: String, val mterialType: Int ) class NewCaseBeanData(var rows: ArrayList) class NewCaseBeanPackage(val data: NewCaseBeanData?, val code: Int) class HomeNewCaseAdapter : HeadFootAdapter { private val context: Context private var list: MutableList fun getHeaderView(): View? { return _headerView } fun setHeaderView(view: View?) { _headerView = view notifyItemInserted(0) } fun getFooterView(): View? { return _footerView } fun setFooterView(view: View?) { _footerView = view notifyItemInserted(itemCount - 1) } constructor(context: Context, list: MutableList) { this.context = context this.list = list } inner class NewCaseViewHolder(view: View) : RecyclerView.ViewHolder(view) { lateinit var rlTypeTopic: View lateinit var ivTopicPic: ImageView lateinit var ivTopicTit: TextView lateinit var ivTopicTime: TextView lateinit var viewLine: View init { if (view !== _headerView && view !== _footerView) { rlTypeTopic = view.findViewById(R.id.rl_type_topic) ivTopicPic = view.findViewById(R.id.iv_topic_pic) ivTopicTit = view.findViewById(R.id.iv_topic_tit) ivTopicTime = view.findViewById(R.id.iv_topic_time) viewLine = view.findViewById(R.id.view_line) } } } override fun getItemCount(): Int { return list.size } val data: MutableList get() = list override fun onBindViewHolder(holder: RecyclerView.ViewHolder, i: Int) { if (getItemViewType(i) == 2 && holder is NewCaseViewHolder) { val rowsBean: NewCaseBean = list[i - 1] holder.ivTopicTit.text = rowsBean.title if (!TextUtils.isEmpty(rowsBean.author)) { holder.ivTopicTime.text = "${rowsBean.author} ${optimizationTimeStr(rowsBean.updateTime)}" } else { holder.ivTopicTime.text = "国家反诈中心 ${optimizationTimeStr(rowsBean.updateTime)}" } holder.ivTopicPic.visibility = View.VISIBLE if (4 != rowsBean.mterialType) Glide.with(_headerView!!).load(rowsBean.cdnCover).into(holder.ivTopicPic) else holder.ivTopicPic.visibility = View.INVISIBLE if (TextUtils.isEmpty(rowsBean.cdnCover)) { holder.ivTopicPic.visibility = View.INVISIBLE } if (i == itemCount - 2) { holder.viewLine.visibility = View.GONE } else { holder.viewLine.visibility = View.VISIBLE } holder.itemView.setOnClickListener(View.OnClickListener { view -> if (!HiCore.app.isDouble()) { val intent = Intent(context, PromosWebDetActivity::class.java) intent.putExtra("extra_web_title", "国家反诈中心") val adcode = if (TextUtils.isEmpty(UserInfoBean.adcode)) "110105" else UserInfoBean.adcode intent.putExtra("extra_web_url", rowsBean.localFilePath + "&nodeId=$adcode") intent.putExtra("extra_web_id", rowsBean.id) intent.putExtra("extra_web_enter", 2) context.startActivity(intent) } }) } } override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): RecyclerView.ViewHolder { if (_headerView != null && i == 0) { return NewCaseViewHolder(_headerView!!) } return if (_footerView == null || i != 1) { NewCaseViewHolder(LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.item_home_new_case, viewGroup, false)) } else NewCaseViewHolder(_footerView!!) } @SuppressLint("NotifyDataSetChanged") fun resetNewCase(list: List?) { this.list.clear() this.list.addAll((list)!!) notifyDataSetChanged() } } ================================================ FILE: app/src/main/java/com/demo/antizha/adapter/NoteListAdapte.kt ================================================ package com.demo.antizha.adapter import android.app.Activity import android.content.Intent import android.os.Parcel import android.os.Parcelable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.demo.antizha.R import com.demo.antizha.ui.activity.NoteDetailActivity class NoteListBean(source: Parcel) : Parcelable { var content: String? = null var id: String? = null var isRead = false var title: String = "" var url: String? = null var vaildEndTime: String? = null var vaildStartTime: String? = null init { content = source.readString() id = source.readString() isRead = source.readInt() > 0 title = source.readString().toString() url = source.readString() vaildEndTime = source.readString() vaildStartTime = source.readString() } override fun describeContents(): Int { return 0 } override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(content) dest.writeString(id) dest.writeInt(if (isRead) 1 else 0) dest.writeString(title) dest.writeString(url) dest.writeString(vaildEndTime) dest.writeString(vaildStartTime) } companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): NoteListBean { return NoteListBean(parcel) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } class NoteHolder(view: View) : RecyclerView.ViewHolder(view) { var tvNoteThem: TextView = view.findViewById(R.id.tv_note_them) var tvTime: TextView = view.findViewById(R.id.tv_time) var tvNumRed: TextView = view.findViewById(R.id.tv_num_red) var tvDesc: TextView = view.findViewById(R.id.desc) } class NoteListAdapte(val mActivity: Activity, var list: ArrayList) : RecyclerView.Adapter() { private fun subTitle(str: String): String { return if (str.length <= 18) { str } else (str.subSequence(0, 18) as Any).toString() + "..." } override fun onBindViewHolder(holder: NoteHolder, i: Int) { if (list.size > 0) { val noteListBean = list[i] holder.tvNumRed.visibility = View.INVISIBLE holder.tvNoteThem.text = subTitle(noteListBean.title) holder.tvTime.text = noteListBean.vaildStartTime holder.itemView.setOnClickListener(object : View.OnClickListener { override fun onClick(view: View?) { openNoteDetail(noteListBean, view) } }) } } override fun getItemCount(): Int { return list.size } override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): NoteHolder { return NoteHolder(LayoutInflater.from(mActivity) .inflate(R.layout.item_note_list, viewGroup, false)) } fun openNoteDetail(noteListBean: NoteListBean, view: View?) { val intent = Intent(mActivity, NoteDetailActivity::class.java) intent.putExtra("from_page_bean", noteListBean) mActivity.startActivity(intent) noteListBean.isRead = true //this@NoteListPresenter.getNoteItem(noteListBean.id) } } ================================================ FILE: app/src/main/java/com/demo/antizha/adapter/PictureSelectAdapter.kt ================================================ package com.demo.antizha.adapter import android.text.TextUtils import android.view.View import android.widget.ImageView import android.widget.TextView import com.bumptech.glide.Glide import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.demo.antizha.R import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.activity.BaseUploadActivity class PictureSelectAdapter(resId: Int, private var medias: ArrayList) : BaseQuickAdapter(resId, medias) { companion object { const val styleVideo = "style_item_video" const val stylePicture = "style_item_picture" } private var style: String? = null private var maxCount = 0 private var uploadStateInfos = ArrayList() init { style = "" maxCount = 9 addChildClickViewIds(R.id.iv_clear) addChildClickViewIds(R.id.picture_foot) addChildClickViewIds(R.id.picture_select) } constructor(resId: Int, medias: ArrayList, style: String?, maxCount: Int, upStates: ArrayList) : this(resId, medias) { this@PictureSelectAdapter.style = style this@PictureSelectAdapter.maxCount = maxCount this@PictureSelectAdapter.uploadStateInfos = upStates } @Suppress("UNUSED_PARAMETER") private fun convertMedia2Video(baseViewHolder: BaseViewHolder, localMedia: String) { } private fun convertMedia2Picture(baseViewHolder: BaseViewHolder, localMedia: String) { //baseViewHolder.addOnClickListener(R.id.iv_clear) val ivSelect = baseViewHolder.getView(R.id.picture_select) val ivFoot = baseViewHolder.getView(R.id.picture_foot) val ivClear = baseViewHolder.getView(R.id.iv_clear) val tvUploadState = baseViewHolder.getView(R.id.tv_upload_state) if (TextUtils.isEmpty(localMedia)) { ivClear.visibility = View.GONE ivSelect.visibility = View.GONE tvUploadState.visibility = View.GONE ivFoot.visibility = View.VISIBLE return } ivFoot.visibility = View.GONE try { val indexOf = medias.indexOf(localMedia) val size = uploadStateInfos.size if (size > 0 && indexOf < size) { BaseUploadActivity.showUpState(tvUploadState, uploadStateInfos[indexOf]) } } catch (e: Exception) { e.printStackTrace() } ivClear.visibility = View.VISIBLE ivSelect.visibility = View.VISIBLE tvUploadState.visibility = View.VISIBLE Glide.with(HiCore.context).load(localMedia).into(ivSelect) } override fun convert(holder: BaseViewHolder, item: String) { if (styleVideo == style) { convertMedia2Video(holder, item) } else { convertMedia2Picture(holder, item) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/adapter/SmsDeleteAdapter.kt ================================================ package com.demo.antizha.adapter import android.os.Parcel import android.os.Parcelable import android.text.TextUtils import android.view.View import android.widget.ImageView import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.demo.antizha.R import java.util.* class SmsBean : Parcelable { var id: String = "" var isSelect: Boolean = false var report_type: Int = 0 var smsNum: String = "" var smsContent: String = "" var stringDate: String = "" var isInput = false var index: Int = -1 constructor() constructor(source: Parcel) { id = source.readString().toString() isSelect = source.readInt() > 0 report_type = source.readInt() smsNum = source.readString().toString() smsContent = source.readString().toString() stringDate = source.readString().toString() isInput = source.readInt() > 0 index = source.readInt() } override fun describeContents(): Int { return 0 } override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(id) dest.writeInt(if (isSelect) 1 else 0) dest.writeInt(report_type) dest.writeString(smsNum) dest.writeString(smsContent) dest.writeString(stringDate) dest.writeInt(if (isInput) 1 else 0) dest.writeInt(index) } companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): SmsBean { return SmsBean(parcel) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } class SmsDeleteAdapter(resId: Int, list: ArrayList?) : BaseQuickAdapter(resId, list) { init { addChildClickViewIds(R.id.iv_clear) addChildClickViewIds(R.id.iv_edit) } public override fun convert(holder: BaseViewHolder, item: SmsBean) { holder.setText(R.id.tv_sms_phone, item.smsNum) holder.setText(R.id.tv_sms_content, item.smsContent) val stringDate = item.stringDate if (!TextUtils.isEmpty(stringDate)) { val split = stringDate.split(" ").toTypedArray() val sb = StringBuilder().append(Calendar.getInstance()[1]).append("") val time = if (stringDate.contains(sb.toString())) stringDate.substring(5) else split[0] holder.setText(R.id.tv_time, time) } else { holder.setText(R.id.tv_time, "") } val ivEdit = holder.getView(R.id.iv_edit) as ImageView if (item.isInput) { ivEdit.visibility = View.VISIBLE } else { ivEdit.visibility = View.GONE } } } ================================================ FILE: app/src/main/java/com/demo/antizha/adapter/SocialAccAdapter.kt ================================================ package com.demo.antizha.adapter import android.os.Parcel import android.os.Parcelable import com.chad.library.adapter.base.BaseQuickAdapter import com.chad.library.adapter.base.viewholder.BaseViewHolder import com.demo.antizha.R class SocialAccAdapter(resId: Int, val list: ArrayList) : BaseQuickAdapter(resId, list) { init { addChildClickViewIds(R.id.iv_delete) addChildClickViewIds(R.id.iv_edit) } override fun convert(holder: BaseViewHolder, item: SocialAccBean) { holder.setText(R.id.tv_name, item.accountName) holder.setText(R.id.tv_acc_num, item.accountNum) } } class SocialAccBean : Parcelable { var accountName: String = "" var accountNum: String = "" var id: String = "" var suspectInfoID: String = "" constructor() constructor(source: Parcel) { accountName = source.readString().toString() accountNum = source.readString().toString() id = source.readString().toString() suspectInfoID = source.readString().toString() } override fun describeContents(): Int { return 0 } override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(accountName) dest.writeString(accountNum) dest.writeString(id) dest.writeString(suspectInfoID) } companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): SocialAccBean { return SocialAccBean(parcel) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/interfaces/IApiResult.kt ================================================ package com.demo.antizha.interfaces import okhttp3.Headers interface IApiResult { fun onSuccess(data: String) fun onError() } ================================================ FILE: app/src/main/java/com/demo/antizha/interfaces/IClickListener.kt ================================================ package com.demo.antizha.interfaces interface IClickListener { fun cancelBtn() fun clickOKBtn() } interface IOneClickListener { fun clickOKBtn() } ================================================ FILE: app/src/main/java/com/demo/antizha/interfaces/IEditAfterListener.kt ================================================ package com.demo.antizha.interfaces interface IEditAfterListener { fun editLength(length: Int) } ================================================ FILE: app/src/main/java/com/demo/antizha/interfaces/IHandler.kt ================================================ package com.demo.antizha.interfaces import android.os.Handler import android.os.Looper import android.os.Message /* loaded from: classes3.dex */ object IHandler { private var listenerWebAct: HandleWebActListener? = null private var listenerWebDet: HandleWebDetailListener? = null private var listenerWebFlg: HandleWebFlgListener? = null var mHandler = Holder(Looper.getMainLooper()) fun setHandleMsgListener(handleListener: HandleListener?) { when (handleListener) { is HandleWebFlgListener -> { listenerWebFlg = handleListener } is HandleWebActListener -> { listenerWebAct = handleListener } is HandleWebDetailListener -> { listenerWebDet = handleListener } } } interface HandleListener { fun handleMsg(message: Message?) companion object { val mHandler: Handler = IHandler.mHandler } } interface HandleWebActListener : HandleListener interface HandleWebDetailListener : HandleListener interface HandleWebFlgListener : HandleListener class Holder(looper: Looper?) : Handler(looper!!) { override fun handleMessage(message: Message) { super.handleMessage(message) if (listenerWebFlg != null) { listenerWebFlg!!.handleMsg(message) } if (listenerWebAct != null) { listenerWebAct!!.handleMsg(message) } if (listenerWebDet != null) { listenerWebDet!!.handleMsg(message) } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/md/JniHandStamp.kt ================================================ package com.demo.antizha.md import android.text.TextUtils import com.demo.antizha.BuildConfig import com.demo.antizha.interfaces.IApiResult import com.demo.antizha.interfaces.IOneClickListener import com.demo.antizha.newwork.UnsafeOkHttpClient import com.demo.antizha.util.LogUtils import com.demo.antizha.util.ResponseDataTypeAdaptor import com.google.gson.Gson import com.openssl.md.JniHand import okhttp3.Headers import java.util.concurrent.atomic.AtomicLong object JniHandStamp { var jni = JniHand() var peer: String = "" var peerGetted = false var atomicInte: AtomicLong = AtomicLong(1L) var expireTime: Long = 0 //返回值是300,代表300秒后,peer过期 var isExpireQurey = false //peer是否有效 var lastLocal: Long = 0 var identity: String = "" class OnGetPeer : IApiResult { var iOneClickListener: IOneClickListener constructor(iOneClickListener: IOneClickListener) { this.iOneClickListener = iOneClickListener } override fun onError() { LogUtils.debug("OnGetPeer Error", "") } override fun onSuccess(data: String) { LogUtils.debug("OnGetPeer Success", data) onPeerGetted(data) iOneClickListener.clickOKBtn() } } @Synchronized fun princiHttp(t: T?): HashMap { val hashMap: HashMap = HashMap() if (t != null) { val m21549a: String = ResponseDataTypeAdaptor.buildGson().toJson(t) val paramJsonEncode = jni.paramJsonEncode(m21549a) hashMap["data"] = paramJsonEncode } return hashMap } fun handshareKeySyn(iOneClickListener: IOneClickListener) { //如果有效,就不更新peer if (this.isExpireQurey) { iOneClickListener.clickOKBtn() return } val appPubKey = jni.getAppPubKey() val hashMap: HashMap = HashMap() hashMap["peer"] = appPubKey UnsafeOkHttpClient.getDataByPostSyn( /*"https://192.168.2.101/hicore/api/Account/handshark",*/ BuildConfig.RELEASE_API_URL + "/api/Account/handshark", bodyMap = hashMap, addHead = true, OnGetPeer(iOneClickListener)) } fun handshareKeyAsyn(iOneClickListener: IOneClickListener) { val appPubKey = jni.getAppPubKey() /* jni.setApiPubKey("MIIBSzCCAQMGByqGSM49AgEwgfcCAQEwLAYHKoZIzj0BAQIhAP////8AAAABAAAAAAAAAAAAAAAA////////////////MFsEIP////8AAAABAAAAAAAAAAAAAAAA///////////////8BCBaxjXYqjqT57PrvVV2mIa8ZR0GsMxTsPY7zjw+J9JgSwMVAMSdNgiG5wSTamZ44ROdJreBn36QBEEEaxfR8uEsQkf4vOblY6RA8ncDfYEt6zOg9KE5RdiYwpZP40Li/hp/m47n60p8D54WK84zV2sxXs7LtkBoN79R9QIhAP////8AAAAA//////////+85vqtpxeehPO5ysL8YyVRAgEBA0IABEDb3semEzNTxYUtEa7PAEAfLrTQoxZAwsmBFuU6WwBFRnhV4CaPkQJ1WFRPWTfo4mps/y8V9ViePKh/8rNHE+w=".replace( "(.{64})".toRegex(), "$1\n").trim()) val t1 = jni.paramJsonEncode("0123456789abcdef") val t2 = jni.paramJsonEncode("0123456789abcde") */ val hashMap: HashMap = HashMap() hashMap["peer"] = appPubKey UnsafeOkHttpClient.getDataByPost( /*"https://192.168.2.101/hicore/api/Account/handshark",*/ BuildConfig.RELEASE_API_URL + "/api/Account/handshark", bodyMap = hashMap, addHead = true, OnGetPeer(iOneClickListener)) } class PeerBody(val peer: String, val identity: String, val expire: String, val seqid: String) class PeerData(val data: PeerBody?, val code: Int) class SData(val sData: String) fun getSData(data: String): String { if (data.isEmpty()) return String() if (data[0] != '{') return String() val hashMap = Gson().fromJson(data, HashMap::class.java) if (!hashMap.containsKey("sData")) return String() val text = jni.paramJsonDecode(hashMap["sData"].toString()) return text } fun onPeerGetted(data: String) { if (data.isEmpty()) return if (data[0] != '{') return val peerData = Gson().fromJson(data, PeerData::class.java) if (peerData.code != 0) return peer = peerData.data!!.peer.replace("(.{64})".toRegex(), "$1\n").trim() jni.setApiPubKey(peer) identity = jni.paramJsonDecode(peerData.data.identity) val seqid = jni.paramJsonDecode(peerData.data.seqid) if (!TextUtils.isEmpty(seqid)) { atomicInte.set(seqid.toLong()) } val expire = jni.paramJsonDecode(peerData.data.expire) if (!TextUtils.isEmpty(expire)) { expireTime = expire.toLong() } lastLocal = System.currentTimeMillis() isExpireQurey = true peerGetted = true } fun getSeqID(): String { if (!peerGetted) return "" return jni.paramJsonEncode(this.atomicInte.incrementAndGet().toString()) } @Synchronized fun expireFail(ForceExpiration: Boolean): Boolean { if (ForceExpiration) { isExpireQurey = false return true } else if (isNeedDelay()) { return false } else { if (expireTime - (System.currentTimeMillis() - lastLocal) / 1000 > 0) { return false } //peer没有在4-5分钟之间被重置,所以过期了。 isExpireQurey = false return true } } fun isNeedDelay(): Boolean { val currentTimeMillis = (System.currentTimeMillis() - lastLocal) / 1000 val j = expireTime if (j - currentTimeMillis <= 0 || j - currentTimeMillis >= 60) { //初始化后0-4分钟走这 return false } //初始化后4-5分钟走这。 //如果4-5分钟之间有发数据,那这个peer的有效期将从当前时间重置 lastLocal = System.currentTimeMillis() return true } } ================================================ FILE: app/src/main/java/com/demo/antizha/newwork/DictionaryUtils.kt ================================================ package com.demo.antizha.newwork import com.demo.antizha.BuildConfig import com.demo.antizha.interfaces.IApiResult import com.demo.antizha.md.JniHandStamp import com.demo.antizha.newwork.UnsafeOkHttpClient.getDataByPost import com.demo.antizha.util.LogUtils import okhttp3.Headers object DictionaryUtils { var step: Int = 0 var ask: ArrayList = ArrayList() var answer: ArrayList = ArrayList() init { ask.add("ProtorolVersion,SecretVersion,AnServiceAgreement,AnConcealAgreement,androidh5host,androidhandbook,failureNumStartValidate") ask.add("whiteTelList,connectionTel,virusUpdateIntervalHours") } class OnGetDictionary : IApiResult { override fun onError() { LogUtils.debug("OnGetDictionary Error", "") } override fun onSuccess(data: String) { LogUtils.debug("OnGetDictionary Success", data) onDictionaryGetted(data) } } fun getDictionary() { if (step == ask.size) return val hashMap: HashMap = HashMap() hashMap["dictionarykeys"] = ask[step] getDataByPost( BuildConfig.RELEASE_API_URL + "/api/AppConfig/getalldictionaryv3", bodyMap = JniHandStamp.princiHttp(hashMap), addHead = true, OnGetDictionary() ) } fun onDictionaryGetted(data: String) { val text = JniHandStamp.getSData(data) answer.add(text) step += 1 getDictionary() } } ================================================ FILE: app/src/main/java/com/demo/antizha/newwork/FileUtil.kt ================================================ package com.demo.antizha.newwork import android.text.TextUtils import com.demo.antizha.BuildConfig import com.demo.antizha.interfaces.IApiResult import com.demo.antizha.md.JniHandStamp import com.demo.antizha.newwork.UnsafeOkHttpClient.getDataByPost import com.demo.antizha.util.LogUtils import com.hjq.toast.ToastUtils import okhttp3.Headers object FileUtil { class NormalSave : IApiResult { var saveFile: String constructor(saveFile: String) { this.saveFile = saveFile } override fun onError() { LogUtils.debug("NormalSave Error", "") } override fun onSuccess(data: String) { LogUtils.debug("NormalSave Success", data) val text = JniHandStamp.getSData(data) if (TextUtils.isEmpty(text)) return if (!TextUtils.isEmpty(saveFile)) { ToastUtils.cancel() ToastUtils.show("savefile:$saveFile") saveBuff2File(text, saveFile) } } } fun update() { //轮播 val bannerUrl = BuildConfig.RELEASE_API_URL + "/api/Banner/getbanners" getDataByPost(bannerUrl, null, true, NormalSave("bander.txt")) //行业分类 //val positionsUrl = BuildConfig.RELEASE_API_URL + "/api/Position/positionsv2" //getDataByPost(positionsUrl, null, true, "positions.txt", ::onNormalSave) //主界面右上角的消息 val noticeListUrl = BuildConfig.RELEASE_API_URL + "/api/Notice/getnoticelistforuserv2" getDataByPost(noticeListUrl, null, true, NormalSave("noticelist.txt")) val lastnoticeListUrl = BuildConfig.RELEASE_API_URL + "/api/Notice/getlastestnoticeforuserv2" getDataByPost(lastnoticeListUrl, null, true, NormalSave("lastnoticelist.txt")) //社交账号类型 val saccTypesUrl = BuildConfig.RELEASE_API_URL + "/api/EvidenceType/getsocialaccounttypesv2" getDataByPost(saccTypesUrl, null, true, NormalSave("socialaccounttypes.txt")) //支付账号类型 val paymenttypesUrl = BuildConfig.RELEASE_API_URL + "/api/EvidenceType/getpaymenttypesv2" getDataByPost(paymenttypesUrl, null, true, NormalSave("paymenttypes.txt")) //帮助与反馈 val qaListUrl = BuildConfig.RELEASE_API_URL + "/api/QA/getqalistv2" getDataByPost(qaListUrl, null, true, NormalSave("qalist.txt")) //进入警察界面好像是实名认证的时候会自动根据数据库记录判断你是不是警察,是的话,在首页上会显示一个警察专用图标, //点击以后再进入警察专用登陆界面,再次登陆后,才可以打开警察界面,可以进行报案登记什么的. //CaseActivity里用到,CaseActivity由PoliceInfoActivity调用,可能是警察报案登记界面用的? val xccasecategorysUrl = BuildConfig.RELEASE_API_URL + "/api/xc/getxccasecategorysv2" getDataByPost(xccasecategorysUrl, null, true, NormalSave("xccasecategorys.txt")) //默认的诈骗类型数据 val evidenceTypeUrl = BuildConfig.RELEASE_API_URL + "/api/EvidenceType/getevidencetype" getDataByPost(evidenceTypeUrl, null, true, NormalSave("EvidenceType.txt")) val readpointUrl = BuildConfig.RELEASE_API_URL + "/api/home/getreadpointv2" getDataByPost(readpointUrl, null, true, NormalSave("readpoint.txt")) val osaUrl = BuildConfig.RELEASE_API_URL + "/api/OpenScreenAdvertising/get" getDataByPost(osaUrl, null, true, NormalSave("osa.txt")) /* //SnapCardReportActivity里用的,可能是信用卡诈骗的类型 val casecategorysUrl = BuildConfig.RELEASE_API_URL + "/api/DK/getcasecategorys" getDataByGet(casecategorysUrl, true, NormalSave("casecategorys.txt"))*/ } } ================================================ FILE: app/src/main/java/com/demo/antizha/newwork/HookDns.kt ================================================ package com.demo.antizha.newwork import okhttp3.Dns import java.io.ByteArrayInputStream import java.io.IOException import java.io.ObjectInputStream import java.net.InetAddress class HookDns : Dns { //控制将一个服务器地址重定向到我的伪造服务器,用来进行测试 val isHook2Local = false var DnsMap: HashMap = HashMap() init { DnsMap["fzapp.gjfzpt.cn"] = byteArrayOf(192.toByte(), 168.toByte(), 2, 101) DnsMap["oss.gjfzpt.cn"] = byteArrayOf(192.toByte(), 168.toByte(), 2, 101) } @Throws(IOException::class, ClassNotFoundException::class) private fun deserialization(byteData: ByteArray): InetAddress { val byteArrayInputStream = ByteArrayInputStream(byteData) val objectInputStream = ObjectInputStream(byteArrayInputStream) val tobject: Any = objectInputStream.readObject() objectInputStream.close() return tobject as InetAddress } override fun lookup(hostname: String): List { if (isHook2Local && DnsMap.contains(hostname)) { val t_netAddress = InetAddress.getByAddress(hostname, DnsMap[hostname]) var ips: ArrayList = ArrayList() ips.add(t_netAddress) return ips } return Dns.SYSTEM.lookup(hostname) } } ================================================ FILE: app/src/main/java/com/demo/antizha/newwork/HttpGetData.kt ================================================ package com.demo.antizha.newwork import android.os.Handler import android.os.Looper import android.text.TextUtils import com.demo.antizha.interfaces.IApiResult import com.demo.antizha.ui.HiCore import com.demo.antizha.util.LogUtils import com.google.gson.Gson import okhttp3.* import java.io.* import java.security.cert.CertificateException import java.util.concurrent.TimeUnit import java.util.zip.GZIPInputStream import javax.net.ssl.HostnameVerifier import javax.net.ssl.SSLContext import javax.net.ssl.TrustManager import javax.net.ssl.X509TrustManager object UnsafeOkHttpClient { var mHandler = object : Handler(Looper.getMainLooper()) {} val timeOut: Long = 6 val trustAllCerts = arrayOf(object : X509TrustManager { @Throws(CertificateException::class) override fun checkClientTrusted(chain: Array, authType: String) { } @Throws(CertificateException::class) override fun checkServerTrusted(chain: Array, authType: String) { } override fun getAcceptedIssuers(): Array { return arrayOf() } }) fun getBuilder(): OkHttpClient.Builder { //创建不安全的SSL,忽略证书错误,这样就可以用自己的服务器了。 val sslContext = SSLContext.getInstance("SSL") sslContext.init(null, trustAllCerts, java.security.SecureRandom()) // Create an ssl socket factory with our all-trusting manager val sslSocketFactory = sslContext.socketFactory val builder = OkHttpClient.Builder() builder.sslSocketFactory(sslSocketFactory, trustAllCerts[0] as X509TrustManager) val hostnameVerifier = HostnameVerifier { _, _ -> true } builder.hostnameVerifier(hostnameVerifier) return builder } /*观察者模式代码 private fun getObservable(call: Call): Observable { return Observable.create { emitter: ObservableEmitter -> call.enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { LogUtils.debug("getObservable ", "onFailure") emitter.onError(e) } @Throws(IOException::class) override fun onResponse(call: Call, response: Response) { try { LogUtils.debug("getObservable ", "onResponse") //如果不手动设置gzip,让okhttp自动处理,如果返回的数据有问题,调用bytes()的时候会异常 //如果手动设置gzip,如果返回的数据有问题,则在decodeData里会抛出异常 val bodyString = decodeData(response.body()?.bytes(), response.headers()) emitter.onNext(bodyString) emitter.onComplete() } catch (e: IOException) { LogUtils.debug("getObservable ", "onResponse data error") emitter.onError(e) } } }) } } class MiddleSubscriber : Observer { private var iApiResult: IApiResult constructor(iApiResult: IApiResult) { this.iApiResult = iApiResult } override fun onSubscribe(d: Disposable) { } override fun onNext(t: String) { LogUtils.debug("MiddleSubscriber ", "onNext") iApiResult.onSuccess(t) } override fun onError(e: Throwable) { iApiResult.onError() } override fun onComplete() { } } */ fun createCall(request: Request, addHead: Boolean, addGzip: Boolean): Call { val builder = getBuilder() if (addHead) builder.addInterceptor(RequestParamInterceptor(addGzip)) builder.dns(HookDns()).retryOnConnectionFailure(true) .connectTimeout(timeOut, TimeUnit.SECONDS) .readTimeout(timeOut, TimeUnit.SECONDS) .writeTimeout(timeOut, TimeUnit.SECONDS) val client = builder.build() return client.newCall(request) } fun asynchronousCall(call: Call, iApiResult: IApiResult) { call.enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { LogUtils.debug("asynchronousCall ", "onFailure") //如果需要,也应该改成mHandler.post iApiResult.onError() } @Throws(IOException::class) override fun onResponse(call: Call, response: Response) { LogUtils.debug("asynchronousCall ", "onResponse") try { //如果不手动设置gzip,让okhttp自动处理,如果返回的数据有问题,调用bytes()的时候会异常 //如果手动设置gzip,如果返回的数据有问题,则在decodeData里会抛出异常 val bodyString = decodeData(response.body()?.bytes(), response.headers()) mHandler.post(object : Runnable { override fun run() { iApiResult.onSuccess(bodyString) } }) } catch (e: IOException) { LogUtils.debug("asynchronousCall ", "onResponse data error") onFailure(call, e) } } }) } fun callRequest(request: Request, addHead: Boolean, addGzip: Boolean, iApiResult: IApiResult) { val call = createCall(request, addHead, addGzip) asynchronousCall(call, iApiResult) /*观察者模式代码 val observable = getObservable(call) val middleSubscriber = MiddleSubscriber(iApiResult) observable.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(middleSubscriber) */ } fun getDataByGet(url: String, addHead: Boolean, iApiResult: IApiResult) { val requestBuilder = Request.Builder().get().url(url) val request = requestBuilder.build() LogUtils.debug("getDataByGet ", url) callRequest(request, addHead, true, iApiResult) } fun getDataByPost(url: String, bodyMap: HashMap?, addHead: Boolean, iApiResult: IApiResult) { val json = if (bodyMap == null) "{}" else Gson().toJson(bodyMap) val requestBuilder = Request.Builder() .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json)) .url(url) val request = requestBuilder.build() LogUtils.debug("getDataByPost ", url) callRequest(request, addHead, false, iApiResult) } fun getDataByPostSyn(url: String, bodyMap: HashMap?, addHead: Boolean, iApiResult: IApiResult) { try { val json = if (bodyMap == null) "{}" else Gson().toJson(bodyMap) val requestBuilder = Request.Builder() .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json)) .url(url) val request = requestBuilder.build() LogUtils.debug("getDataByPostSyn ", url) val call = createCall(request, false, addHead) //痛步请求 try { val response = call.execute() val bodyString = decodeData(response.body()?.bytes(), response.headers()) iApiResult.onSuccess(bodyString) } catch (e: IOException) { iApiResult.onError() } } catch (e: Exception) { e.printStackTrace() //callBackFunc("") } } } fun bodyIsGzip(array: ByteArray): Boolean { if (array.size < 6) return false if (array[1] != 31.toByte()) return false if (array[2] != 139.toByte()) return false if (array[3] != 8.toByte()) return false return true } @Throws(IOException::class) fun decodeData(data: ByteArray?, headers: Headers): String { var iszip = false val encoding = headers.get("Content-Encoding") if (encoding != null && TextUtils.equals("gzip", encoding)) iszip = true if (iszip != bodyIsGzip(data!!)) { LogUtils.debug("decodeData ", "gzip error") throw IOException() } val bodyString: String if (bodyIsGzip(data)) { var baos = ByteArrayOutputStream() val gzipIn = GZIPInputStream(ByteArrayInputStream(data)) var readByte: Int while (gzipIn.read().also { readByte = it } != -1) baos.write(readByte) bodyString = baos.toString("UTF-8") } else { bodyString = data.toString(charset("UTF-8")) } return bodyString } fun saveBuff2File(data: String, saveFile: String) { val path = HiCore.context.getExternalFilesDir(null)?.path val file = File(path, saveFile) val fileWriter = FileOutputStream(file, false) fileWriter.write(data.toByteArray(charset("UTF_8"))) fileWriter.close() } fun loadBuff4File(readFile: String): String { val path = HiCore.context.getExternalFilesDir(null)?.path val file = File(path, readFile) //file.exists()总是返回false if (!file.canRead()) return "" val inStream = FileInputStream(file) val inputReader = InputStreamReader(inStream, charset("UTF_8")) inputReader.encoding val buff = inputReader.readText() inStream.close() return buff } ================================================ FILE: app/src/main/java/com/demo/antizha/newwork/RequestParamInterceptor.kt ================================================ package com.demo.antizha.newwork import android.text.TextUtils import com.demo.antizha.UserInfoBean import com.demo.antizha.interfaces.IOneClickListener import com.demo.antizha.md.JniHandStamp import com.demo.antizha.ui.HiCore import com.demo.antizha.util.MD5Utils import com.demo.antizha.util.SystemUtils import com.google.gson.Gson import okhttp3.* import okio.Buffer import org.json.JSONException import org.json.JSONObject import java.io.IOException import java.io.UnsupportedEncodingException import java.net.URLEncoder import java.util.* class RequestParamInterceptor : Interceptor { var gzip: Boolean = false constructor(_gzip: Boolean) { gzip = _gzip } private fun encodeHead(str: String): String? { return if (TextUtils.isEmpty(str)) { "" } else try { URLEncoder.encode(str, "UTF-8") } catch (err: UnsupportedEncodingException) { err.printStackTrace() "" } } private fun signStr(): String { val a2: String = MD5Utils.getMd5StringCharLowercase("hicore123") val a3: String = MD5Utils.getMd5StringCharLowercase( ("android/api/file/upload$a2").lowercase(Locale.getDefault()) ) return "android $a3" } private fun setHeader(builder: Request.Builder?) { if (builder != null) { if (gzip) builder.addHeader("Accept-Encoding", "gzip") builder.addHeader("deviceid", UserInfoBean.imei) builder.addHeader("identity", JniHandStamp.identity) builder.addHeader("seqid", JniHandStamp.getSeqID()) if (JniHandStamp.isNeedDelay()) { //通知服务器,重置peer的有效期 builder.addHeader("delay", "1") } else { builder.addHeader("delay", "0") } builder.addHeader("os-version", SystemUtils.getOsVer()) builder.addHeader("os-type", "0") var os_brand = SystemUtils.getBrand() if (os_brand == "google") os_brand = "OnePlus" builder.addHeader("os-brand", os_brand) var os_model = SystemUtils.getModel() var os_model_sub = os_model.substring(0, 4) if (os_model_sub == "sdk_") os_model = "LE2117" builder.addHeader("os-model", os_model) //渠道标记,APK在渠道发布重新打包的时候会修改,比如豌豆荚是huawei,应用宝是yingyongbao builder.addHeader("market", HiCore.app.getChannel()) builder.addHeader("app-version", UserInfoBean.version) builder.addHeader("imei", UserInfoBean.imei) builder.addHeader("app-version-code", UserInfoBean.innerVersion.toString() + "") builder.addHeader("api-version", "164") builder.addHeader("sign", signStr()) builder.addHeader("UM-deviceToken", "") builder.addHeader("nodeid", UserInfoBean.adcode) //RegionConfigHttp.getNodeRegionId() builder.addHeader("nodeCode", UserInfoBean.adcode) //http://api.map.baidu.com/geocoder/v2/?ak=2ae1130ce176b453fb29e59a69b18407&callback=renderOption&output=xml&address=北京市.北京市.东城区&city=北京市 //2.0.1开始,经纬度和地址都发的是空 builder.addHeader("longitude", "0") builder.addHeader("latitude", "0") builder.addHeader("address", "") //token的格式类似如此,但是如果加上一个自己编的,那就会返回错误,如果不写,那某些安全级别低的就访问还能成功 //val s = "Bearer 6v7eoQunKVCNJfY8K2BHVLRsPKVxrSL08l3i.H1ExaHIY0cvFNH1EQM2LiZY7bD9zIsgUwaSlgrSmbB2Hh8Y6vKiK3lS8fP40KLdJ3Weo0VenjprZiXsQsTIlJq4oRKAL8TsBBL4IgcE41pMHUX5JahP2QqGQjkwKankuZtqkpSGtn92Bt71GWaQL3jXwTxnukNDr4FLqAM6Z8OdtWAzznOSgegTF90yhrruEA5Yd8adfaUxWp2FoM96TqFe05LdV0AhSfRxu5KxW4DJMjuwMGcdzeWwSsmyPptpKe5VQVZvftLBkLPVN5xi4ciL47HudeksIPQuMTZYC0txMHLD2HLssS6pWPYvhZJ3c2O2avEsagmjT2g.H1q2zQUsbxW7oieMVAcCH63xEzkXVGvYkhjnrIJEhO5" builder.addHeader("Authorization", UserInfoBean.acctoken) builder.addHeader("policeToken", "") } } @Throws(IOException::class) private fun getParamContent(requestBody: RequestBody): String { val buffer = Buffer() requestBody.writeTo(buffer) return buffer.readUtf8() } //发送的如果是 {"data":"h7Xr14ZaOXw=="}这样的数据,那就把数据解密出来 @Throws(IOException::class) private fun getDecodeParam(request: Request): String { val body = request.body() if (body != null && body !is FormBody && body !is MultipartBody && body.contentLength() > 0) { try { val optString: String = JSONObject(getParamContent(body)).optString("data") if (!TextUtils.isEmpty(optString)) { return JniHandStamp.jni.paramJsonDecode(optString) } } catch (e: JSONException) { e.printStackTrace() } } return "" } private fun infilterRequest(request: Request): Boolean { val httpUrl = request.url().toString() return httpUrl.contains("getalldictionaryv2") || httpUrl.contains("handshark") || httpUrl.contains( "oss-test.gjfzpt.cn") || httpUrl.contains("oss.gjfzpt.cn") } //如果发现peer已经过期,那就需要先更新,然后再发数据 @Synchronized private fun handleRequest(_request: Request, param: String, status: Int): Request { var request = _request val body: RequestBody? = request.body() if (body == null) { return request; } if (infilterRequest(request)) { return request } if (body !is FormBody && body !is MultipartBody) { try { var jSONString = "" val hashMap = HashMap() val newBuilder = request.newBuilder() if (JniHandStamp.expireFail(false) || status == 470) { JniHandStamp.expireFail(true) JniHandStamp.handshareKeySyn(object : IOneClickListener { override fun clickOKBtn() { newBuilder.header("identity", JniHandStamp.identity + "") newBuilder.header("seqid", JniHandStamp.getSeqID()) } }) } if (!TextUtils.isEmpty(param)) { hashMap["data"] = JniHandStamp.jni.paramJsonEncode(param) jSONString = Gson().toJson(hashMap) } request = newBuilder.method(request.method(), RequestBody.create(body.contentType(), jSONString)).build() } catch (unused: Exception) { return request } } return request } @Throws(IOException::class) private fun handleResponse(chain: Interceptor.Chain, request: Request, param: String): Response { val proceed = chain.proceed(request) if (proceed.code() == 470) return chain.proceed(handleRequest(request, param, 470)) else return proceed } @Throws(IOException::class) // okhttp3.Interceptor override fun intercept(chain: Interceptor.Chain): Response { val request: Request = chain.request() val newBuilder: Request.Builder = request.newBuilder() setHeader(newBuilder) if (request.body() is FormBody) { val builder = FormBody.Builder() val formBody = request.body() as FormBody for (i in 0 until formBody.size()) { builder.addEncoded(formBody.encodedName(i), formBody.encodedValue(i)) } newBuilder.method(request.method(), builder.build()) } val build = newBuilder.build() val decodeParam = getDecodeParam(build) return handleResponse(chain, handleRequest(build, decodeParam, 0), decodeParam) //return chain.proceed(newBuilder.build()) } } ================================================ FILE: app/src/main/java/com/demo/antizha/newwork/UpdateUtil.kt ================================================ package com.demo.antizha.newwork import android.content.Context import android.text.TextUtils import android.view.View import android.widget.ImageView import android.widget.TextView import com.demo.antizha.BuildConfig import com.demo.antizha.R import com.demo.antizha.UserInfoBean import com.demo.antizha.interfaces.IApiResult import com.demo.antizha.md.JniHandStamp import com.demo.antizha.newwork.UnsafeOkHttpClient.getDataByPost import com.demo.antizha.ui.BaseDialog import com.demo.antizha.util.LogUtils import com.demo.antizha.util.RegisterBody import com.google.gson.Gson import okhttp3.Headers object UpdateUtil : View.OnClickListener { var mActivity: Context? = null var uppVerDlg: BaseDialog? = null class DownloadInfo { var url: String? = null var isUpdatable = false var fileMD5: String? = null var version: String? = null var innerVersion = 0 var content: String? = null var isForcedVersion = false } class OnGetVersion : IApiResult { var saveFile: String constructor(saveFile: String) { this.saveFile = saveFile } override fun onError() { LogUtils.debug("OnGetVersion Error", "") } override fun onSuccess(data: String) { LogUtils.debug("OnGetVersion Success", data) onGetVersion(data, saveFile) } } class DownloadInfoPackage(val data: DownloadInfo, val code: Int) fun getVerInfo() { val registerBody = RegisterBody() registerBody.imei = UserInfoBean.imei registerBody.innerversion = UserInfoBean.innerVersion.toString() getDataByPost( BuildConfig.RELEASE_API_URL + "/api/AppVersion/checkv2", bodyMap = JniHandStamp.princiHttp(registerBody), addHead = true, OnGetVersion("AppVersion.txt") ) } /*新颁布返回类似信息,无法获得最新版本号*/ /*{"code":2,"msg":"当前版本过低,请前往应用市场下载最新版本"}*/ @Suppress("UNUSED_PARAMETER") fun onGetVersion(data: String, saveFile: String) { val text = JniHandStamp.getSData(data) val ver = Gson().fromJson(text, DownloadInfoPackage::class.java) val oldVer = UserInfoBean.version val currentVer = ver.data.version.toString() if (ver.code == 0) UserInfoBean.setVer(currentVer, ver.data.innerVersion) if (!TextUtils.equals(currentVer, oldVer)) showDialogUpdate(ver.data) saveBuff2File(text, saveFile) } fun showDialogUpdate(downloadInfo: DownloadInfo) { uppVerDlg = BaseDialog(mActivity!!, R.style.base_dialog_style) uppVerDlg!!.setContentView(R.layout.dialog_update) uppVerDlg!!.setGravityLayout(2) uppVerDlg!!.setWidthDialog(-2.0) uppVerDlg!!.setHeightDialog(-2.0) uppVerDlg!!.setCancelable(false) uppVerDlg!!.setCanceledOnTouchOutside(false) uppVerDlg!!.initOnCreate() uppVerDlg!!.show() val tv_title = uppVerDlg!!.findViewById(R.id.update_title) as TextView val tv_content = uppVerDlg!!.findViewById(R.id.update_content) as TextView val tv_update = uppVerDlg!!.findViewById(R.id.update) as TextView val iv_close = uppVerDlg!!.findViewById(R.id.update_close) as ImageView if (downloadInfo.isForcedVersion) { iv_close.setVisibility(View.INVISIBLE) } else { iv_close.setVisibility(View.VISIBLE) } tv_title.setText("v" + downloadInfo.version) tv_content.setText(downloadInfo.content?.replace("\\n", "\n")?.replace(" ", "")) tv_update.setOnClickListener(this) iv_close.setOnClickListener(this) /* Handler(Looper.getMainLooper()).postDelayed({ if (uppVerDlg != null) { uppVerDlg!!.dismiss() uppVerDlg = null DictionaryUtils.getDictionary() } }, 4000) */ } override fun onClick(view: View) { if (uppVerDlg != null) { uppVerDlg!!.dismiss() uppVerDlg = null DictionaryUtils.getDictionary() } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/BaseDialog.kt ================================================ package com.demo.antizha.ui import android.app.Activity import android.app.Dialog import android.content.Context import android.os.Build import android.util.DisplayMetrics import android.view.* open class BaseDialog : Dialog { companion object { const val BOTTOM = 0 const val CENTER = 2 const val TOP = 1 const val WARPHEIGHT = -2.0f const val WARPWIDTH = -2.0f } private var mContext: Context private lateinit var display: Display private lateinit var dm: DisplayMetrics private lateinit var lp: WindowManager.LayoutParams private lateinit var mWindow: Window private lateinit var metrics: WindowMetrics var widthDialog = 0.0F var heightDialog = 0.0F var widthDialogdp = 0.0F var heightDialogdp = 0.0F private var mGravityLayout: Int = 0 constructor(context: Context) : super(context) { mContext = context initWindowState() } constructor(context: Context, resId: Int) : super(context, resId) { mContext = context initWindowState() } @Suppress("DEPRECATION") private fun initWindowState() { mWindow = window!! lp = mWindow.attributes if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { display = context.display!! dm = mContext.resources.displayMetrics metrics = (mContext as Activity).windowManager.currentWindowMetrics } else { val windowManager = (mContext as Activity).windowManager display = windowManager.defaultDisplay dm = DisplayMetrics() display.getMetrics(dm) } } fun dp2px(f2: Float): Int { return (f2 * mContext.resources.displayMetrics.density + 0.5f).toInt() } private val statusBarHeight: Int get() = try { val cls = Class.forName("com.android.internal.R\$dimen") val tfield = cls.getField("status_bar_height") context.resources.getDimensionPixelSize(tfield[cls.newInstance()]!!.toString().toInt()) } catch (e2: Exception) { e2.printStackTrace() 0 } fun getViewById(i2: Int): T { return findViewById(i2) } @Suppress("DEPRECATION") fun initOnCreate() { val layoutParams = lp layoutParams.gravity = mGravityLayout if (widthDialog > 0.0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) layoutParams.width = (metrics.bounds.width().toDouble() * widthDialog).toInt() else layoutParams.width = (display.width * widthDialog).toInt() } else { val f2 = widthDialogdp if (f2 > 0.0f) { layoutParams.width = dp2px(f2) } else if (f2 == -2.0f) { layoutParams.width = -2 } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) layoutParams.width = metrics.bounds.width() else layoutParams.width = display.width } } if (heightDialog > 0.0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) lp.height = (metrics.bounds.height().toDouble() * heightDialog).toInt() else lp.height = (display.height * heightDialog).toInt() } else { val f3 = heightDialogdp if (f3 > 0.0f) { lp.height = dp2px(f3) } else if (f3 == -2.0f) { lp.height = -2 } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) lp.height = metrics.bounds.height() - statusBarHeight else lp.height = display.height - statusBarHeight } } mWindow.attributes = lp } fun setGravityLayout(i2: Int) { if (i2 == 0) { mGravityLayout = 80 } if (1 == i2) { mGravityLayout = 48 } if (2 == i2) { mGravityLayout = 17 } } fun setHeightDialog(d: Double) { heightDialog = d.toFloat() } fun setHeightDialogdp(d: Double) { heightDialogdp = d.toFloat() } fun setWidthDialog(d: Double) { widthDialog = d.toFloat() } fun setWidthDialogdp(d: Double) { widthDialogdp = d.toFloat() } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/DownTimer.kt ================================================ package com.demo.antizha.ui import android.os.Build import android.os.Handler import android.os.Looper import android.os.Message abstract class DownTimer { private var time: Long = 0 private var interval: Long = 0 private var step = 0 private var stoped: Boolean var handler: Handler var runnable: Runnable inner class HandlerC10629a internal constructor(looper: Looper?) : Handler( looper!!) { override fun handleMessage(message: Message) { super.handleMessage(message) if (message.what == 1) { val j = time - interval * step if (j <= 0) { step = 0 val downTimer = this@DownTimer downTimer.handler.removeCallbacks(downTimer.runnable) onTimer() return } onTimeChang(j) updataStep(this@DownTimer) val downTimer2 = this@DownTimer downTimer2.handler.postDelayed(downTimer2.runnable, downTimer2.interval) } } } constructor(time: Long, interval: Long) { this.stoped = false this.handler = HandlerC10629a(Looper.getMainLooper()) this.runnable = Runnable { begin() } this.time = time this.interval = interval this.step = 0 this.stoped = false this.handler.post(runnable) } abstract fun onTimeChang(j: Long) abstract fun onTimer() fun isStoped(): Boolean { return if (Build.VERSION.SDK_INT >= 29) { !handler.hasCallbacks(runnable) } else stoped } fun begin() { handler.sendEmptyMessage(1) } fun reset(time: Long, interval: Long) { this.time = time this.interval = interval this.step = 0 this.stoped = false this.handler.post(this.runnable) } fun stop() { handler.removeCallbacks(runnable) stoped = true } constructor() { stoped = false handler = HandlerC10629a(Looper.getMainLooper()) runnable = Runnable { begin() } } companion object { fun updataStep(downTimer: DownTimer): Int { val i = downTimer.step downTimer.step = i + 1 return i } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/HiCore.kt ================================================ package com.demo.antizha.ui import android.app.Application import android.content.Context import android.content.pm.PackageManager import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.util.TypedValue import android.view.Gravity import com.bumptech.glide.annotation.GlideModule import com.bumptech.glide.module.AppGlideModule import com.hjq.toast.ToastUtils import java.util.* @GlideModule class GlideApp : AppGlideModule() { override fun isManifestParsingEnabled(): Boolean { return false } } class HiCore : Application() { companion object { lateinit var app: HiCore lateinit var context: Application var mLastClickTime: Long = 0 fun getContext(): Context { return context } } class MyToastStyle : com.hjq.toast.style.BlackToastStyle() { override fun getHorizontalPadding(context: Context): Int { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, context.resources.displayMetrics) .toInt() } override fun getVerticalPadding(context: Context): Int { return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14f, context.resources.displayMetrics) .toInt() } override fun getBackgroundDrawable(context: Context): Drawable { val drawable = GradientDrawable() // 设置颜色 drawable.setColor(-0x78000000) // 设置圆角 drawable.cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 30f, context.resources.displayMetrics) return drawable } } override fun onCreate() { super.onCreate() context = this app = this ToastUtils.init(this) ToastUtils.setGravity(Gravity.CENTER) ToastUtils.setStyle(MyToastStyle()) } fun isDouble(): Boolean { val timeInMillis: Long = Calendar.getInstance().timeInMillis val j2: Long = timeInMillis - mLastClickTime if (j2 in 0..800) { return true } mLastClickTime = timeInMillis return false } fun getChannel(): String { return try { app.packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA).metaData.getString("CHANNEL").toString() } catch (e2: Exception) { e2.printStackTrace() "huawei" } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/HiEdittext.kt ================================================ package com.demo.antizha.ui import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import android.view.MotionEvent import android.widget.EditText @SuppressLint("AppCompatCustomView") class HiEdittext : EditText { override fun dispatchTouchEvent(motionEvent: MotionEvent): Boolean { parent.requestDisallowInterceptTouchEvent(true) return super.dispatchTouchEvent(motionEvent) } constructor(context: Context?, attributeSet: AttributeSet?) : super(context, attributeSet) constructor(context: Context?, attributeSet: AttributeSet?, i: Int) : super(context, attributeSet, i) } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/HiWebView.kt ================================================ package com.demo.antizha.ui import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.content.res.Configuration import android.text.TextUtils import android.util.AttributeSet import android.webkit.JavascriptInterface import android.webkit.WebSettings import android.webkit.WebView import com.demo.antizha.OnWebListener import com.demo.antizha.UserInfoBean import com.demo.antizha.ui.activity.BaseActivity import com.demo.antizha.ui.activity.PromosWebDetActivity import com.demo.antizha.util.UrlUtils import com.google.gson.Gson fun getFixedContext(context: Context): Context { return context.createConfigurationContext(Configuration()) } class HiWebView : WebView { private var mActivity: Activity? = null private lateinit var mJsObject: Any private var mOnWebListener: OnWebListener? = null private var mSwipBackLayout: SwipBackLayout? = null constructor(context: Context) : super(getFixedContext(context)) { initWebView(this) } constructor(context: Context, attributeSet: AttributeSet) : super( getFixedContext(context), attributeSet ) { initWebView(this) } constructor( context: Context, attributeSet: AttributeSet, defStyle: Int ) : super(getFixedContext(context), attributeSet, defStyle) { initWebView(this) } fun setListener(activity: Activity?, onWebListener: OnWebListener?) { mActivity = activity!! mOnWebListener = onWebListener!! } fun setSwipLayout(activity: Activity?, swipBackLayout: SwipBackLayout?) { mActivity = activity mSwipBackLayout = swipBackLayout } @SuppressLint("JavascriptInterface") private fun initWebView(webView: WebView) { isClickable = true val settings = webView.settings settings.javaScriptEnabled = true webView.addJavascriptInterface(JsObject(), "appjs") settings.javaScriptCanOpenWindowsAutomatically = true settings.allowFileAccess = false settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING settings.setSupportZoom(false) settings.displayZoomControls = false settings.builtInZoomControls = false settings.useWideViewPort = true settings.setSupportMultipleWindows(true) settings.setGeolocationEnabled(true) settings.loadWithOverviewMode = true settings.domStorageEnabled = true settings.cacheMode = WebSettings.LOAD_DEFAULT settings.databaseEnabled = true settings.blockNetworkImage = false settings.mixedContentMode = 0 settings.textZoom = 100 settings.mediaPlaybackRequiresUserGesture = false } inner class JsObject { @JavascriptInterface fun getHCData(): String { return getH5Data() } @JavascriptInterface fun getPageParams(str: String?) { if (mActivity != null && TextUtils.equals("pageFinish=1", str) && mOnWebListener != null) { mOnWebListener!!.webJsFinish() } } @JavascriptInterface fun getSwpieEvent(str: String?) { if (mActivity != null && mSwipBackLayout != null && mActivity is PromosWebDetActivity) { if (TextUtils.equals(str, "1")) { mSwipBackLayout!!.setInterEvent(true) } else { mSwipBackLayout!!.setInterEvent(false) } } } @JavascriptInterface fun sendWebMsg(str: String?) { if (mActivity != null && mOnWebListener != null && str != null && !TextUtils.isEmpty(str) ) { mOnWebListener!!.shouldIntercept(UrlUtils.string2Param(str)) } } } companion object { fun getH5Data(): String { val hashMap = HashMap() hashMap["deviceid"] = UserInfoBean.imei hashMap["os-version"] = "0" hashMap["market"] = HiCore.app.getChannel() hashMap["app-version"] = UserInfoBean.version hashMap["app-version-code"] = UserInfoBean.innerVersion.toString() hashMap["haveLiuhai"] = BaseActivity.liuhaiHeight.toString() hashMap["userid"] = UserInfoBean.accountId hashMap["pcode"] = UserInfoBean.adcode hashMap["nodeId"] = UserInfoBean.adcode hashMap["nodeCode"] = UserInfoBean.adcode val regions = TextUtils.split(UserInfoBean.region, "\\.") if (regions.size == 3) { hashMap["pname"] = regions[2] hashMap["nodeName"] = regions[2] hashMap["nodeProvince"] = regions[0] } return Gson().toJson(hashMap) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/ProgressDialogBar.kt ================================================ package com.demo.antizha.ui import android.app.Dialog import android.content.Context import android.widget.TextView import com.demo.antizha.R class ProgressDialogBar : Dialog { constructor(context: Context?) : super(context!!) constructor(context: Context?, i: Int) : super(context!!, i) companion object { var progressDialogBar: ProgressDialogBar? = null fun create(context: Context?): ProgressDialogBar? { progressDialogBar = ProgressDialogBar(context, R.style.CustomProgressDialog) progressDialogBar!!.setContentView(R.layout.progress_layout) return progressDialogBar } } fun getDialog(): ProgressDialogBar? { return progressDialogBar } fun setProgress(str: String?) { val textView = progressDialogBar!!.findViewById(R.id.text_progress) as TextView? if (textView != null) { textView.text = str } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/RefreshUIEvent.kt ================================================ package com.demo.antizha.ui class RefreshUIEvent { companion object { public val SELECT_WEB_FRAGMENT = 104 } var msgCode : Int constructor(msg : Int) { msgCode = msg } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/SwipBackLayout.java ================================================ package com.demo.antizha.ui; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.Scroller; import androidx.viewpager.widget.ViewPager; import com.demo.antizha.R; import java.util.LinkedList; import java.util.List; /* loaded from: classes3.dex */ public class SwipBackLayout extends FrameLayout { private View mContentView; private final int O; private int P; private int b0; private int c0; private final Scroller d0; private int width; private boolean f0; private boolean g0; private boolean mEnable; private final Activity mActivity; private final List j0; private final Drawable mShadowLeft; public SwipBackLayout(Context context) { this(context, null); } public static SwipBackLayout create(Activity activity) { return new SwipBackLayout(activity); } private void c() { int scrollX = this.mContentView.getScrollX(); this.d0.startScroll(this.mContentView.getScrollX(), 0, -scrollX, 0, Math.abs(scrollX)); postInvalidate(); } private void d() { int scrollX = this.width + this.mContentView.getScrollX(); this.d0.startScroll(this.mContentView.getScrollX(), 0, (-scrollX) + 1, 0, Math.abs(scrollX)); postInvalidate(); } private void setContentView(View view) { this.mContentView = (View) view.getParent(); } public boolean enable() { return this.mEnable; } @Override // android.view.View public void computeScroll() { if (this.d0.computeScrollOffset()) { this.mContentView.scrollTo(this.d0.getCurrX(), this.d0.getCurrY()); postInvalidate(); if (this.d0.isFinished() && this.g0) { this.mActivity.finish(); } } } @Override // android.view.View, android.view.ViewGroup protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); if (this.mShadowLeft != null && this.mContentView != null) { int left = this.mContentView.getLeft() - this.mShadowLeft.getIntrinsicWidth(); this.mShadowLeft.setBounds(left, this.mContentView.getTop(), this.mContentView.getLeft(), this.mContentView.getBottom()); this.mShadowLeft.draw(canvas); } } @Override // android.view.ViewGroup public boolean onInterceptTouchEvent(MotionEvent motionEvent) { if (this.mEnable) { return false; } ViewPager a2 = a(this.j0, motionEvent); if (a2 != null && a2.getCurrentItem() != 0) { return super.onInterceptTouchEvent(motionEvent); } int action = motionEvent.getAction(); if (action == 0) { int rawX = (int) motionEvent.getRawX(); this.c0 = rawX; this.P = rawX; this.b0 = (int) motionEvent.getRawY(); } else if (action == 2 && ((int) motionEvent.getRawX()) - this.P > this.O && Math.abs(((int) motionEvent.getRawY()) - this.b0) < this.O) { return true; } return super.onInterceptTouchEvent(motionEvent); } @Override // android.widget.FrameLayout, android.view.View, android.view.ViewGroup protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (changed) { this.width = getWidth(); a(this.j0, this); } } @Override // android.view.View public boolean onTouchEvent(MotionEvent motionEvent) { if (this.mEnable) { return false; } int action = motionEvent.getAction(); if (action == 1) { this.f0 = false; if (this.mContentView.getScrollX() <= (-this.width) / 2) { this.g0 = true; d(); } else { c(); this.g0 = false; } } else if (action == 2) { int rawX = (int) motionEvent.getRawX(); int i2 = this.c0 - rawX; this.c0 = rawX; if (rawX - this.P > this.O && Math.abs(((int) motionEvent.getRawY()) - this.b0) < this.O) { this.f0 = true; } if (rawX - this.P >= 0 && this.f0) { this.mContentView.scrollBy(i2, 0); } } return true; } public void setInterEvent(boolean enable) { this.mEnable = enable; } public SwipBackLayout(Context context, AttributeSet attributeSet) { this(context, attributeSet, 0); } public void init() { ViewGroup decor = (ViewGroup) this.mActivity.getWindow().getDecorView(); ViewGroup decorChild = (ViewGroup) decor.getChildAt(0); decor.removeView(decorChild); addView(decorChild); setContentView(decorChild); decor.addView(this); } public SwipBackLayout(Context context, AttributeSet attributeSet, int defStyle) { super(context, attributeSet, defStyle); this.mEnable = false; this.j0 = new LinkedList(); this.mActivity = (Activity) context; this.O = ViewConfiguration.get(context).getScaledTouchSlop(); this.d0 = new Scroller(context); this.mShadowLeft = getResources().getDrawable(R.drawable.swip_left_shadow, null); } private void a(List list, ViewGroup viewGroup) { int childCount = viewGroup.getChildCount(); for (int i = 0; i < childCount; i++) { View childAt = viewGroup.getChildAt(i); if (childAt instanceof ViewPager) { list.add((ViewPager) childAt); } else if (childAt instanceof ViewGroup) { a(list, (ViewGroup) childAt); } } } private ViewPager a(List list, MotionEvent motionEvent) { if (!(list == null || list.size() == 0)) { Rect rect = new Rect(); for (ViewPager viewPager : list) { viewPager.getHitRect(rect); if (rect.contains((int) motionEvent.getX(), (int) motionEvent.getY())) { return viewPager; } } } return null; } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/AboutUsActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.os.Handler import android.os.Looper import android.text.TextUtils import com.demo.antizha.BuildConfig import com.demo.antizha.UserInfoBean import com.demo.antizha.databinding.ActivityAboutUsBinding import com.demo.antizha.newwork.FileUtil import com.hjq.toast.ToastUtils class AboutUsActivity : BaseActivity() { private lateinit var infoBinding: ActivityAboutUsBinding override fun initPage() { infoBinding = ActivityAboutUsBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "关于我们" infoBinding.tvAppVersion.text = "v${UserInfoBean.version}" infoBinding.piTitle.ivBack.setOnClickListener { finish() } infoBinding.checkUpadte.setOnClickListener { showProgressDialog("检测中...", true) if (!TextUtils.isEmpty(UserInfoBean.acctoken)) FileUtil.update() Handler(Looper.getMainLooper()).postDelayed({ hideProgressDialog() ToastUtils.show("已是最新版本") }, 500) } infoBinding.llAgreement.setOnClickListener { val intentInfo = Intent(this, WebActivity::class.java) intentInfo.putExtra(WebActivity.EXTRA_WEB_TITLE, "服务协议") intentInfo.putExtra( WebActivity.EXTRA_WEB_URL, BuildConfig.RELEASE_H5_URL + "/Agreements/clause.html?time=" + System.currentTimeMillis() / 3000 ) startActivity(intentInfo) } infoBinding.llPolicy.setOnClickListener { val intentInfo = Intent(this, WebActivity::class.java) intentInfo.putExtra(WebActivity.EXTRA_WEB_TITLE, "隐私政策") intentInfo.putExtra( WebActivity.EXTRA_WEB_URL, BuildConfig.RELEASE_H5_URL + "/Agreements/policy.html?time=" + System.currentTimeMillis() / 3000 ) startActivity(intentInfo) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/AppActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.content.Intent import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.chad.library.adapter.base.listener.OnItemChildClickListener import com.demo.antizha.R import com.demo.antizha.adapter.AppDeleteAdapter import com.demo.antizha.databinding.ActivityAudioBinding import com.demo.antizha.util.AppUtil import com.demo.antizha.util.AppUtil.AppInfoBean class AppActivity : BaseUploadActivity() { private lateinit var infoBinding: ActivityAudioBinding private var mAppBeans: ArrayList = ArrayList() private var mAppIds: ArrayList = ArrayList() private val mMaxSelectNum = 2 private lateinit var startApp: ActivityResultLauncher private lateinit var mAdapter: AppDeleteAdapter override fun initPage() { infoBinding = ActivityAudioBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "添加APP应用程序" infoBinding.lySelect.tvSelectTip.text = "添加" infoBinding.lyComplete.tvCommitTip.text = "最多可选择${mMaxSelectNum}个APP应用程序" AppUtil.checkPermission(this, true) getIntentData() val lyManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false) infoBinding.recyclerview.layoutManager = lyManager mAdapter = AppDeleteAdapter(R.layout.recyclerview_app_record_select, mAppBeans, mUploadStateList) infoBinding.recyclerview.adapter = mAdapter infoBinding.recyclerview.itemAnimator = null mAdapter.setOnItemChildClickListener(OnItemChildClickListener { adapter, view, position -> val id: Int = view.id if (id == R.id.iv_clear) { mAppBeans.removeAt(position) mAppIds.removeAt(position) mUploadStateList.removeAt(position) adapter.notifyItemRemoved(position) if (mAppBeans.size == 0) infoBinding.lyComplete.btnCommit.text = "确定" } }) initActivityResultLauncher() infoBinding.piTitle.ivBack.setOnClickListener { val intent = Intent() setResult(RESULT_OK, intent) intent.putParcelableArrayListExtra("apps", mAppBeans) finish() } infoBinding.lySelect.llSelect.setOnClickListener { if (!AppUtil.checkPermission(this, true)) return@setOnClickListener val intent = Intent(this, AppSelectedActivity::class.java) intent.putExtra(AppSelectedActivity.SELECT_TYPE, 2) intent.putExtra(AppSelectedActivity.SELECT_CURRENT, mAppBeans.size) intent.putExtra(AppSelectedActivity.SELECT_MAX, mMaxSelectNum) startApp.launch(intent) } } private fun getIntentData() { val list = intent.getParcelableArrayListExtra("apps") if (list != null) { mAppBeans.addAll(list) for (app in mAppBeans) { mAppIds.add(app.id) mUploadStateList.add(UploadStateInfo()) } } if (mAppBeans.size > 0) infoBinding.lyComplete.btnCommit.text = "文件上传" } private fun initActivityResultLauncher() { startApp = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null) return@registerForActivityResult val array: ArrayList = result.data!!.getParcelableArrayListExtra("app") ?: return@registerForActivityResult val count = mAppBeans.size var insertCount = 0 for (app in array) { if (!mAppIds.contains(app.id)) { mAppBeans.add(app) mAppIds.add(app.id) insertCount++ mUploadStateList.add(UploadStateInfo()) } } mAdapter.notifyItemRangeInserted(count, insertCount) if (mAppBeans.size > 0) infoBinding.lyComplete.btnCommit.text = "文件上传" } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/AppSelectedActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Context import android.content.Intent import android.os.Handler import android.os.Looper import android.text.format.Formatter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.* import android.widget.ExpandableListView.OnChildClickListener import android.widget.ExpandableListView.OnGroupClickListener import com.demo.antizha.R import com.demo.antizha.databinding.ActivityAppSelectedBinding import com.demo.antizha.ui.HiCore import com.demo.antizha.util.AppUtil import com.demo.antizha.util.AppUtil.AppInfoBean class AppExSelectedAdapter(val context: Context, private var titles: List, private var appGroups: ArrayList>) : BaseExpandableListAdapter() { private val layout: LayoutInflater = LayoutInflater.from(context) private inner class AppHolder(view: View) { var ivIcon: ImageView = view.findViewById(R.id.app_icon) var tvAppName: TextView = view.findViewById(R.id.tv_app_name) var tvVersion: TextView = view.findViewById(R.id.tv_app_version) var ivCanSelect: ImageView = view.findViewById(R.id.iv_canselect) var ivCantSelect: ImageView = view.findViewById(R.id.iv_cantselect) } fun resetData(titles: List, appGroups: ArrayList>) { this.titles = titles this.appGroups = appGroups notifyDataSetChanged() } override fun getChild(group: Int, idx: Int): Any { return appGroups[group][idx] } override fun getChildId(group: Int, idx: Int): Long { return idx.toLong() } override fun getChildView(group: Int, idx: Int, isLastChild: Boolean, view: View?, parent: ViewGroup): View { var convertView = view val appHolder: AppHolder val appInfoBean = appGroups[group][idx] if (convertView == null) { convertView = layout.inflate(R.layout.recyclerview_app_select, parent, false) appHolder = AppHolder(convertView) convertView.tag = appHolder } else { appHolder = convertView.tag as AppHolder } val appIcon = appInfoBean.appIcon if (appIcon != null) { appHolder.ivIcon.setImageDrawable(appIcon) } appHolder.tvAppName.text = appInfoBean.appName val formatFileSize: String = Formatter.formatFileSize(HiCore.app, appInfoBean.size) appHolder.tvVersion.text = "版本:${appInfoBean.version} | $formatFileSize" when { appInfoBean.size > 209715200 -> { appHolder.ivCanSelect.visibility = View.GONE appHolder.ivCantSelect.visibility = View.VISIBLE } appInfoBean.selected -> { appHolder.ivCanSelect.setImageResource(R.mipmap.checkbox_checked) appHolder.ivCanSelect.visibility = View.VISIBLE appHolder.ivCantSelect.visibility = View.GONE } else -> { appHolder.ivCanSelect.setImageResource(R.mipmap.checkbox_unchecked) appHolder.ivCanSelect.visibility = View.VISIBLE appHolder.ivCantSelect.visibility = View.GONE } } return convertView!! } override fun getChildrenCount(i: Int): Int { return appGroups[i].size } override fun getGroup(i: Int): Any { return titles[i] } override fun getGroupCount(): Int { return titles.size } override fun getGroupId(i: Int): Long { return i.toLong() } override fun getGroupView(group: Int, isExpanded: Boolean, view: View?, viewGroup: ViewGroup): View { var convertView = view if (convertView == null) { convertView = layout.inflate(R.layout.app_select_tip, viewGroup, false) } (convertView!!.findViewById(R.id.tv_lable) as TextView).text = titles[group] return convertView } override fun hasStableIds(): Boolean { return false } override fun isChildSelectable(i: Int, i2: Int): Boolean { return true } } class AppSelectedActivity : BaseActivity() { companion object { const val SELECT_TYPE = "select_type" const val SELECT_MAX = "extra_select_limit" const val SELECT_CURRENT = "extra_select_now" } private lateinit var infoBinding: ActivityAppSelectedBinding private lateinit var appSelectedAdapter: AppExSelectedAdapter private var selectedCount: Int = 0 private var canSelect: Int = 9 private var titles: ArrayList = ArrayList() private val appGroups: ArrayList> = ArrayList() private val apps: ArrayList = ArrayList() private val appSelected: ArrayList = ArrayList() override fun initPage() { infoBinding = ActivityAppSelectedBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "选择APP应用" infoBinding.piTitle.ivRight.visibility = View.GONE selectedCount = intent.getIntExtra(SELECT_CURRENT, 0) val selectMax = intent.getIntExtra(SELECT_MAX, 0) if (selectMax != 0) canSelect = selectMax canSelect -= selectedCount initApps() infoBinding.piTitle.ivBack.setOnClickListener { val intent = Intent() setResult(RESULT_CANCELED, intent) finish() } infoBinding.btnReport.setOnClickListener { val intent = Intent() setResult(RESULT_OK, intent) intent.putParcelableArrayListExtra("app", appSelected) finish() } } private fun initApps() { showProgressDialog("加载中...", true) Handler(Looper.getMainLooper()).postDelayed({ if (!this.isFinishing) { titles.add("未安装安装包") titles.add("已安装应用") appGroups.add(ArrayList()) val appInfos = AppUtil.getAppinfos() for (app in appInfos) app.selected = false appGroups.add(appInfos) apps.addAll(appInfos) initAdapter() hideProgressDialog() } }, 500) } private fun initAdapter() { appSelectedAdapter = AppExSelectedAdapter(this, titles, appGroups) infoBinding.recyclerviewApp.setAdapter(appSelectedAdapter) for (i in titles.indices) { infoBinding.recyclerviewApp.expandGroup(i) } infoBinding.recyclerviewApp.setOnGroupClickListener(OnGroupClick.onGroupClick) infoBinding.recyclerviewApp.setOnChildClickListener(OnChildClick()) } fun selectApp(appInfoBean: AppInfoBean, Adapter: AppExSelectedAdapter) { if (appInfoBean.size > 209715200) { Toast.makeText(this, "200M以上文件不可选择", Toast.LENGTH_SHORT).show() return } if (!appInfoBean.selected) { if (canSelect == 1) { resetSelect() } else if (appSelected.size == canSelect) { Toast.makeText(this, "最多选择" + canSelect + "个", Toast.LENGTH_SHORT).show() return } appSelected.add(appInfoBean) appInfoBean.selected = true } else { appSelected.remove(appInfoBean) appInfoBean.selected = false } Adapter.notifyDataSetChanged() } private fun resetSelect() { for (group in appGroups) { for (app in group) { app.selected = false } } appSelectedAdapter.resetData(titles, appGroups) appSelected.clear() } class OnGroupClick private constructor() : OnGroupClickListener { override fun onGroupClick(expandableListView: ExpandableListView, view: View, i: Int, j: Long): Boolean { return true } companion object { val onGroupClick = OnGroupClick() } } inner class OnChildClick internal constructor() : OnChildClickListener { override fun onChildClick(expandableListView: ExpandableListView, view: View, group: Int, pos: Int, id: Long): Boolean { selectApp(appGroups[group][pos], appSelectedAdapter) return true } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/AudioActivity.kt ================================================ package com.demo.antizha.ui.activity import com.demo.antizha.databinding.ActivityAudioBinding class AudioActivity : BaseActivity() { private lateinit var infoBinding: ActivityAudioBinding override fun initPage() { infoBinding = ActivityAudioBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "添加录音" infoBinding.lySelect.tvSelectTip.text = "添加" infoBinding.lyComplete.tvCommitTip.text = "最多可选择9条录音" infoBinding.piTitle.ivBack.setOnClickListener { finish() } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/BaseActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.content.Intent import android.graphics.Typeface import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.demo.antizha.R import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.ProgressDialogBar import com.demo.antizha.util.NotchUtils import com.demo.antizha.util.SystemUtils.adjustFontScale import qiu.niorgai.StatusBarCompat abstract class BaseActivity : AppCompatActivity() { companion object { var haveLiuhai = false var liuhaiHeight = 0 val activityList: ArrayList = ArrayList() } var mActivity: Activity? = null var typ_ME: Typeface? = null private var mProgressDialogBar: ProgressDialogBar? = null abstract fun initPage() fun removeAllActivity(exception: String): Activity? { var exAct: Activity? = null for (act in activityList) { val actName = act.javaClass.name if (actName != exception) { if (!act.isFinishing) act.finish() } else exAct = act } return exAct } fun findActivity(name: String): Activity? { for (act in activityList) { val actName = act.javaClass.name if (actName == name) return act } return null } open fun isDouble(): Boolean { return HiCore.app.isDouble() } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) //关闭权限后APP会重启,但直接跳到后面的界面,所以在这重新载入 if (null != savedInstanceState) { val intent = Intent(this, MainActivity::class.java) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK startActivity(intent) } mActivity = this typ_ME = Typeface.createFromAsset(assets, "DIN-Medium.otf") adjustFontScale(this) supportActionBar?.hide() setStatusBar() initPage() haveLiuhai = NotchUtils.haveLiuhai(this) liuhaiHeight = NotchUtils.liuhaiHeight(this) activityList.add(this) } override fun onDestroy() { super.onDestroy() activityList.remove(this) } private fun setBlackStatusBar() { StatusBarCompat.setStatusBarColor((this as Activity), resources.getColor(R.color.black, null)) } private fun setWhiteStatusBar() { StatusBarCompat.setStatusBarColor((this as Activity), resources.getColor(R.color.white, null)) } private fun setStatusBar() { setWhiteStatusBar() StatusBarCompat.translucentStatusBar(this, true, true) } open fun showProgressDialog(str: String?, cancelable: Boolean) { if (!isFinishing) { if (mProgressDialogBar == null) { mProgressDialogBar = ProgressDialogBar.create(this) } if (mProgressDialogBar!!.isShowing) { return } mProgressDialogBar!!.setProgress(str) mProgressDialogBar!!.setCanceledOnTouchOutside(false) mProgressDialogBar!!.setCancelable(cancelable) mProgressDialogBar!!.show() } } open fun hideProgressDialog() { if (mProgressDialogBar != null && mProgressDialogBar!!.isShowing) { mProgressDialogBar!!.dismiss() } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/BaseUploadActivity.kt ================================================ package com.demo.antizha.ui.activity import android.widget.TextView import com.demo.antizha.R import com.demo.antizha.ui.HiCore abstract class BaseUploadActivity : BaseActivity() { companion object { private const val UPLOAD_STATE_LOADING = 0 private const val UPLOAD_STATE_UPLOAD = 1 private const val UPLOAD_STATE_SUCCESS = 2 private const val UPLOAD_STATE_FAIL = 3 fun showUpState(textView: TextView, uploadStateInfo: UploadStateInfo) { when (uploadStateInfo.uploadState){ UPLOAD_STATE_LOADING->{ textView.text = "等待上传" textView.setTextColor(HiCore.app.resources.getColor(R.color.colorGray, null)) } UPLOAD_STATE_UPLOAD->{ textView.text = "上传中" textView.setTextColor(HiCore.app.resources.getColor(R.color.black_dark, null)) } UPLOAD_STATE_SUCCESS->{ textView.text = "上传完成" textView.setTextColor(HiCore.app.resources.getColor(R.color.blue, null)) } UPLOAD_STATE_FAIL->{ textView.text = "上传失败" textView.setTextColor(HiCore.app.resources.getColor(R.color.colorRed, null)) } } } } class UploadStateInfo { var fileId: String? = null var fileName: String? = null var filePath: String? = null var fileSize: Long = 0 var isPlayState = false var progress: Long = 0 var total: Long = 0 var uploadState = 0 } var mUploadStateList: ArrayList = ArrayList() } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/CallActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.os.Parcel import android.os.Parcelable import android.os.Parcelable.Creator import android.text.InputFilter import android.text.InputFilter.LengthFilter import android.text.TextUtils import android.text.method.DigitsKeyListener import android.view.View import android.widget.EditText import android.widget.ImageView import com.demo.antizha.R import com.demo.antizha.databinding.ActivityCallBinding class CallBean : Parcelable { var crime_time: String? = null var duration: Long = 0 var isInput = false var isSelect = false var number: String? = null var place: String? = null var suspectInfoID: String? = null var type = 0 constructor() constructor(str: String?, str2: String?, str3: String?, i: Int, z: Boolean) { number = str crime_time = str2 place = str3 type = i isSelect = z isInput = !isSelect } constructor(str: String?, str2: String?, str3: String?, i: Int, z: Boolean, j: Long) { number = str crime_time = str2 place = str3 type = i isSelect = z duration = j isInput = !isSelect } constructor(source: Parcel) { crime_time = source.readString() duration = source.readLong() isInput = source.readInt() > 0 isSelect = source.readInt() > 0 number = source.readString() place = source.readString() suspectInfoID = source.readString() type = source.readInt() } override fun describeContents(): Int { return 0 } override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(crime_time) dest.writeLong(duration) dest.writeInt(if (isInput) 1 else 0) dest.writeInt(if (isSelect) 1 else 0) dest.writeString(number) dest.writeString(place) dest.writeString(suspectInfoID) dest.writeInt(type) } companion object CREATOR : Creator { override fun createFromParcel(parcel: Parcel): CallBean { return CallBean(parcel) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } class CallActivity : BaseActivity() { private lateinit var infoBinding: ActivityCallBinding private var etContents: ArrayList = ArrayList() private var ivClears: ArrayList = ArrayList() private val selectCallBeans: ArrayList = ArrayList() private val inputCallBeans: ArrayList = ArrayList() private val mMaxSelectNum = 20 override fun initPage() { infoBinding = ActivityCallBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "添加诈骗电话" infoBinding.lySelect.tvSelectTip.text = "选择通话记录" infoBinding.lySelect.tvInputTip.text = "手动输入" infoBinding.lyComplete.tvCommitTip.text = "最多可选择${mMaxSelectNum}条举报电话" initData() infoBinding.piTitle.ivBack.setOnClickListener { val intent = Intent() setResult(RESULT_CANCELED, intent) finish() } infoBinding.lyComplete.btnCommit.setOnClickListener { val callBeans = ArrayList() inputCallBeans.clear() val hashSet: HashSet = HashSet() for (i in 0 until etContents.size) { val call = etContents[i].text.toString() if (!TextUtils.isEmpty(call)) { hashSet.add(call) } } for (call in hashSet) { val callBean = CallBean(call, "", "未知", -1, false) callBean.isInput = true inputCallBeans.add(callBean) } callBeans.addAll(selectCallBeans) callBeans.addAll(inputCallBeans) val intent = Intent() intent.putParcelableArrayListExtra("call", callBeans) setResult(RESULT_OK, intent) finish() } infoBinding.lySelect.llSelect.setOnClickListener { //需要权限 } infoBinding.lySelect.llInput.setOnClickListener { if (selectCallBeans.size + infoBinding.llInputPart.childCount < mMaxSelectNum) inputNumber("") } } fun initData() { val list: ArrayList? = try { intent.getParcelableArrayListExtra("call") } catch (e: Exception) { e.printStackTrace() null } val selectLogs = ArrayList() val inputLogs = ArrayList() if (list != null && list.size > 0) { for (callBean in list) { if (callBean.isInput) { inputLogs.add(callBean) } else { selectLogs.add(callBean) } } } if (selectLogs.size > 0) { selectCallBeans.addAll(selectLogs) } if (inputLogs.size > 0) { inputCallBeans.addAll(inputLogs) for (callBean in inputCallBeans) { inputNumber(callBean.number!!) } } } private fun inputNumber(str: String) { val inflate = View.inflate(this, R.layout.recyclerview_url_select, null) val etContent = inflate.findViewById(R.id.et_content) val ivClear = inflate.findViewById(R.id.iv_clear) etContent.hint = "请输入电话号码" etContent.filters = arrayOf(LengthFilter(25)) etContent.keyListener = DigitsKeyListener.getInstance("1234567890+") etContent.inputType = 2 infoBinding.llInputPart.addView(inflate) etContents.add(etContent) ivClears.add(ivClear) if (!TextUtils.isEmpty(str)) { etContent.setText(str) } ivClear.setOnClickListener(object : View.OnClickListener { override fun onClick(view: View) { if (etContents.size == 1) { etContents[0].setText("") return } for ((i, ivclear) in ivClears.withIndex()) { if (ivclear === view) { etContents.removeAt(i) ivClears.removeAt(i) infoBinding.llInputPart.removeViewAt(i) break } } } }) } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/CheckFraudActivity.kt ================================================ package com.demo.antizha.ui.activity import android.annotation.SuppressLint import android.content.Intent import android.os.Handler import android.os.Looper import android.os.Parcel import android.os.Parcelable import android.text.Html import android.text.TextUtils import android.view.View import android.widget.RadioButton import com.demo.antizha.R import com.demo.antizha.databinding.ActivityCheckFraudBinding import com.demo.antizha.interfaces.IEditAfterListener import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.dialog.HiShareDialog import com.demo.antizha.ui.dialog.ShareConfigBean import com.demo.antizha.util.DialogUtils import com.demo.antizha.util.EditUtil import com.hjq.toast.ToastUtils import qiu.niorgai.StatusBarCompat class CheckFraudBean : Parcelable { var bankName: String = "" var content: String = "" var text: String = "" var isCheat = 0 var type = 0 constructor() constructor(source: Parcel) { bankName = source.readString().toString() content = source.readString().toString() text = source.readString().toString() isCheat = source.readInt() type = source.readInt() } override fun describeContents(): Int { return 0 } override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(bankName) dest.writeString(content) dest.writeString(text) dest.writeInt(isCheat) dest.writeInt(type) } companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): CheckFraudBean { return CheckFraudBean(parcel) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } class CheckFraudActivity : BaseActivity() { companion object { var dayCheckCount: IntArray = intArrayOf(1, 1, 1) var weekCheckCount: IntArray = intArrayOf(3, 3, 3) } private lateinit var infoBinding: ActivityCheckFraudBinding private lateinit var onViewClickListener: OnClickListener private val shareBean = ShareConfigBean() private val checkFraudBean = CheckFraudBean() private var model = 0 override fun initPage() { infoBinding = ActivityCheckFraudBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this, true, false) infoBinding.piTitle.tvTitle.text = "风险查询" infoBinding.piTitle.ivRight.setImageResource(R.drawable.iv_share_white) onViewClickListener = OnClickListener() initView() infoBinding.piTitle.ivBack.setOnClickListener { finish() } infoBinding.ivClear.setOnClickListener { infoBinding.etContent.setText("") } infoBinding.piTitle.ivRight.setOnClickListener { if (!TextUtils.isEmpty(shareBean.downloadUrl)) { val shareConfigBean2: ShareConfigBean = this.shareBean val str = shareConfigBean2.downloadUrl shareConfigBean2.downloadUrl = str.replace("{0}", (System.currentTimeMillis() / 3000).toString()) } val mShareDialog = HiShareDialog(this, shareBean, 2) mShareDialog.show() } infoBinding.confirm.setOnClickListener { val obj: String = infoBinding.etContent.text.toString() if (TextUtils.isEmpty(obj)) { ToastUtils.show("查询内容不能为空") return@setOnClickListener } checkFraudBean.content = obj showProgressDialog("查询中...", true) Handler(Looper.getMainLooper()).postDelayed({ hideProgressDialog() if (dayCheckCount[model] == 0) { DialogUtils.showOneClickDialog(this, "单日核验上限为1次,请明天再试", "", "确定", null) } else { dayCheckCount[model] -= 1 weekCheckCount[model] -= 1 refCountTip(model) val intent = Intent(this, CheckFraudResultActivity::class.java) intent.putExtra("checkBean", checkFraudBean) intent.putExtra("shareBean", shareBean) intent.putExtra("checkType", model) startActivity(intent) } }, 1000) } } private fun initView() { infoBinding.rbPay.typeface = typ_ME infoBinding.rbUrl.typeface = typ_ME infoBinding.rbChat.typeface = typ_ME infoBinding.etContent.typeface = typ_ME infoBinding.ivClear.visibility = View.GONE infoBinding.etContent.addTextChangedListener(EditUtil.TextWatcher(EditAfterListener())) infoBinding.rbPay.tag = 0 infoBinding.rbUrl.tag = 1 infoBinding.rbChat.tag = 2 infoBinding.llScan.tag = 1 infoBinding.rbPay.setOnClickListener(onViewClickListener) infoBinding.rbUrl.setOnClickListener(onViewClickListener) infoBinding.rbChat.setOnClickListener(onViewClickListener) infoBinding.llScan.setOnClickListener(onViewClickListener) onViewClickListener.onClick(infoBinding.rbPay) } fun refCountTip(model: Int) { val str = "今日剩余可查询次数" + getColorStr(dayCheckCount[model]) + "次,本周剩余可查询次数" + getColorStr(weekCheckCount[model]) + "次" infoBinding.tvCountTip.text = Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) } private fun changeState(model: Int) { this.model = model refCountTip(model) infoBinding.etContent.setText("") when (model) { 1 -> { radioState(infoBinding.rbUrl, infoBinding.rbPay, infoBinding.rbChat, R.mipmap.ic_fraud_radio_center) infoBinding.etContent.hint = "请输入或粘贴要查询的IP或URL网址" infoBinding.llScan.visibility = View.VISIBLE } 2 -> { radioState(infoBinding.rbChat, infoBinding.rbPay, infoBinding.rbUrl, R.mipmap.ic_fraud_radio_right) infoBinding.etContent.hint = "请输入或粘贴要查询的QQ或微信账号" infoBinding.llScan.visibility = View.GONE } else -> { radioState(infoBinding.rbPay, infoBinding.rbUrl, infoBinding.rbChat, R.mipmap.ic_fraud_radio_left) infoBinding.etContent.hint = "请输入或粘贴要查询的银行卡号或支付账户" infoBinding.llScan.visibility = View.GONE } } } private fun getColorStr(i: Int): String { val sb = StringBuilder() sb.append("") sb.append(i) sb.append("") return sb.toString() } @SuppressLint("UseCompatLoadingForDrawables") private fun radioState(rb1: RadioButton, rb2: RadioButton, rb3: RadioButton, resID: Int) { rb1.background = resources.getDrawable(resID, null) rb1.setTextColor(resources.getColor(R.color.black_dark, null)) rb2.background = null rb2.setTextColor(resources.getColor(R.color.colorWhite, null)) rb3.background = null rb3.setTextColor(resources.getColor(R.color.colorWhite, null)) } inner class EditAfterListener internal constructor() : IEditAfterListener { override fun editLength(length: Int) { if (length > 0) { infoBinding.ivClear.visibility = View.VISIBLE } else { infoBinding.ivClear.visibility = View.GONE } } } inner class OnClickListener : View.OnClickListener { override fun onClick(v: View?) { if (HiCore.app.isDouble()) return when (v?.id) { R.id.ll_scan, R.id.rb_pay, R.id.rb_url, R.id.rb_chat -> { val tag = v.tag!! as Int changeState(tag) } } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/CheckFraudResultActivity.kt ================================================ package com.demo.antizha.ui.activity import android.text.TextUtils import android.view.View import com.demo.antizha.R import com.demo.antizha.databinding.ActivityCheckFraudResultBinding import com.demo.antizha.ui.SwipBackLayout import com.demo.antizha.ui.dialog.HiShareDialog import com.demo.antizha.ui.dialog.ShareConfigBean import qiu.niorgai.StatusBarCompat class CheckFraudResultActivity : BaseActivity() { private lateinit var infoBinding: ActivityCheckFraudResultBinding private var checkType = 0 private var shareBean = ShareConfigBean() private var checkFraudBean = CheckFraudBean() override fun initPage() { infoBinding = ActivityCheckFraudResultBinding.inflate(layoutInflater) setContentView(infoBinding.root) SwipBackLayout(this).init() StatusBarCompat.translucentStatusBar(this, true, true) checkType = intent.getIntExtra("checkType", 0) checkFraudBean = intent.getParcelableExtra("checkBean")!! shareBean = intent.getParcelableExtra("shareBean")!! when (checkType) { 1 -> infoBinding.piTitle.tvTitle.text = "IP网址查询" 2 -> infoBinding.piTitle.tvTitle.text = "QQ/微信查询" else -> infoBinding.piTitle.tvTitle.text = "支付风险查询" } infoBinding.tvType.visibility = View.GONE infoBinding.tvCotent.text = "查询内容:${checkFraudBean.content}" infoBinding.ivPicture.setImageResource(R.mipmap.ic_fraud_safe) infoBinding.tvCheckResult.text = "未知" infoBinding.tvCheckResult.setTextColor( resources.getColor(R.color.fraud_result_color, null)) infoBinding.warnTxt.visibility = View.VISIBLE infoBinding.piTitle.ivBack.setOnClickListener { onBackPressed() } infoBinding.tvShare.setOnClickListener { if (!TextUtils.isEmpty(shareBean.downloadUrl)) { val shareConfigBean2: ShareConfigBean = this.shareBean val str = shareConfigBean2.downloadUrl shareConfigBean2.downloadUrl = str.replace("{0}", (System.currentTimeMillis() / 3000).toString()) } val mShareDialog = HiShareDialog(this, shareBean, 2) mShareDialog.show() } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/CheckIDActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.widget.Toast import com.demo.antizha.databinding.ActivityIdCheckBinding import com.demo.antizha.interfaces.IClickListener import com.demo.antizha.ui.HiCore import com.demo.antizha.util.DialogUtils import qiu.niorgai.StatusBarCompat class CheckIDActivity : BaseActivity(), IClickListener { private lateinit var infoBinding: ActivityIdCheckBinding override fun initPage() { infoBinding = ActivityIdCheckBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this as Activity, true, true) infoBinding.piTitle.tvTitle.text = "身份核实" infoBinding.piTitle.ivBack.setOnClickListener { finish() } infoBinding.btnIdvrfySend.setOnClickListener { val checkID: String = infoBinding.etCheckPhone.text.toString() if (checkID.trim { it <= ' ' }.length < 11) { val toast = Toast.makeText(HiCore.app, "请输入正确手机号~", Toast.LENGTH_SHORT) toast.setGravity(17, 0, 0) toast.show() } else { DialogUtils.showNormalDialog(mActivity, "向该号码发送身份核实请求?", checkID, "取消", "确认发送", this) } } } override fun cancelBtn() { } override fun clickOKBtn() { val toast = Toast.makeText(HiCore.app, "发送成功", Toast.LENGTH_SHORT) toast.setGravity(17, 0, 0) toast.show() } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/EvidenceDiscActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.text.TextUtils import com.demo.antizha.databinding.ActivityEvidenceBinding class EvidenceDiscActivity : BaseActivity() { private lateinit var infoBinding: ActivityEvidenceBinding override fun initPage() { infoBinding = ActivityEvidenceBinding.inflate(layoutInflater) setContentView(infoBinding.root) val szTitle = intent.getStringExtra("title") infoBinding.piTitle.tvTitle.text = szTitle infoBinding.edDescribe.setText(intent.getStringExtra("disc")) if (TextUtils.equals("案情描述", szTitle)) { infoBinding.edDescribe.hint = "请详细描述案件经过(时间、地点、人物、原因、经过、结果)... " } infoBinding.piTitle.ivBack.setOnClickListener { val intent = Intent() setResult(RESULT_CANCELED, intent) finish() } infoBinding.btnCommit.setOnClickListener { val intent = Intent() intent.putExtra("disc", infoBinding.edDescribe.text.toString()) setResult(RESULT_OK, intent) finish() } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/FeedbackDetailActivity.kt ================================================ package com.demo.antizha.ui.activity import android.text.Html import com.demo.antizha.R import com.demo.antizha.databinding.ActivityFeedbackQuestionBinding import com.demo.antizha.util.DialogUtils class FeedbackDetailActivity : BaseActivity() { private lateinit var infoBinding: ActivityFeedbackQuestionBinding private var isClickSolve = false override fun initPage() { infoBinding = ActivityFeedbackQuestionBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "问题详情" infoBinding.tvQuestion.text = intent.getStringExtra("extra_question") infoBinding.tvAnswer.text = intent.getStringExtra("extra_answer") infoBinding.tvGoFeedback.text = Html.fromHtml("还没有解决您的问题?前往意见反馈", Html.FROM_HTML_MODE_LEGACY) infoBinding.piTitle.ivBack.setOnClickListener { finish() } infoBinding.llNotSolve.setOnClickListener { clickSolve(false) } infoBinding.llSolve.setOnClickListener { clickSolve(true) } } private fun clickSolve(solve: Boolean) { if (!isClickSolve) { isClickSolve = true if (solve) { infoBinding.ivSolve.setImageResource(R.mipmap.ic_solve_select) infoBinding.tvSolveTip.setTextColor(resources.getColor(R.color.red_1, null)) } else { infoBinding.ivNotSolve.setImageResource(R.mipmap.ic_not_solve_select) infoBinding.tvNotSolveTip.setTextColor(resources.getColor(R.color.red_1, null)) } DialogUtils.showDialogAutoClose(this, false, 1, "谢谢您的反馈", R.mipmap.ic_white_ok) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/FeedbackHelpActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.nfc.NfcAdapter.EXTRA_ID import android.text.TextUtils import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import com.demo.antizha.R import com.demo.antizha.databinding.ActivityFeedbackHelpBinding import com.demo.antizha.util.AnimUtils import com.demo.antizha.util.Utils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import java.io.InputStreamReader class QABean { var answer: String? = null var createTime: String? = null var description: String? = null var id: String? = null var isShow = 0 var qaClassifyCode = 0 var question: String? = null var sort = 0 var updateTime: String? = null } class QATypeBean { var code = 0 var createTime: String? = null var description: String? = null var id: String? = null var isShow = 0 var qaList: List? = null var sort = 0 var text: String? = null var updateTime: String? = null } class QATypeBeanData(val data: ArrayList, val code: Int) class FeedbackHelpActivity : BaseActivity() { private lateinit var infoBinding: ActivityFeedbackHelpBinding private lateinit var qaTypeBeanData: QATypeBeanData override fun initPage() { infoBinding = ActivityFeedbackHelpBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "反馈与帮助" infoBinding.piTitle.tvRightRed.visibility = View.GONE initQaList() infoBinding.piTitle.ivBack.setOnClickListener { finish() } } private fun initQaList() { val inputStream = Utils.openfile("qalist.txt") qaTypeBeanData = Gson().fromJson(InputStreamReader(inputStream, "UTF-8"), object : TypeToken() {}.type) for ((i, qaType) in qaTypeBeanData.data.withIndex()) { addView(qaType, i == qaTypeBeanData.data.size - 1) } inputStream.close() } @Throws(Exception::class) private fun addView(qATypeBean: QATypeBean, isLast: Boolean) { var viewGroup: ViewGroup? = null val inflate = View.inflate(this, R.layout.item_qa, null) val linearLayout = inflate.findViewById(R.id.ll_type) val tvName = inflate.findViewById(R.id.type_name) val ivTypeArrow = inflate.findViewById(R.id.iv_type_arrow) val tvContent1 = inflate.findViewById(R.id.tv_content_1) val lyQa = inflate.findViewById(R.id.ly_qa) val tvContent = lyQa.findViewById(R.id.tv_content) val lyContentMore = inflate.findViewById(R.id.ly_content_more) val line = inflate.findViewById(R.id.botton_line) if (qATypeBean.qaList != null && qATypeBean.qaList!!.isNotEmpty()) { for ((i, qABean) in qATypeBean.qaList!!.withIndex()) { if (i == 0) { tvContent1.text = qABean.question tvContent1.setOnClickListener(OnQaClickListener(qABean)) } else if (i == 1) { val question = qABean.question if (TextUtils.isEmpty(question)) { lyQa.visibility = View.GONE } else { tvContent.text = question tvContent.setOnClickListener(OnQaClickListener(qABean)) } } else { val lyQaSub = View.inflate(this, R.layout.layout_qa, viewGroup) val tvContentSub = lyQaSub.findViewById(R.id.tv_content) as TextView tvContentSub.text = qABean.question tvContentSub.setOnClickListener(OnQaClickListener(qABean)) lyContentMore.addView(lyQaSub) } viewGroup = null } } tvName.text = qATypeBean.text linearLayout.setOnClickListener(OnQaTypeClickListener(lyContentMore, ivTypeArrow)) if (isLast) { line.visibility = View.INVISIBLE } lyContentMore.visibility = View.VISIBLE infoBinding.llQaContent.addView(inflate) } fun intentDetail(qABean: QABean) { if (!isDouble()) { val intent = Intent(this, FeedbackDetailActivity::class.java) intent.putExtra(EXTRA_ID, qABean.id) intent.putExtra("extra_question", qABean.question) intent.putExtra("extra_answer", qABean.answer) startActivity(intent) } } inner class OnQaClickListener internal constructor(private val qa: QABean) : View.OnClickListener { override fun onClick(view: View) { intentDetail(qa) } } class OnQaTypeClickListener internal constructor( private val lyMore: LinearLayout, private val ivArrow: ImageView) : View.OnClickListener { override fun onClick(view: View) { if (lyMore.visibility == View.GONE) { lyMore.visibility = View.VISIBLE AnimUtils.rotateArrow(ivArrow, false) return } lyMore.visibility = View.GONE AnimUtils.rotateArrow(ivArrow, true) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/LoginActivity.kt ================================================ package com.demo.antizha.ui.activity import android.os.Handler import android.os.Looper import android.text.TextUtils import android.text.method.HideReturnsTransformationMethod import android.text.method.LinkMovementMethod import android.text.method.PasswordTransformationMethod import android.view.View import android.widget.EditText import com.demo.antizha.R import com.demo.antizha.UserInfoBean import com.demo.antizha.databinding.ActivityLoginBinding import com.demo.antizha.interfaces.IEditAfterListener import com.demo.antizha.util.EditUtil.TextWatcher import com.demo.antizha.util.Utils import com.hjq.toast.ToastUtils class LoginActivity : BaseActivity(), IEditAfterListener { private lateinit var infoBinding: ActivityLoginBinding private var pwdIsVisible = false override fun initPage() { infoBinding = ActivityLoginBinding.inflate(layoutInflater) setContentView(infoBinding.root) val number = arrayOf("0", "1", "2", "3", "4", "5", "6", "7", "8", "9") var phoneNum = UserInfoBean.mobileNumber.substring(0, 3) for (i in 0..5) phoneNum += number.random() phoneNum += UserInfoBean.mobileNumber.substring(UserInfoBean.mobileNumber.length - 2) infoBinding.account.setText(phoneNum) val regions = TextUtils.split(UserInfoBean.region, "\\.") infoBinding.tvRegion.text = regions[regions.size - 1] initListener() initClause(false) } private fun initListener() { infoBinding.pwdEye.setOnClickListener(object : View.OnClickListener { override fun onClick(view: View?) { chgPwdEye(view) } }) infoBinding.confirm.setOnClickListener { if (!infoBinding.cbSelect.isChecked) { ToastUtils.show("请先勾选同意协议政策后再登录") return@setOnClickListener } showProgressDialog("登录中...", false) Handler(Looper.getMainLooper()).postDelayed({ hideProgressDialog() val mainActivity = removeAllActivity(MainActivity::class.java.name) if (mainActivity != null) (mainActivity as MainActivity).setCurrentPage(0) }, 500) } setTextChangedListener(infoBinding.account, this) setTextChangedListener(infoBinding.userPwd, this) } fun chgPwdEye(view: View?) { if (pwdIsVisible) { infoBinding.pwdEye.setImageResource(R.mipmap.eye_sel) infoBinding.userPwd.transformationMethod = HideReturnsTransformationMethod.getInstance() } else { infoBinding.pwdEye.setImageResource(R.mipmap.eye_nor) infoBinding.userPwd.transformationMethod = PasswordTransformationMethod.getInstance() } pwdIsVisible = !pwdIsVisible if (!infoBinding.userPwd.isFocused) { infoBinding.userPwd.isFocusable = true infoBinding.userPwd.isFocusableInTouchMode = true infoBinding.userPwd.requestFocus() infoBinding.userPwd.requestFocusFromTouch() } infoBinding.userPwd.setSelection(infoBinding.userPwd.text.toString().length) } override fun editLength(length: Int) { buttonStatus() } private fun buttonStatus() { val acc: String = infoBinding.account.text.toString().trim() if (acc.isNotEmpty()) { infoBinding.ivClear.visibility = View.VISIBLE } else { infoBinding.ivClear.visibility = View.INVISIBLE } val pwd: String = infoBinding.userPwd.text.toString().trim() infoBinding.confirm.isEnabled = !(TextUtils.isEmpty(acc) || acc.length != 11 || TextUtils.isEmpty(pwd) || pwd.length < 6) } override fun onBackPressed() { super.onBackPressed() removeAllActivity("") } private fun setTextChangedListener(editText: EditText, iEditAfterListener: IEditAfterListener?) { editText.addTextChangedListener(TextWatcher(iEditAfterListener!!)) } private fun initClause(newUser: Boolean) { val a: CharSequence = Utils.createSpannableString(this, if (newUser) "新用户登录即完成注册,且表示您已同意\n" else "登录即同意", "和", "", "《服务协议》", "《隐私政策》") infoBinding.clause.movementMethod = LinkMovementMethod.getInstance() infoBinding.clause.text = a } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/MainActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter import com.demo.antizha.Dp2Px import com.demo.antizha.R import com.demo.antizha.databinding.ActivityMainBinding import com.demo.antizha.dp2px import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.RefreshUIEvent import com.demo.antizha.ui.fragment.home.HomeFragment import com.demo.antizha.ui.fragment.mine.MineFragment import com.demo.antizha.ui.fragment.web.WebFragment import com.demo.antizha.ui.view.BottomBar import com.demo.antizha.util.LogUtils import com.google.android.material.bottomnavigation.BottomNavigationView import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import qiu.niorgai.StatusBarCompat class MainActivity : BaseActivity() { private lateinit var binding: ActivityMainBinding private var mTabs = ArrayList() private val mHomeFragment = HomeFragment() private val mWebFragment = WebFragment() private val mMineFragment = MineFragment() companion object { const val SPLASH_TIME: Long = 4000 } private fun initTabIndicators() { binding.bottomBar.initTabs() binding.bottomBar.setCurrentItem(0) } private fun initViewPager() { mTabs.add(mHomeFragment) mTabs.add(mWebFragment) mTabs.add(mMineFragment) binding.viewpager.isUserInputEnabled = false binding.viewpager.offscreenPageLimit = 3 binding.viewpager.setAdapter(object : FragmentStateAdapter(this@MainActivity) { override fun getItemCount(): Int = mTabs.size override fun createFragment(position: Int): Fragment = mTabs[position] }) StatusBarCompat.translucentStatusBar(this, true, true) binding.bottomBar.setOnClickItemMenu(object : BottomBar.OnClickItemMenu { override fun onClickItem(nowPosition: Int, position: Int) { onItemMenuClick(nowPosition, position) } }) } fun onItemMenuClick(nowPosition: Int, position: Int) { if (nowPosition == 0) { StatusBarCompat.translucentStatusBar(this, true, true) binding.viewpager.setCurrentItem(0, false) } else if (nowPosition == 1) { binding.viewpager.setCurrentItem(1, false) StatusBarCompat.translucentStatusBar(this, true, true) } else if (nowPosition == 2) { binding.viewpager.setCurrentItem(2, false) StatusBarCompat.translucentStatusBar(this, true, false) } } override fun initPage() { dp2px = Dp2Px(HiCore.context) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) initViewPager() initTabIndicators() EventBus.getDefault().register(this) } override fun onResume() { super.onResume() } override fun onDestroy() { super.onDestroy() EventBus.getDefault().unregister(this) } private fun intentHome() { val intent = Intent("android.intent.action.MAIN") intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND) intent.addCategory("android.intent.category.HOME") startActivity(intent) } override fun onBackPressed() { if (binding.viewpager.currentItem != 1) { intentHome() } else if (!this.mWebFragment.goBack()) { intentHome() } } fun setCurrentPage(i: Int) { binding.bottomBar.setCurrentItem(i) } @Subscribe(threadMode = ThreadMode.MAIN) fun onMessageEvent(event: RefreshUIEvent) { when (event.msgCode) { RefreshUIEvent.SELECT_WEB_FRAGMENT -> { setCurrentPage(1) } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/MinePersonalActivity.kt ================================================ package com.demo.antizha.ui.activity //个人信息页窗口 import android.app.Activity import android.content.Intent import android.text.TextUtils import android.view.View import com.demo.antizha.R import com.demo.antizha.UserInfoBean import com.demo.antizha.databinding.ActivityMinePersonalBinding import qiu.niorgai.StatusBarCompat //AddressBean class MinePersonalActivity : BaseActivity(), View.OnClickListener { private lateinit var infoBinding: ActivityMinePersonalBinding override fun initPage() { infoBinding = ActivityMinePersonalBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this as Activity, true, true) infoBinding.piTitle.tvTitle.text = "个人信息" infoBinding.tvIdfineVar.setOnClickListener(this) infoBinding.llIdfineVar.setOnClickListener(this) infoBinding.userName.setOnClickListener(this) infoBinding.userID.setOnClickListener(this) infoBinding.area.setOnClickListener(this) infoBinding.areaDetail.setOnClickListener(this) infoBinding.piTitle.ivBack.setOnClickListener { finish() } } override fun onResume() { super.onResume() onSuccRequest() } private fun onSuccRequest() { infoBinding.tvProgress.text = "已完善${UserInfoBean.perfectProgress}%" infoBinding.pbProgress.progress = UserInfoBean.perfectProgress if (!TextUtils.isEmpty(UserInfoBean.name) && !TextUtils.isEmpty(UserInfoBean.id)) { infoBinding.tvIdfineVar.visibility = View.GONE infoBinding.llIdfineVar.visibility = View.VISIBLE infoBinding.userName.visibility = View.VISIBLE } else { infoBinding.tvIdfineVar.visibility = View.VISIBLE infoBinding.llIdfineVar.visibility = View.GONE infoBinding.userName.visibility = View.GONE } if (!TextUtils.isEmpty(UserInfoBean.name)) { infoBinding.userName.text = UserInfoBean.name } else { infoBinding.userName.text = "" } if (!TextUtils.isEmpty(UserInfoBean.id)) { infoBinding.userID.text = "${UserInfoBean.id[0]}****************${UserInfoBean.id[1]}" } else { infoBinding.userID.text = "" } infoBinding.area.text = UserInfoBean.region.replace(".", "") /* 2023 10 01 说地址不再隐藏中间部分 var areaDetail = "" if (UserInfoBean.addr.length > 2) areaDetail = "${UserInfoBean.addr[0]}" + "*".repeat(UserInfoBean.addr.length - 2) + "${UserInfoBean.addr[UserInfoBean.addr.length - 1]}" infoBinding.areaDetail.text = areaDetail */ infoBinding.areaDetail.text = UserInfoBean.addr infoBinding.regArea.text = infoBinding.area.text //professionName行业信息已经不填了,但是这边还在判断是否填写,应该是程序员弄错了,所以导致一直提示再完善 if (!TextUtils.isEmpty(UserInfoBean.name) && !TextUtils.isEmpty(UserInfoBean.id) && !TextUtils.isEmpty(UserInfoBean.region) && !TextUtils.isEmpty(UserInfoBean.addr) && !TextUtils.isEmpty(UserInfoBean.professionName) ) { infoBinding.llTopCointips.setVisibility(View.GONE); } } override fun onClick(view: View) { when (view.id) { R.id.tv_idfine_var, R.id.user_name, R.id.ll_idfine_var, R.id.user_ID -> { val intent = Intent(this, PersonalInfoAddActivity::class.java) intent.putExtra("from_page_type", PersonalInfoAddActivity.pageBase) startActivity(intent) } R.id.area -> { val intent = Intent(this, PersonalInfoAddActivity::class.java) intent.putExtra("from_page_type", PersonalInfoAddActivity.pageArea) startActivity(intent) } R.id.area_detail -> { val intent = Intent(this, PersonalInfoAddActivity::class.java) intent.putExtra("from_page_type", PersonalInfoAddActivity.pageAreaDetail) startActivity(intent) } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/NoteDetailActivity.kt ================================================ package com.demo.antizha.ui.activity import android.text.Html import android.text.Html.FROM_HTML_MODE_LEGACY import android.text.method.ScrollingMovementMethod import android.view.MotionEvent import android.view.View import com.demo.antizha.adapter.NoteListBean import com.demo.antizha.databinding.ActivityNoteDetailBinding import com.demo.antizha.ui.SwipBackLayout import qiu.niorgai.StatusBarCompat class NoteDetailActivity : BaseActivity() { private lateinit var infoBinding: ActivityNoteDetailBinding private lateinit var swipBackLayout: SwipBackLayout private lateinit var noteInfo: NoteListBean override fun initPage() { infoBinding = ActivityNoteDetailBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this, true, true) swipBackLayout = SwipBackLayout(this) swipBackLayout.init() infoBinding.piTitle.tvTitle.text = "公告详情" initView() infoBinding.piTitle.ivBack.setOnClickListener { onBackPressed() } } private fun initView() { noteInfo = intent.getParcelableExtra("from_page_bean")!! infoBinding.time.text = noteInfo.vaildStartTime infoBinding.title.text = Html.fromHtml(noteInfo.title, FROM_HTML_MODE_LEGACY) infoBinding.content.text = Html.fromHtml(noteInfo.content, FROM_HTML_MODE_LEGACY) infoBinding.content.movementMethod = ScrollingMovementMethod() infoBinding.content.setOnTouchListener(OnTouch.onTouch) } class OnTouch internal constructor() : View.OnTouchListener { override fun onTouch(view: View?, motionEvent: MotionEvent?): Boolean { return true } companion object { val onTouch = OnTouch() } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/NoteListActivity.kt ================================================ package com.demo.antizha.ui.activity import android.annotation.SuppressLint import android.os.Handler import android.os.Looper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.demo.antizha.R import com.demo.antizha.adapter.NoteListAdapte import com.demo.antizha.adapter.NoteListBean import com.demo.antizha.databinding.ActivityNoteListBinding import com.demo.antizha.ui.SwipBackLayout import com.demo.antizha.util.Utils import com.google.gson.Gson import com.scwang.smartrefresh.layout.header.ClassicsHeader import com.scwang.smartrefresh.layout.api.RefreshLayout import com.scwang.smartrefresh.layout.listener.OnRefreshListener import qiu.niorgai.StatusBarCompat import java.io.InputStreamReader class NoteListBeanData(val data: ArrayList, val code: Int) class NoteListActivity : BaseActivity() { private lateinit var infoBinding: ActivityNoteListBinding private lateinit var swipBackLayout: SwipBackLayout private var noteList: ArrayList = ArrayList() private lateinit var mAdapter: NoteListAdapte override fun initPage() { infoBinding = ActivityNoteListBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this, true, true) swipBackLayout = SwipBackLayout(this) swipBackLayout.init() infoBinding.piTitle.tvTitle.text = "公告" infoBinding.lyNodata.ivImg.setImageResource(R.drawable.iv_no_feed_list) infoBinding.lyNodata.tvTip.text = "暂无数据" mAdapter = NoteListAdapte(this, noteList) val lyManager = LinearLayoutManager(mActivity, RecyclerView.VERTICAL, false) infoBinding.recyclerview.layoutManager = lyManager infoBinding.recyclerview.adapter = mAdapter infoBinding.swipeRefresh.setRefreshHeader(ClassicsHeader(this)) infoBinding.swipeRefresh.setEnableLoadMore(false) infoBinding.swipeRefresh.setOnRefreshListener(OnRefresh()) infoBinding.swipeRefresh.autoRefresh() infoBinding.piTitle.ivBack.setOnClickListener { onBackPressed() } } inner class OnRefresh internal constructor() : OnRefreshListener { @SuppressLint("NotifyDataSetChanged") override fun onRefresh(refreshLayout: RefreshLayout) { Handler(Looper.getMainLooper()).postDelayed({ val inputStream = Utils.openfile("noticelist.txt") val noteListData = Gson().fromJson(InputStreamReader(inputStream, "UTF-8"), NoteListBeanData::class.java) infoBinding.swipeRefresh.finishRefresh() if (noteListData.code != 0) return@postDelayed noteList.clear() noteList.addAll(noteListData.data) mAdapter.notifyDataSetChanged() inputStream.close() }, 2000) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/OneKeyScreenRecordActivity.kt ================================================ package com.demo.antizha.ui.activity import android.view.View import android.widget.RadioGroup import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.demo.antizha.R import com.demo.antizha.databinding.ActivityOneKeyScreenRecordBinding import qiu.niorgai.StatusBarCompat class OneKeyScreenRecordActivity : BaseActivity() { private lateinit var infoBinding: ActivityOneKeyScreenRecordBinding override fun initPage() { infoBinding = ActivityOneKeyScreenRecordBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this, true, false) infoBinding.piTitle.tvTitle.text = "音频录制" infoBinding.piTitle.tvTitle.typeface = typ_ME infoBinding.recyclerview.layoutManager = LinearLayoutManager(this, RecyclerView.HORIZONTAL, false) infoBinding.chronometer.visibility = View.INVISIBLE infoBinding.rgMediaType.setOnCheckedChangeListener(OnCheckedChangeListener()) infoBinding.piTitle.ivBack.setOnClickListener { finish() } } fun onMediaIsVideo() { infoBinding.ivAudioRecord.visibility = View.GONE infoBinding.ivVideoRecord.visibility = View.VISIBLE infoBinding.video.isChecked = true infoBinding.audio.isChecked = false } fun onMediaIsAudio() { infoBinding.ivAudioRecord.visibility = View.VISIBLE infoBinding.ivVideoRecord.visibility = View.GONE infoBinding.audio.isChecked = true infoBinding.video.isChecked = false } inner class OnCheckedChangeListener internal constructor() : RadioGroup.OnCheckedChangeListener { override fun onCheckedChanged(radioGroup: RadioGroup, ResId: Int) { if (ResId == R.id.video) { onMediaIsVideo() } else if (ResId == R.id.audio) { onMediaIsAudio() } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/PersonalInfoAddActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.app.AlertDialog import android.os.Handler import android.os.Looper import android.provider.Settings import android.text.InputType import android.text.TextUtils import android.view.View import android.view.ViewGroup import android.widget.EditText import android.widget.Toast import cn.qqtheme.framework.entity.City import cn.qqtheme.framework.entity.County import cn.qqtheme.framework.entity.Province import com.demo.antizha.BuildConfig import com.demo.antizha.UserInfoBean import com.demo.antizha.databinding.ActivityPersonaInfolBinding import com.demo.antizha.util.* import com.demo.antizha.util.NotchUtils.dp2px import com.hjq.toast.ToastUtils import qiu.niorgai.StatusBarCompat import java.text.SimpleDateFormat import java.util.* import java.util.regex.Pattern class PersonalInfoAddActivity : BaseActivity() { companion object { const val pageBase = "Base" const val pageArea = "Area" const val pageAreaDetail = "AreaDetail" //前,后字符数,一共字符数,星号数,总长 val etSet = arrayOf(arrayOf(1, 1, 2, 16, 18), arrayOf(3, 2, 5, 6, 11)) } private var pageType: String = "" private var adcode: String = "" private var provinces: ArrayList = ArrayList() private lateinit var infoBinding: ActivityPersonaInfolBinding inner class AddressListener : AddressBean.HiAddressListener() { override fun onAddressPicked(province: Province?, city: City?, county: County?) { infoBinding.etArea.text = "${province?.name}.${city?.name}.${county?.name}" if (county != null) { adcode = county.areaId } } } /*AddressPicker新版本代码 override fun onAddressPicked( province: ProvinceEntity?, city: CityEntity?, county: CountyEntity? ) { personaInfolBinding.etArea.text = "${province?.name}.${city?.name}.${county?.name}" if (county != null) { adcode = county.code } } */ override fun initPage() { infoBinding = ActivityPersonaInfolBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this as Activity, true, false) pageType = intent.getStringExtra("from_page_type").toString() infoBinding.etIdNum.tag = 0 infoBinding.etPhoneNum.tag = 1 initPages() infoBinding.piTitle.ivBack.setOnClickListener { finish() } infoBinding.etArea.setOnClickListener { /* val picker = AddressPicker(this) picker.setAddressMode(AddressMode.PROVINCE_CITY_COUNTY) picker.setOnAddressPickedListener(this) picker.cancelView.setTextColor(ContextCompat.getColor(this, R.color.colorGray)) picker.okView.setTextColor(ContextCompat.getColor(this, R.color.black)) picker.topLineView.setBackgroundColor(ContextCompat.getColor(this, R.color.colorBlue1)) val wheelLayout: LinkageWheelLayout = picker.wheelLayout val colorGray: Int = ContextCompat.getColor(this, R.color.colorGray) wheelLayout.firstWheelView.selectedTextColor = colorGray wheelLayout.secondWheelView.selectedTextColor = colorGray wheelLayout.thirdWheelView.selectedTextColor = colorGray wheelLayout.firstWheelView.indicatorColor = colorGray wheelLayout.secondWheelView.indicatorColor = colorGray wheelLayout.thirdWheelView.indicatorColor = colorGray wheelLayout.firstWheelView.layoutParams = LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 0.25F) wheelLayout.secondWheelView.layoutParams = LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 0.5F) wheelLayout.thirdWheelView.layoutParams = LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 0.25F) val region: String = personaInfolBinding.etArea.text.toString() if (!TextUtils.isEmpty(region)) { val regions = TextUtils.split(region, "\\.") if (regions.size == 3) { picker.setDefaultValue(regions[0], regions[1], regions[2]) } } picker.show() */ val picker = AddressBean.createAddressPicker( this, infoBinding.etArea.text.toString(), false, AddressListener() ) picker.show() } infoBinding.etAccountNum.setOnClickListener { if (infoBinding.etAccountNum.text.toString().isEmpty()) { val builder = AlertDialog.Builder(this) builder.setTitle("关于账号ID") builder.setMessage( "必须先使用官方软件注册一个账号,然后在手机的/data/data/com.hicorenational.antifraud/shared_prefs/note_national.xml" + "中找到类似提示的字符串,当然这些可以在虚拟机中执行,如果在手机里操作的话,你还得有root权限,当然你也可以选择不填,只是部分功能会受限," + "你也可以随机生成一个,某些功能可能也能用" ) builder.setPositiveButton("确定") { _, _ -> infoBinding.etAccountNum.inputType = InputType.TYPE_CLASS_TEXT } builder.setNegativeButton("取消") { _, _ -> } builder.setNeutralButton("随机生成") { _, _ -> var account = "" val strtemplate = "1111aaaa-aaaa-aaaa-aaaa-aaaa11111111" val numMap = "1234567890" val hexMap = "1234567890abcdefabcdef" for (element in strtemplate) { when (element) { '1' -> account += numMap[(numMap.indices).random()] 'a' -> account += hexMap[(hexMap.indices).random()] '-' -> account += "-" } } infoBinding.etAccountNum.setText(account) } builder.show() } } infoBinding.btnClearpermiss.setOnClickListener { SpUtils.setValue(SpUtils.primissAuto, false) SpUtils.setValue(SpUtils.primissPower, false) SpUtils.setValue(SpUtils.primissLock, false) var isClosed = AppUtil.checkPermission(this, false) if (isClosed) isClosed = PictureUtil.checkPermission(this, false) //if (isClosed) // isClosed = "检测下一个" if (isClosed) ToastUtils.show("权限已经全部关闭") } val editFocusChangeListener = OnEditFocusChangeListener() infoBinding.etIdNum.onFocusChangeListener = editFocusChangeListener infoBinding.etPhoneNum.onFocusChangeListener = editFocusChangeListener infoBinding.btnConfirm.setOnClickListener { when (pageType) { pageBase -> { val name: String = infoBinding.etName.text.toString() val id: String = editCompleteToSimplify(infoBinding.etIdNum, false) val mobileNumber: String = editCompleteToSimplify(infoBinding.etPhoneNum, false) if (!TextUtils.isEmpty(id) && !stringIsUserID(id) && id.length != 2) { Toast.makeText(this@PersonalInfoAddActivity, "身份证格式不对", Toast.LENGTH_SHORT) .show() return@setOnClickListener } if (!TextUtils.isEmpty(mobileNumber) && !stringIsMobileNumber(mobileNumber) && mobileNumber.length != 5) { Toast.makeText(this@PersonalInfoAddActivity, "电话格式不对", Toast.LENGTH_SHORT) .show() return@setOnClickListener } val accountId: String = infoBinding.etAccountNum.text.toString() var changed = false if (name != UserInfoBean.name || id != UserInfoBean.id || mobileNumber != UserInfoBean.mobileNumber) { UserInfoBean.name = name UserInfoBean.id = id UserInfoBean.mobileNumber = mobileNumber changed = true } if (accountId != UserInfoBean.accountId) { UserInfoBean.accountId = accountId changed = true } val appVersion: String = infoBinding.etAppVersion.text.toString() if (appVersion != UserInfoBean.version) { UserInfoBean.version = appVersion changed = true } val imei = Settings.System.getString( applicationContext?.contentResolver, Settings.Secure.ANDROID_ID ) val crcimei = AESUtil.byteArray2HexStr(CRC64.digest(imei.toByteArray()).bytes) val useorigimei = infoBinding.sbOriginalimei.isChecked if (useorigimei && imei != UserInfoBean.imei) { UserInfoBean.imei = imei UserInfoBean.useorigimei = useorigimei changed = true } if (!useorigimei && crcimei != UserInfoBean.imei) { UserInfoBean.imei = crcimei UserInfoBean.useorigimei = useorigimei changed = true } if (changed) UserInfoBean.commit() } pageArea -> { val region: String = infoBinding.etArea.text.toString() if (region != UserInfoBean.region) { UserInfoBean.region = region UserInfoBean.adcode = adcode UserInfoBean.commit() } } pageAreaDetail -> { val address: String = infoBinding.etAddress.text.toString() if (address != UserInfoBean.addr) { UserInfoBean.addr = address UserInfoBean.commit() } } } finish() } } private fun stringIsEmail(str: String): Boolean { return Pattern.compile("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$").matcher(str) .matches() } private fun stringIsUserID(str: String): Boolean { return Pattern.compile("^[1-6][0-9X]$").matcher(str).matches() } private fun stringIsMobileNumber(str: String): Boolean { return Pattern.compile("^1[0-9]{4}$").matcher(str).matches() } private fun editSimplifyToComplete(v: View, resetText: Boolean): String { val tag = v.tag as Int var str = (v as EditText).text.toString() if (str.length == etSet[tag][2]) { str = str.substring( 0, etSet[tag][0] ) + "*".repeat(etSet[tag][3]) + str.substring(str.length - etSet[tag][1]) if (resetText) v.setText(str) } return str } private fun editCompleteToSimplify(v: View, resetText: Boolean): String { val tag = v.tag as Int var str = (v as EditText).text.toString() if (str.length == etSet[tag][4]) { str = str.substring(0, etSet[tag][0]) + str.substring(str.length - etSet[tag][1]) if (resetText) v.setText(str) } return str } inner class OnEditFocusChangeListener : View.OnFocusChangeListener { override fun onFocusChange(v: View?, hasFocus: Boolean) { if (hasFocus) editCompleteToSimplify(v!!, true) else editSimplifyToComplete(v!!, true) } } private fun initPages() { when (pageType) { pageBase -> { infoBinding.piTitle.tvTitle.text = "基础信息" infoBinding.clBaseCont.visibility = View.VISIBLE infoBinding.etName.setText(UserInfoBean.name) infoBinding.etIdNum.setText(UserInfoBean.id) editSimplifyToComplete(infoBinding.etIdNum, true) infoBinding.etPhoneNum.setText(UserInfoBean.mobileNumber) editSimplifyToComplete(infoBinding.etPhoneNum, true) infoBinding.etAccountNum.setText(UserInfoBean.accountId) infoBinding.etAppVersion.setText(UserInfoBean.version) infoBinding.sbOriginalimei.isChecked = UserInfoBean.useorigimei val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) infoBinding.tvApktime.text = "编译时间 ${sdf.format(Date(BuildConfig.BUILD_TIME))}" if (TextUtils.isEmpty(UserInfoBean.accountId)) infoBinding.etAccountNum.inputType = InputType.TYPE_NULL val params: ViewGroup.MarginLayoutParams = infoBinding.btnConfirm.layoutParams as ViewGroup.MarginLayoutParams params.topMargin = dp2px(350F) infoBinding.btnConfirm.layoutParams = params infoBinding.btnConfirm.requestLayout() } pageArea -> { infoBinding.piTitle.tvTitle.text = "地址" infoBinding.clAreaCont.visibility = View.VISIBLE infoBinding.etArea.text = UserInfoBean.region if (provinces.size == 0) Handler(Looper.getMainLooper()).postDelayed({ provinces = AddressBean.getProvince() }, 10) } pageAreaDetail -> { infoBinding.piTitle.tvTitle.text = "详细地址" infoBinding.clAreaDetailContent.visibility = View.VISIBLE infoBinding.etAddress.setText(UserInfoBean.addr) } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/PictureActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.text.TextUtils import androidx.recyclerview.widget.GridLayoutManager import com.chad.library.adapter.base.listener.OnItemChildClickListener import com.demo.antizha.R import com.demo.antizha.adapter.PictureSelectAdapter import com.demo.antizha.databinding.ActivityPictureBinding import com.demo.antizha.util.PictureUtil import com.luck.picture.lib.entity.LocalMedia import com.luck.picture.lib.listener.OnResultCallbackListener class PictureActivity : BaseUploadActivity() { private lateinit var infoBinding: ActivityPictureBinding private lateinit var mAdapter: PictureSelectAdapter private val mLocalMedia: ArrayList = ArrayList() private var previewPosition = -1 private val mMaxSelectNum = 6 override fun initPage() { infoBinding = ActivityPictureBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "添加图片" infoBinding.lyComplete.tvCommitTip.text = "最多可选择${mMaxSelectNum}张图片" mLocalMedia.add("") getIntentData() infoBinding.recyclerview.layoutManager = GridLayoutManager(this, 3) mUploadStateList.add(UploadStateInfo()) mAdapter = PictureSelectAdapter(R.layout.recyclerview_picture, mLocalMedia, PictureSelectAdapter.stylePicture, mMaxSelectNum, mUploadStateList) infoBinding.recyclerview.adapter = mAdapter infoBinding.recyclerview.itemAnimator = null mAdapter.setOnItemChildClickListener(OnItemChildClickListener { adapter, view, position -> val id: Int = view.id if (id == R.id.iv_clear) { removeMedia(position) adapter.notifyItemRemoved(position) if (mLocalMedia.size == 1) infoBinding.lyComplete.btnCommit.text = "确定" } else if (id == R.id.picture_foot) { if (PictureUtil.checkPermission(this, true)) { selectImage() } } else if (id == R.id.picture_select) { val intent = Intent(this, PreviewPictureActivity::class.java) val medias = ArrayList() medias.addAll(mLocalMedia) if (TextUtils.isEmpty(mLocalMedia.last())) medias.removeAt(medias.size - 1) intent.putStringArrayListExtra(PreviewPictureActivity.EXTRA_PIC, medias) intent.putExtra(PreviewPictureActivity.EXTRA_POSITION, position) startActivity(intent) } }) infoBinding.piTitle.ivBack.setOnClickListener { onBackPressed() } } override fun onBackPressed() { val intent = Intent() setResult(RESULT_OK, intent) val medias = ArrayList() medias.addAll(mLocalMedia) if (TextUtils.isEmpty(mLocalMedia.last())) medias.removeAt(medias.size - 1) intent.putStringArrayListExtra("pics", medias) super.onBackPressed() } private fun getIntentData() { val list = intent.getStringArrayListExtra("pics") if (list != null) { for (media in list) addMedia(media) } if (mLocalMedia.size > 1) infoBinding.lyComplete.btnCommit.text = "文件上传" } fun addMedia(path: String) { for (media in mLocalMedia) if (media == path) return //最后是个空的,填进去 if (TextUtils.isEmpty(mLocalMedia.last())) mLocalMedia[mLocalMedia.size - 1] = path //已经满了,就不加空了 if (mLocalMedia.size >= mMaxSelectNum) return mLocalMedia.add("") mUploadStateList.add(UploadStateInfo()) } private fun removeMedia(pos: Int) { mLocalMedia.removeAt(pos) mUploadStateList.removeAt(pos) if (!TextUtils.isEmpty(mLocalMedia.last())) { mLocalMedia.add("") mUploadStateList.add(UploadStateInfo()) } } private fun selectImage() { var mediaSize = mLocalMedia.size if (TextUtils.isEmpty(mLocalMedia.last())) mediaSize -= 1 val model = PictureUtil.getImageSelectModel(this, false, 200.0F, mMaxSelectNum - mediaSize) model.forResult(object : OnResultCallbackListener { override fun onCancel() { } override fun onResult(result: List?) { if (result == null) return for (media in result) { if (media != null) { addMedia(media.path) } } mAdapter.notifyDataSetChanged() if (mLocalMedia.size > 1) infoBinding.lyComplete.btnCommit.text = "文件上传" } }) } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/PreviewPictureActivity.kt ================================================ package com.demo.antizha.ui.activity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.viewpager.widget.PagerAdapter import com.demo.antizha.R import com.demo.antizha.databinding.DialogPreviewPictureBinding import com.demo.antizha.util.GlideEngine import com.luck.picture.lib.photoview.PhotoView import qiu.niorgai.StatusBarCompat class PreviewPictureActivity : BaseActivity() { companion object { const val EXTRA_PIC = "extra_pic" const val EXTRA_POSITION = "extra_position" } private lateinit var infoBinding: DialogPreviewPictureBinding private var preViews: ArrayList = ArrayList() private var medias: ArrayList = ArrayList() override fun initPage() { overridePendingTransition(R.anim.picture_anim_enter, R.anim.picture_anim_fade_in) infoBinding = DialogPreviewPictureBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "预览" StatusBarCompat.translucentStatusBar(this, true, false) getIntentData() infoBinding.piTitle.ivBack.setOnClickListener { finish() } } override fun onBackPressed() { super.onBackPressed() overridePendingTransition(R.anim.picture_anim_fade_in, R.anim.picture_anim_exit) } private fun getIntentData() { val list: ArrayList? = intent.getStringArrayListExtra(EXTRA_PIC) val pos = intent.getIntExtra(EXTRA_POSITION, 0) if (list == null) return for (path in list) { preViews.add(LayoutInflater.from(this) .inflate(R.layout.pic_preview, null as ViewGroup?)) } medias.addAll(list) infoBinding.viewPager.adapter = PreviewPagerAdapter(preViews) infoBinding.viewPager.currentItem = pos } inner class PreviewPagerAdapter(private val list: List) : PagerAdapter() { override fun destroyItem(viewGroup: ViewGroup, i: Int, obj: Any) { viewGroup.removeView(list[i]) } override fun getCount(): Int { return list.size } override fun instantiateItem(viewGroup: ViewGroup, i: Int): Any { val view = list[i] val glideEngine = GlideEngine.createGlideEngine() val ppa = this@PreviewPictureActivity glideEngine.loadImage(ppa, ppa.medias[i], view.findViewById(R.id.preview_image)) viewGroup.addView(view) return view } override fun isViewFromObject(view: View, obj: Any): Boolean { return view === obj } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/PromosWebDetActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.content.Intent import android.os.Handler import android.os.Looper import android.os.Message import android.text.TextUtils import android.view.View import android.webkit.* import android.widget.ProgressBar import com.demo.antizha.OnWebListener import com.demo.antizha.R import com.demo.antizha.databinding.ActivityPromWebDetBinding import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.HiWebView import com.demo.antizha.ui.SwipBackLayout import com.demo.antizha.util.Parameters import qiu.niorgai.StatusBarCompat import java.util.concurrent.atomic.AtomicReference class PromosWebDetActivity : BaseActivity() { private lateinit var promosWebDetBinding: ActivityPromWebDetBinding private lateinit var mHandler: Handler private lateinit var swipBackLayout: SwipBackLayout private var isVideo = false private var mArticleId: String = "" override fun initPage() { promosWebDetBinding = ActivityPromWebDetBinding.inflate(layoutInflater) setContentView(promosWebDetBinding.root) promosWebDetBinding.piTitle.ivBack.setOnClickListener { if (!HiCore.app.isDouble()) finish() } promosWebDetBinding.piNetworkNo.llNetworkNo.setOnClickListener { if (!HiCore.app.isDouble()) { promosWebDetBinding.webview.reload() promosWebDetBinding.webview.visibility = View.VISIBLE promosWebDetBinding.piNetworkNo.llNetworkNo.visibility = View.GONE } } mHandler = object : Handler(Looper.getMainLooper()) { override fun handleMessage(message: Message) { super.handleMessage(message) if (!isFinishing) { when (message.what) { 6 -> { promosWebDetBinding.piTitle.rlTitle.visibility = View.GONE promosWebDetBinding.llToReport.visibility = View.GONE if (isVideo) { promosWebDetBinding.flTitWhite.visibility = View.GONE promosWebDetBinding.tvHelp.visibility = View.VISIBLE StatusBarCompat.translucentStatusBar(this@PromosWebDetActivity, true, false) return } StatusBarCompat.translucentStatusBar(this@PromosWebDetActivity, true, false) } 7 -> { promosWebDetBinding.llToReport.visibility = View.VISIBLE if (isVideo) { promosWebDetBinding.piTitle.rlTitle.visibility = View.GONE promosWebDetBinding.flTitWhite.visibility = View.VISIBLE promosWebDetBinding.tvHelp.visibility = View.VISIBLE StatusBarCompat.translucentStatusBar(this@PromosWebDetActivity, true, false) return } promosWebDetBinding.piTitle.rlTitle.visibility = View.VISIBLE StatusBarCompat.translucentStatusBar(this@PromosWebDetActivity, true, true) } } } } } loadWeb() } override fun onBackPressed() { if (!promosWebDetBinding.webview.canGoBack()) { super.onBackPressed() } promosWebDetBinding.webview.goBack() } private fun loadWeb() { swipBackLayout = SwipBackLayout.create(mActivity) swipBackLayout.init() promosWebDetBinding.webview.setSwipLayout(this, swipBackLayout) promosWebDetBinding.piTitle.ivRight.setBackgroundResource(R.drawable.iv_share_dot) mArticleId = intent.getStringExtra("extra_web_id").toString() val stringExtra = intent.getStringExtra("extra_web_url") val stringExtra2 = intent.getStringExtra("extra_web_title") val intExtra = intent.getStringExtra("extra_web_enter")?.toInt() ?: 0 promosWebDetBinding.piTitle.tvTitle.text = stringExtra2 initWebView(promosWebDetBinding.webview) promosWebDetBinding.webview.loadUrl("$stringExtra#app=1") if (stringExtra!!.contains("shareVideo")) { isVideo = true promosWebDetBinding.piTitle.rlTitle.visibility = View.GONE promosWebDetBinding.flTitWhite.visibility = View.VISIBLE promosWebDetBinding.tvHelp.visibility = View.VISIBLE StatusBarCompat.translucentStatusBar(this as Activity, true, false) } else { promosWebDetBinding.piTitle.rlTitle.visibility = View.VISIBLE promosWebDetBinding.flTitWhite.visibility = View.GONE StatusBarCompat.translucentStatusBar(this as Activity, true, true) } if (intExtra == 3) { promosWebDetBinding.piTitle.ivRight.visibility = View.GONE promosWebDetBinding.llToReport.visibility = View.GONE } } private fun initWebView(myWebView: HiWebView) { myWebView.setListener(this, PromosWebListener()) myWebView.webChromeClient = PromosWebChromeClient() myWebView.webViewClient = PromosWebViewClient() } fun sendWebMsg(parameters: Parameters) { if (!parameters.isEmpty) { try { val id: String = parameters.value("id") val url: String = parameters.value("url") val charSequence: String = promosWebDetBinding.piTitle.tvTitle.text.toString() if (!TextUtils.isEmpty(url)) { val intent = Intent(mActivity, PromosWebDetActivity::class.java) intent.putExtra("extra_web_title", charSequence) intent.putExtra("extra_web_url", url) intent.putExtra("extra_web_id", id) intent.putExtra("extra_web_enter", 3) startActivity(intent) } val isOnlyFullScreen: String = parameters.value("isOnlyFullScreen") val isFullScreen: String = parameters.value("isfullScreen") when { TextUtils.equals("yes", isFullScreen) -> { mHandler.sendEmptyMessage(6) } TextUtils.equals("no", isFullScreen) -> { mHandler.sendEmptyMessage(7) } TextUtils.equals("yes", isOnlyFullScreen) -> { mHandler.sendEmptyMessage(6) } TextUtils.equals("no", isOnlyFullScreen) -> { mHandler.sendEmptyMessage(7) } } } catch (unused: Exception) { } } } inner class PromosWebListener internal constructor() : OnWebListener { override fun shouldIntercept(aVar: Parameters?) { aVar?.let { sendWebMsg(it) } } override fun webJsFinish() {} } inner class PromosWebChromeClient internal constructor() : WebChromeClient() { override fun onProgressChanged(webView: WebView?, progress: Int) { val progressBar: ProgressBar = promosWebDetBinding.progressBar if (progress == 100) { progressBar.visibility = View.GONE return } progressBar.visibility = View.VISIBLE promosWebDetBinding.progressBar.progress = progress } override fun onReceivedTitle(webView: WebView?, str: String?) { super.onReceivedTitle(webView, str) } } inner class PromosWebViewClient internal constructor() : WebViewClient() { override fun onPageFinished(webView: WebView?, str: String?) { super.onPageFinished(webView, str) } //void onReceivedError(WebView view, int errorCode, String description, String failingUrl) //官方用的是上面这个接口,但是这个接口已经被废弃了,不知道是不是因为这个,导致了它不会显示NetworkNo //https://www.it1352.com/1853198.html //请注意,与弃用的回调版本不同,新的 任何资源(iframe,图片等)的版本都会被调用,而不仅仅是 用于主页 //好像真的是这个原因。 override fun onReceivedError(webView: WebView, request: WebResourceRequest, error: WebResourceError) { super.onReceivedError(webView, request, error) if (request.isForMainFrame()) { //判断只有主页错误,才显示NetworkNo,内部的其他错误则忽略 promosWebDetBinding.piNetworkNo.llNetworkNo.visibility = View.VISIBLE promosWebDetBinding.webview.visibility = View.GONE } } override fun shouldInterceptRequest(webView: WebView?, webResourceRequest: WebResourceRequest): WebResourceResponse? { webResourceRequest.url.toString() return super.shouldInterceptRequest(webView, webResourceRequest) } override fun shouldOverrideUrlLoading(webView: WebView?, webResourceRequest: WebResourceRequest): Boolean { val atomicReference = AtomicReference() atomicReference.set(webResourceRequest.url.path) return super.shouldOverrideUrlLoading(webView, webResourceRequest) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/ReportNewActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.content.Intent import android.os.Handler import android.os.Looper import android.text.Html import android.text.Html.FROM_HTML_MODE_LEGACY import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.widget.ImageView import android.widget.TextView import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import cn.qqtheme.framework.entity.City import cn.qqtheme.framework.entity.County import cn.qqtheme.framework.entity.Province import com.bumptech.glide.Glide import com.demo.antizha.R import com.demo.antizha.adapter.SmsBean import com.demo.antizha.adapter.SocialAccBean import com.demo.antizha.databinding.ActivityReportNewBinding import com.demo.antizha.interfaces.IClickListener import com.demo.antizha.ui.HiCore import com.demo.antizha.util.AddressBean import com.demo.antizha.util.AppUtil import com.demo.antizha.util.DialogUtils class ReportNewActivity : BaseActivity() { private lateinit var infoBinding: ActivityReportNewBinding private var provinces: ArrayList = ArrayList() private var duperyType: Int = 0 private var apps: ArrayList = ArrayList() private var urls: ArrayList = ArrayList() private var calls: ArrayList = ArrayList() private var smss: ArrayList = ArrayList() private var socialAccounts: ArrayList = ArrayList() private var dealAccounts: ArrayList = ArrayList() private var pics: ArrayList = ArrayList() private lateinit var startDuperyType: ActivityResultLauncher private lateinit var startCaseDescribe: ActivityResultLauncher private lateinit var startApp: ActivityResultLauncher private lateinit var startPic: ActivityResultLauncher private lateinit var startCall: ActivityResultLauncher private lateinit var startSms: ActivityResultLauncher private lateinit var startUrl: ActivityResultLauncher private lateinit var startContact: ActivityResultLauncher private lateinit var startDeal: ActivityResultLauncher override fun initPage() { DialogUtils.showOneTimeDialog(this, 3, "110", getString(R.string.report_time_tips), "", "我知道了", null) infoBinding = ActivityReportNewBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "我要举报" infoBinding.tvNumTip.text = Html.fromHtml("今日剩余可举报次数2次", FROM_HTML_MODE_LEGACY) //直接调用好像会让界面卡一下,所以先压入事件循环,让界面先显示出来 Handler(Looper.getMainLooper()).postDelayed({ provinces = AddressBean.getProvince() }, 10) infoBinding.piTitle.ivBack.setOnClickListener { onBackPressed() } initActivityResultLauncher() infoBinding.tvDuperyType.setOnClickListener { val intent = Intent(this, TagFlowLayoutActivity::class.java) intent.putExtra("int_tag_name", duperyType) startDuperyType.launch(intent) } infoBinding.region.setOnClickListener { val picker = AddressBean.createAddressPicker(this, "", true, AddressListener()) picker.show() } infoBinding.etCaseDescribe.setOnClickListener { val intent = Intent(mActivity, EvidenceDiscActivity::class.java) intent.putExtra("disc", infoBinding.etCaseDescribe.text.toString()) intent.putExtra("title", "举报描述") startCaseDescribe.launch(intent) } infoBinding.lyCall.tvUploadCall.setOnClickListener { val intent = Intent(this, CallActivity::class.java) intent.putParcelableArrayListExtra("call", calls) startCall.launch(intent) } infoBinding.lySms.tvUploadSms.setOnClickListener { val intent = Intent(this, SmsActivity::class.java) intent.putParcelableArrayListExtra("sms", smss) startSms.launch(intent) } infoBinding.lyApp.tvUploadApp.setOnClickListener { val intent = Intent(this, AppActivity::class.java) intent.putParcelableArrayListExtra("apps", apps) startApp.launch(intent) } infoBinding.lyPicture.tvUploadPicture.setOnClickListener { val intent = Intent(this, PictureActivity::class.java) intent.putStringArrayListExtra("pics", pics) startPic.launch(intent) } infoBinding.lyAudio.tvUploadAudio.setOnClickListener { val intent = Intent(this, AudioActivity::class.java) startActivity(intent) } infoBinding.lyUrl.tvUploadUrl.setOnClickListener { val intent = Intent(this, WebsiteActivity::class.java) intent.putStringArrayListExtra("url", urls) startUrl.launch(intent) } infoBinding.lyContact.tvSocial.setOnClickListener { val intent = Intent(this, SocialAccountActivity::class.java) intent.putParcelableArrayListExtra("accounts", socialAccounts) startContact.launch(intent) } infoBinding.lyDeal.tvTrad.setOnClickListener { val intent = Intent(this, TradAccountActivity::class.java) intent.putParcelableArrayListExtra("accounts", dealAccounts) startDeal.launch(intent) } } override fun onBackPressed() { var showSaveWarn = false if (duperyType != 0) showSaveWarn = true if (!TextUtils.isEmpty(infoBinding.etCaseDescribe.text.toString())) showSaveWarn = true if (!TextUtils.isEmpty(infoBinding.region.text)) showSaveWarn = true if (apps.size > 0) showSaveWarn = true if (urls.size > 0) showSaveWarn = true if (smss.size > 0) showSaveWarn = true if (calls.size > 0) showSaveWarn = true if (socialAccounts.size > 0) showSaveWarn = true if (dealAccounts.size > 0) showSaveWarn = true if (pics.size > 0) showSaveWarn = true if (showSaveWarn) DialogUtils.showBtTitleDialog( this, "将此次编辑保留", "", "不保留", "保留", R.color._353536, -1, true, SaveRecordListener() ) else finish() } private fun initActivityResultLauncher() { startDuperyType = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null || result.data!!.extras == null) return@registerForActivityResult val tagString = result.data!!.extras!!.getString("tagString") val tagId = result.data!!.extras!!.getInt("tagId") if (tagId != 0) { duperyType = tagId infoBinding.tvDuperyType.text = tagString } } startCaseDescribe = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null || result.data!!.extras == null) return@registerForActivityResult val disc = result.data!!.extras!!.getString("disc") if (disc != null) infoBinding.etCaseDescribe.text = disc } startCall = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null) return@registerForActivityResult val array: java.util.ArrayList = result.data!!.getParcelableArrayListExtra("call") ?: return@registerForActivityResult calls = array if (calls.size == 0) infoBinding.lyCall.tvUploadCall.text = "" else infoBinding.lyCall.tvUploadCall.text = "${calls.size}个" } startSms = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null) return@registerForActivityResult val array: java.util.ArrayList = result.data!!.getParcelableArrayListExtra("sms") ?: return@registerForActivityResult smss = array if (smss.size == 0) infoBinding.lySms.tvUploadSms.text = "" else infoBinding.lySms.tvUploadSms.text = "${smss.size}个" } startApp = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null) return@registerForActivityResult val array = result.data!!.getParcelableArrayListExtra("apps") ?: return@registerForActivityResult apps = array if (apps.size == 0) { infoBinding.lyApp.tvUploadApp.text = "" infoBinding.lyApp.flAppBg.setBackgroundResource(R.drawable.white_corner) } else { infoBinding.lyApp.tvUploadApp.text = "${apps.size}个" infoBinding.lyApp.flAppBg.setBackgroundResource(R.drawable.red_corner) } infoBinding.lyApp.llApp.removeAllViews() for ((i, app) in apps.withIndex()) { val inflate: View = LayoutInflater.from(this) .inflate(R.layout.pic_item_view, infoBinding.lyApp.llApp, false) val ivIcon = inflate.findViewById(R.id.imageview) val tvMore = inflate.findViewById(R.id.tvDot) if (i > 2) { tvMore.visibility = View.VISIBLE ivIcon.visibility = View.GONE infoBinding.lyApp.llApp.addView(inflate) break } if (app.appIcon != null) { ivIcon.setImageDrawable(app.appIcon) } tvMore.visibility = View.GONE ivIcon.visibility = View.VISIBLE infoBinding.lyApp.llApp.addView(inflate) } } startPic = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null) return@registerForActivityResult val array = result.data!!.getStringArrayListExtra("pics") ?: return@registerForActivityResult pics = array if (pics.size == 0) { infoBinding.lyPicture.tvUploadPicture.text = "" } else { infoBinding.lyPicture.tvUploadPicture.text = "${pics.size}个" } infoBinding.lyPicture.llPic.removeAllViews() for ((i, pic) in pics.withIndex()) { val inflate: View = LayoutInflater.from(this) .inflate(R.layout.pic_item_view, infoBinding.lyPicture.llPic, false) val ivIcon = inflate.findViewById(R.id.imageview) val tvMore = inflate.findViewById(R.id.tvDot) if (i > 2) { tvMore.visibility = View.VISIBLE ivIcon.visibility = View.GONE infoBinding.lyPicture.llPic.addView(inflate) break } Glide.with(HiCore.context).load(pic).into(ivIcon) tvMore.visibility = View.GONE ivIcon.visibility = View.VISIBLE infoBinding.lyPicture.llPic.addView(inflate) } } startUrl = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null) return@registerForActivityResult val array = result.data!!.getStringArrayListExtra("url") ?: return@registerForActivityResult urls = array if (urls.size == 0) infoBinding.lyUrl.tvUploadUrl.text = "" else infoBinding.lyUrl.tvUploadUrl.text = "${urls.size}个" } startContact = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null) return@registerForActivityResult val array = result.data!!.getParcelableArrayListExtra("accounts") ?: return@registerForActivityResult socialAccounts = array if (socialAccounts.size == 0) infoBinding.lyContact.tvSocial.text = "" else infoBinding.lyContact.tvSocial.text = "${socialAccounts.size}个" } startDeal = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null) return@registerForActivityResult val array = result.data!!.getParcelableArrayListExtra("accounts") ?: return@registerForActivityResult dealAccounts = array if (dealAccounts.size == 0) infoBinding.lyDeal.tvTrad.text = "" else infoBinding.lyDeal.tvTrad.text = "${dealAccounts.size}个" } } inner class AddressListener : AddressBean.HiAddressListener() { override fun onAddressPicked(province: Province?, city: City?, county: County?) { if (province == null || city == null || county == null) infoBinding.region.text = "" else infoBinding.region.text = "${province.name}.${city.name}.${county.name}" } override fun onClear() { infoBinding.region.text = "" } } inner class SaveRecordListener : IClickListener { override fun cancelBtn() { finish() } override fun clickOKBtn() { //往上层提交 finish() } } //诈骗类型窗口TagFlowLaoutActivity //https://fzapp.gjfzpt.cn/hicore/api/EvidenceType通用诈骗类型 //https://fzapp.gjfzpt.cn/hicore/api/DK/getcasecategorys断卡诈骗类型? //https://fzapp.gjfzpt.cn/hicore/api/xc/getxccasecategorys } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/ReporterAidActivity.kt ================================================ package com.demo.antizha.ui.activity import com.demo.antizha.databinding.ActivityAidReportBinding class ReporterAidActivity:BaseActivity() { private lateinit var infoBinding: ActivityAidReportBinding override fun initPage() { infoBinding = ActivityAidReportBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "报案助手" infoBinding.piTitle.ivBack.setOnClickListener { finish() } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/SettingActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.os.Handler import android.os.Looper import com.demo.antizha.databinding.ActivitySettingBinding import com.demo.antizha.interfaces.IClickListener import com.demo.antizha.util.DataCleanManager import com.demo.antizha.util.DialogUtils class SettingActivity : BaseActivity() { private lateinit var infoBinding: ActivitySettingBinding override fun initPage() { infoBinding = ActivitySettingBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "设置" infoBinding.switchShowCheck.isChecked = false infoBinding.switchShowPush.isChecked = true infoBinding.cacheNum.text = DataCleanManager.getCheckSize(this) infoBinding.piTitle.ivBack.setOnClickListener { finish() } infoBinding.logoutBtn.setOnClickListener { DialogUtils.showBtTitleDialog(mActivity, "您确认要退出登录吗?", "", "确定", "取消", -1, -1, true, LogoutListener()) } infoBinding.rlCacheCalean.setOnClickListener { infoBinding.cacheNum.text = "0KB" } } inner class LogoutListener : IClickListener { override fun cancelBtn() { showProgressDialog("退出中...", false) Handler(Looper.getMainLooper()).postDelayed({ hideProgressDialog() startActivity(Intent(this@SettingActivity, LoginActivity::class.java)) }, 100) } override fun clickOKBtn() { } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/SmsActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.content.Intent import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.chad.library.adapter.base.listener.OnItemChildClickListener import com.demo.antizha.R import com.demo.antizha.adapter.SmsBean import com.demo.antizha.adapter.SmsDeleteAdapter import com.demo.antizha.databinding.ActivityCallBinding import com.hjq.toast.ToastUtils class SmsActivity : BaseActivity() { companion object{ const val MAX_COUNT = 20 } private lateinit var infoBinding: ActivityCallBinding private val smss: ArrayList = ArrayList() private lateinit var smsDeleteAdapter: SmsDeleteAdapter private lateinit var startEdit: ActivityResultLauncher override fun initPage() { infoBinding = ActivityCallBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "添加诈骗短信" infoBinding.lySelect.tvSelectTip.text = "选择短信" infoBinding.lySelect.tvInputTip.text = "手动输入" infoBinding.lyComplete.tvCommitTip.text = "最多可选择${MAX_COUNT}条短信" initActivityResultLauncher() getIntentData() val lym = LinearLayoutManager(this, RecyclerView.VERTICAL, false) infoBinding.recyclerview.layoutManager = lym smsDeleteAdapter = SmsDeleteAdapter(R.layout.recyclerview_sms_record_select, smss) infoBinding.recyclerview.adapter = smsDeleteAdapter infoBinding.recyclerview.itemAnimator = null smsDeleteAdapter.setOnItemChildClickListener(OnItemChildClickListener { adapter, view, position -> val id: Int = view.id if (id == R.id.iv_clear) { smss.removeAt(position) adapter.notifyItemRemoved(position) } else if (id == R.id.iv_edit){ val smsBean = smss[position] if (smsBean.isInput) { smsBean.index = position val intent = Intent(this, SmsAddActivity::class.java) intent.putExtra("sms", smsBean) startEdit.launch(intent) } } }) infoBinding.piTitle.ivBack.setOnClickListener { onBackPressed() } infoBinding.lyComplete.btnCommit.setOnClickListener { onBackPressed() } infoBinding.lySelect.llInput.setOnClickListener { if (smss.size == MAX_COUNT) { ToastUtils.show("最多可选择" + MAX_COUNT + "条短信") return@setOnClickListener } val intent = Intent(this, SmsAddActivity::class.java) intent.putExtra("sms", SmsBean()) startEdit.launch(intent) } } override fun onBackPressed() { val intent = Intent() setResult(RESULT_OK, intent) intent.putParcelableArrayListExtra("sms", smss) super.onBackPressed() } private fun getIntentData() { val list = intent.getParcelableArrayListExtra("sms") if (list != null) { smss.addAll(list) } } private fun initActivityResultLauncher() { startEdit = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null || result.data!!.extras == null) return@registerForActivityResult val sms = result.data!!.extras!!.getParcelable("sms") if (sms != null) { if (sms.index == -1) { smss.add(sms) smsDeleteAdapter.notifyItemInserted(smss.size - 1) } else { smss[sms.index] = sms smsDeleteAdapter.notifyItemChanged(sms.index) } } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/SmsAddActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.text.TextUtils import com.demo.antizha.adapter.SmsBean import com.demo.antizha.databinding.ActivityCallAddBinding import com.hjq.toast.ToastUtils import java.text.SimpleDateFormat import java.util.* class SmsAddActivity : BaseActivity() { private lateinit var infoBinding: ActivityCallAddBinding private lateinit var sms: SmsBean override fun initPage() { infoBinding = ActivityCallAddBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "添加短信" getIntentData() infoBinding.piTitle.ivBack.setOnClickListener { onBackPressed() } infoBinding.confirm.setOnClickListener { editConfirm() } } private fun getIntentData() { val tmp = intent.getParcelableExtra("sms") if (tmp != null) { sms = tmp } if (!TextUtils.isEmpty(sms.smsNum)) { infoBinding.etPhone.setText(sms.smsNum) } if (!TextUtils.isEmpty(sms.smsContent)) { infoBinding.etDescribe.setText(sms.smsContent) } } private fun editConfirm() { sms.smsNum = infoBinding.etPhone.text.toString() sms.smsContent = infoBinding.etDescribe.text.toString() if (TextUtils.isEmpty(sms.smsNum)) { ToastUtils.show("请输入短信号码") return } if (TextUtils.isEmpty(sms.smsContent)) { ToastUtils.show("请输入短信内容") return } sms.isInput = true sms.stringDate = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) .format(Date(System.currentTimeMillis())) val intent = Intent() setResult(RESULT_OK, intent) intent.putExtra("sms", sms) finish() } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/SocialAccountActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.content.Intent import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.chad.library.adapter.base.listener.OnItemChildClickListener import com.demo.antizha.R import com.demo.antizha.adapter.SocialAccAdapter import com.demo.antizha.adapter.SocialAccBean import com.demo.antizha.databinding.ActivitySocialAccountBinding class SocialAccountActivity : BaseActivity() { private lateinit var infoBinding: ActivitySocialAccountBinding private var socialAccounts: ArrayList = ArrayList() private lateinit var socialAccAdapter: SocialAccAdapter private lateinit var startEdit: ActivityResultLauncher override fun initPage() { infoBinding = ActivitySocialAccountBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "添加诈骗社交账号" infoBinding.tvSelectTip.text = "添加" infoBinding.lyComplete.tvCommitTip.text = "提示:最多可上传20条社交账号" infoBinding.lyComplete.btnCommit.text = "确定" getIntentData() infoBinding.recyclerview.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false) socialAccAdapter = SocialAccAdapter(R.layout.item_social_acc, socialAccounts) infoBinding.recyclerview.adapter = socialAccAdapter infoBinding.recyclerview.itemAnimator = null socialAccAdapter.setOnItemChildClickListener(OnItemChildClickListener { adapter, view, position -> val id: Int = view.id if (id == R.id.iv_delete) { socialAccounts.removeAt(position) adapter.notifyItemRemoved(position) } else if (id == R.id.iv_edit) { editAcc(position) } }) infoBinding.piTitle.ivBack.setOnClickListener { setResult(RESULT_CANCELED, intent) finish() } infoBinding.llSelect.setOnClickListener { editAcc(-1) } infoBinding.lyComplete.btnCommit.setOnClickListener { val intent = Intent() intent.putParcelableArrayListExtra("accounts", socialAccounts) setResult(RESULT_OK, intent) finish() } startEdit = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null || result.data!!.extras == null) return@registerForActivityResult val tag = result.data!!.extras!!.getInt("tag") val socialAccount = result.data!!.getParcelableExtra("account")!! if (tag == -1) { socialAccounts.add(socialAccount) socialAccAdapter.notifyItemInserted(socialAccounts.size - 1) } else { socialAccounts[tag] = socialAccount socialAccAdapter.notifyItemChanged(tag) } } } private fun getIntentData() { val list = intent.getParcelableArrayListExtra("accounts") if (list != null) { socialAccounts.addAll(list) } } private fun editAcc(i: Int) { val intent = Intent(mActivity, SocialAccountEditActivity::class.java) intent.putExtra("pos", i) if (i != -1) { intent.putExtra("acc", socialAccounts[i]) } startEdit.launch(intent) } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/SocialAccountEditActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.core.view.get import com.demo.antizha.R import com.demo.antizha.adapter.SocialAccBean import com.demo.antizha.databinding.ActivitySocialAccEditBinding import com.demo.antizha.util.Utils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.hjq.toast.ToastUtils import com.nex3z.flowlayout.FlowLayout import java.io.InputStreamReader class SocialType(val text: String) class SocialTypeData(val code: Int, var data: ArrayList) class SocialAccountEditActivity : BaseActivity() { companion object { const val FINATYPE = "其他类型" } private lateinit var infoBinding: ActivitySocialAccEditBinding private lateinit var flowLayout: FlowLayout private lateinit var socialTypeData: SocialTypeData private var pos: Int = 0 private var socialAccount: SocialAccBean? = null private var socialTypeIdx: Int = -1 override fun initPage() { infoBinding = ActivitySocialAccEditBinding.inflate(layoutInflater) setContentView(infoBinding.root) flowLayout = infoBinding.flowLayout infoBinding.piTitle.tvTitle.text = "添加诈骗社交账号" getIntentData() initTagAdapter() infoBinding.piTitle.ivBack.setOnClickListener { val intent = Intent() setResult(RESULT_CANCELED, intent) finish() } infoBinding.btnCommit.setOnClickListener { if (TextUtils.equals(FINATYPE, socialTypeData.data[socialTypeIdx].text)) { socialAccount!!.accountName = infoBinding.etTagOther.text.toString() socialAccount!!.accountNum = infoBinding.etAccountOther.text.toString() } else { socialAccount!!.accountName = socialTypeData.data[socialTypeIdx].text socialAccount!!.accountNum = infoBinding.etAccount.text.toString() } if (TextUtils.isEmpty(socialAccount!!.accountNum)) { ToastUtils.show("社交类型不能为空") return@setOnClickListener } val intent = Intent() intent.putExtra("tag", pos) intent.putExtra("account", socialAccount) setResult(RESULT_OK, intent) finish() } } fun onSelectType(view: View, type: String, pos: Int) { if (TextUtils.equals(FINATYPE, type)) { infoBinding.llAccOther.visibility = View.VISIBLE infoBinding.llAccNomar.visibility = View.GONE } else { infoBinding.llAccOther.visibility = View.GONE infoBinding.llAccNomar.visibility = View.VISIBLE socialAccount!!.accountName = type } infoBinding.tvAccName.text = "${type}账号" if (socialTypeIdx >= 0) { flowLayout[socialTypeIdx].isSelected = false (flowLayout[socialTypeIdx] as TextView).setTextColor(resources.getColor(R.color._1F1F1F, null)) } view.isSelected = true (view as TextView).setTextColor(resources.getColor(R.color.white, null)) socialTypeIdx = pos } private fun getIntentData() { pos = intent.getIntExtra("pos", 0) socialAccount = intent.getParcelableExtra("acc") if (socialAccount == null) socialAccount = SocialAccBean() } fun contains(list: List, str: String): Int { for (i in list.indices) { if (TextUtils.equals(list[i].text, str)) { return i } } return -1 } private fun addTagType(tagType: String, id: Int) { val tagView = LayoutInflater.from(mActivity) .inflate(R.layout.tag_flow_item, null as ViewGroup?, false) as TextView infoBinding.flowLayout.addView(tagView) tagView.text = tagType tagView.setOnClickListener(object : View.OnClickListener { val tagString: String = tagType val tagId: Int = id override fun onClick(view: View?) { if (tagId != socialTypeIdx) onSelectType(view!!, tagString, tagId) } }) } private fun initTagAdapter() { val inputStream = Utils.openfile("socialaccounttypes.txt") socialTypeData = Gson().fromJson(InputStreamReader(inputStream, "UTF-8"), object : TypeToken() {}.type) inputStream.close() if (TextUtils.isEmpty(socialAccount!!.accountName)) socialAccount!!.accountName = socialTypeData.data[0].text socialTypeData.data.add(SocialType(FINATYPE)) for ((i, stype) in socialTypeData.data.withIndex()) { addTagType(stype.text, i) } var id = contains(socialTypeData.data, socialAccount!!.accountName) if (id == -1) { id = socialTypeData.data.size - 1 infoBinding.etTagOther.setText(socialAccount!!.accountName) infoBinding.etAccountOther.setText(socialAccount!!.accountNum) onSelectType(infoBinding.flowLayout[id], FINATYPE, id) } else { infoBinding.etAccount.setText(socialAccount!!.accountNum) onSelectType(infoBinding.flowLayout[id], socialAccount!!.accountName, id) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/TagFlowLayoutActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import com.demo.antizha.R import com.demo.antizha.databinding.ActivityTagflowBinding import com.demo.antizha.util.Utils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.nex3z.flowlayout.FlowLayout import java.io.InputStreamReader class ReportZPEleBean { var clusterID: String? = null var code = -1 var id: Long = -1 var isShow: String? = null var name: String? = null var parentClusterID: String? = null var sort: String? = null var topClass: String? = null } class ReportZPBean { var children: List? = null var clusterID: String? = null var code = 0 var id: Long = 0 var isShow: String? = null var name: String? = null var parentClusterID: String? = null var sort: String? = null var topClass: String? = null } class ZPTypeData(val code: Int, var data: ArrayList) class TagFlowLayoutActivity : BaseActivity() { private lateinit var infoBinding: ActivityTagflowBinding private var mFlowString: List = ArrayList() var childPost = 0 val pageType: Int = 0 var tagBean: Int = 0 override fun initPage() { infoBinding = ActivityTagflowBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "诈骗类型" initTagAdapter() infoBinding.piTitle.ivBack.setOnClickListener { val intent = Intent() intent.putExtra("tagString", "") intent.putExtra("tagId", 0) setResult(RESULT_CANCELED, intent) finish() } } private fun initTagAdapter() { tagBean = intent.getIntExtra("int_tag_name", 0) val inputStream = Utils.openfile("EvidenceType.txt") val zPTypeData: ZPTypeData = Gson().fromJson(InputStreamReader(inputStream, "UTF-8"), object : TypeToken() {}.type) for (i in zPTypeData.data.indices) { initTagAdapter(zPTypeData.data[i], i) } inputStream.close() } private fun initTagAdapter(reportZPBean: ReportZPBean, idx: Int) { val inflate: View = LayoutInflater.from(mActivity) .inflate(R.layout.layout_tag_flow, null as ViewGroup?, false) infoBinding.llParent.addView(inflate) val tvDivBg = inflate.findViewById(R.id.tv_div_bg) val ivDrop = inflate.findViewById(R.id.iv_arrow) val tagFlowLayout = inflate.findViewById(R.id.flow_layout) tagFlowLayout.tag = false inflate.findViewById(R.id.tag_title).text = reportZPBean.name tvDivBg.visibility = if (idx % 4 == 0) View.VISIBLE else View.GONE if (reportZPBean.children == null || reportZPBean.children!!.isEmpty()) { val arrayList = ArrayList() val reportZPEleBean = ReportZPEleBean() reportZPEleBean.id = reportZPBean.id reportZPEleBean.code = reportZPBean.code reportZPEleBean.name = reportZPBean.name reportZPEleBean.clusterID = reportZPBean.clusterID reportZPEleBean.parentClusterID = reportZPBean.parentClusterID reportZPEleBean.isShow = reportZPBean.isShow reportZPEleBean.sort = reportZPBean.sort reportZPEleBean.topClass = reportZPBean.topClass arrayList.add(reportZPEleBean) reportZPBean.children = arrayList } for (i in reportZPBean.children!!) { val tagView = LayoutInflater.from(mActivity) .inflate(R.layout.tag_flow_item, null as ViewGroup?, false) as TextView tagFlowLayout.addView(tagView) tagView.text = i.name if (tagBean != 0 && tagBean == i.code) { tagFlowLayout.visibility = View.VISIBLE tagFlowLayout.tag = true ivDrop.setImageResource(R.drawable.iv_tag_ar_up) tagView.isSelected = true tagView.setTextColor(resources.getColor(R.color.white, null)) } tagView.setOnClickListener(object : View.OnClickListener { val tagString: String? = i.name val tagId: Int = i.code override fun onClick(view: View?) { val intent = Intent() intent.putExtra("tagString", tagString) intent.putExtra("tagId", tagId) setResult(RESULT_OK, intent) finish() } }) } ivDrop.setOnClickListener(object : View.OnClickListener { val flowLayout: FlowLayout = tagFlowLayout override fun onClick(view: View?) { val show: Boolean = flowLayout.tag as Boolean flowLayout.visibility = if (show) View.GONE else View.VISIBLE ivDrop.setImageResource(if (show) R.drawable.iv_tag_ar_down else R.drawable.iv_tag_ar_up) flowLayout.tag = !show } }) } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/TradAccountActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.content.Intent import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.chad.library.adapter.base.listener.OnItemChildClickListener import com.demo.antizha.R import com.demo.antizha.adapter.SocialAccAdapter import com.demo.antizha.adapter.SocialAccBean import com.demo.antizha.databinding.ActivitySocialAccountBinding class TradAccountActivity : BaseActivity() { private lateinit var infoBinding: ActivitySocialAccountBinding private var dealAccounts: ArrayList = ArrayList() private lateinit var socialAccAdapter: SocialAccAdapter private lateinit var startEdit: ActivityResultLauncher override fun initPage() { infoBinding = ActivitySocialAccountBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "添加诈骗交易账户" infoBinding.tvSelectTip.text = "添加" infoBinding.lyComplete.tvCommitTip.text = "提示:最多可上传20条交易账户" infoBinding.lyComplete.btnCommit.text = "确定" getIntentData() infoBinding.recyclerview.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false) socialAccAdapter = SocialAccAdapter(R.layout.item_social_acc, dealAccounts) infoBinding.recyclerview.adapter = socialAccAdapter infoBinding.recyclerview.itemAnimator = null socialAccAdapter.setOnItemChildClickListener(OnItemChildClickListener { adapter, view, position -> val id: Int = view.id if (id == R.id.iv_delete) { dealAccounts.removeAt(position) adapter.notifyItemRemoved(position) } else if (id == R.id.iv_edit) { editAcc(position) } }) infoBinding.piTitle.ivBack.setOnClickListener { setResult(RESULT_CANCELED, intent) finish() } infoBinding.llSelect.setOnClickListener { editAcc(-1) } infoBinding.lyComplete.btnCommit.setOnClickListener { val intent = Intent() intent.putParcelableArrayListExtra("accounts", dealAccounts) setResult(RESULT_OK, intent) finish() } startEdit = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> if (result.resultCode != Activity.RESULT_OK) return@registerForActivityResult if (result.data == null || result.data!!.extras == null) return@registerForActivityResult val tag = result.data!!.extras!!.getInt("tag") val socialAccount = result.data!!.getParcelableExtra("account")!! if (tag == -1) { dealAccounts.add(socialAccount) socialAccAdapter.notifyItemInserted(dealAccounts.size - 1) } else { dealAccounts[tag] = socialAccount socialAccAdapter.notifyItemChanged(tag) } } } private fun getIntentData() { val list = intent.getParcelableArrayListExtra("accounts") if (list != null) { dealAccounts.addAll(list) } } private fun editAcc(i: Int) { val intent = Intent(mActivity, TradAccountEditActivity::class.java) intent.putExtra("pos", i) if (i != -1) { intent.putExtra("acc", dealAccounts[i]) } startEdit.launch(intent) } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/TradAccountEditActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.core.view.get import com.demo.antizha.R import com.demo.antizha.adapter.SocialAccBean import com.demo.antizha.databinding.ActivitySocialAccEditBinding import com.demo.antizha.util.Utils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.hjq.toast.ToastUtils import com.nex3z.flowlayout.FlowLayout import java.io.InputStreamReader class TradAccountEditActivity : BaseActivity() { companion object { const val FINATYPE = "其他类型" } private lateinit var infoBinding: ActivitySocialAccEditBinding private lateinit var flowLayout: FlowLayout private lateinit var socialTypeData: SocialTypeData private var pos: Int = 0 private var socialAccount: SocialAccBean? = null private var socialTypeIdx: Int = -1 override fun initPage() { infoBinding = ActivitySocialAccEditBinding.inflate(layoutInflater) setContentView(infoBinding.root) flowLayout = infoBinding.flowLayout infoBinding.piTitle.tvTitle.text = "添加诈骗社交账号" getIntentData() initTagAdapter() infoBinding.piTitle.ivBack.setOnClickListener { val intent = Intent() setResult(RESULT_CANCELED, intent) finish() } infoBinding.btnCommit.setOnClickListener { if (TextUtils.equals(FINATYPE, socialTypeData.data[socialTypeIdx].text)) { socialAccount!!.accountName = infoBinding.etTagOther.text.toString() socialAccount!!.accountNum = infoBinding.etAccountOther.text.toString() } else { socialAccount!!.accountName = socialTypeData.data[socialTypeIdx].text socialAccount!!.accountNum = infoBinding.etAccount.text.toString() } if (TextUtils.isEmpty(socialAccount!!.accountNum)) { ToastUtils.show("交易类型不能为空") return@setOnClickListener } val intent = Intent() intent.putExtra("tag", pos) intent.putExtra("account", socialAccount) setResult(RESULT_OK, intent) finish() } } fun onSelectType(view: View, type: String, pos: Int) { if (TextUtils.equals(FINATYPE, type)) { infoBinding.llAccOther.visibility = View.VISIBLE infoBinding.llAccNomar.visibility = View.GONE } else { infoBinding.llAccOther.visibility = View.GONE infoBinding.llAccNomar.visibility = View.VISIBLE socialAccount!!.accountName = type } infoBinding.tvAccName.text = type + "账号" if (socialTypeIdx >= 0) { flowLayout[socialTypeIdx].isSelected = false (flowLayout[socialTypeIdx] as TextView).setTextColor(resources.getColor(R.color._1F1F1F, null)) } view.isSelected = true (view as TextView).setTextColor(resources.getColor(R.color.white, null)) socialTypeIdx = pos } private fun getIntentData() { pos = intent.getIntExtra("pos", 0) socialAccount = intent.getParcelableExtra("acc") if (socialAccount == null) socialAccount = SocialAccBean() } fun contains(list: List, str: String): Int { for (i in list.indices) { if (TextUtils.equals(list[i].text, str)) { return i } } return -1 } private fun addTagType(tagType: String, id: Int) { val tagView = LayoutInflater.from(mActivity) .inflate(R.layout.tag_flow_item, null as ViewGroup?, false) as TextView infoBinding.flowLayout.addView(tagView) tagView.text = tagType tagView.setOnClickListener(object : View.OnClickListener { val tagString: String = tagType val tagId: Int = id override fun onClick(view: View?) { if (tagId != socialTypeIdx) onSelectType(view!!, tagString, tagId) } }) } private fun initTagAdapter() { val inputStream = Utils.openfile("paymenttypes.txt") socialTypeData = Gson().fromJson(InputStreamReader(inputStream, "UTF-8"), object : TypeToken() {}.type) inputStream.close() if (TextUtils.isEmpty(socialAccount!!.accountName)) socialAccount!!.accountName = socialTypeData.data[0].text socialTypeData.data.add(SocialType(FINATYPE)) for ((i, stype) in socialTypeData.data.withIndex()) { addTagType(stype.text, i) } var id = contains(socialTypeData.data, socialAccount!!.accountName) if (id == -1) { id = socialTypeData.data.size - 1 infoBinding.etTagOther.setText(socialAccount!!.accountName) infoBinding.etAccountOther.setText(socialAccount!!.accountNum) onSelectType(infoBinding.flowLayout[id], FINATYPE, id) } else { infoBinding.etAccount.setText(socialAccount!!.accountNum) onSelectType(infoBinding.flowLayout[id], socialAccount!!.accountName, id) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/VirusKillingActivity.kt ================================================ package com.demo.antizha.ui.activity import android.annotation.SuppressLint import android.content.Context import android.content.res.ColorStateList import android.os.Handler import android.os.Looper import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.demo.antizha.R import com.demo.antizha.databinding.ActivityVirusKillingBinding import com.demo.antizha.util.AppUtil import com.demo.antizha.util.Utils import qiu.niorgai.StatusBarCompat import java.util.* class ScanAppInfoViewHolder(view: View) : RecyclerView.ViewHolder(view) { var image: ImageView = view.findViewById(R.id.app_icon) as ImageView var appName: TextView = view.findViewById(R.id.tv_app_name) as TextView var status: ImageView = view.findViewById(R.id.scan_state) as ImageView } class ScanAppInfoHolderAdapter( private var context: Context, private var list: ArrayList ) : RecyclerView.Adapter() { override fun onBindViewHolder(holder: ScanAppInfoViewHolder, i: Int) { holder.appName.text = list[i].appName holder.image.setImageDrawable(list[i].appIcon) holder.status.visibility = if (list[i].checkState == 0) View.GONE else View.VISIBLE } override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ScanAppInfoViewHolder { return ScanAppInfoViewHolder( LayoutInflater.from(context).inflate(R.layout.recyclerview_app_scan, viewGroup, false) ) } override fun getItemCount(): Int { return list.size } } class VirusKillingActivity : BaseActivity() { private lateinit var infoBinding: ActivityVirusKillingBinding private var currentState = -1 private var appScanTimer: Timer? = null private var apkScanTimer: Timer? = null private var appScanTask: TimerTask? = null private var apkScanTask: TimerTask? = null private var isPause: Boolean = false private var appCount = 0 private var apkCount = 0 private lateinit var appInfos: ArrayList override fun initPage() { infoBinding = ActivityVirusKillingBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "APP自检" infoBinding.piTitle.tvTitle.typeface = typ_ME StatusBarCompat.translucentStatusBar(this, true, false) infoBinding.piTitle.ivBack.setOnClickListener { stopScan() finish() } infoBinding.stopScan.setOnClickListener { when (currentState) { 1 -> { //正在检测 changeScanState(2) isPause = true } 2 -> { //暂停中 changeScanState(1) isPause = false } 3 -> { //已经完成 stopScan() finish() } 4 -> { } } } changeScanState(0) try { infoBinding.scanApp.text = "等待检测应用" infoBinding.scanPackage.text = "等待检测安装包" showGif2Image(infoBinding.ivAppStates, Integer.valueOf(R.mipmap.ic_scan_wait)) showGif2Image(infoBinding.ivApkStates, Integer.valueOf(R.mipmap.ic_scan_wait)) } catch (e2: Exception) { e2.printStackTrace() } infoBinding.rvApp.visibility = View.GONE beginScanApp() } @SuppressLint("NotifyDataSetChanged") private fun beginScanApp() { infoBinding.rvApp.visibility = View.VISIBLE appInfos = AppUtil.getAppinfos() appCount = appInfos.size infoBinding.rvApp.layoutManager = LinearLayoutManager(this) val appAdapter = ScanAppInfoHolderAdapter(this, appInfos) infoBinding.rvApp.adapter = appAdapter appAdapter.notifyDataSetChanged() changeScanState(1) if (appScanTimer == null) { appScanTimer = Timer() } var sizeSum = 0L for (app in appInfos) sizeSum += app.size val sizeaverage = sizeSum / appInfos.size appScanTask = object : TimerTask() { var idx: Int = 0 var scaning = false override fun run() { if (isPause) return if (scaning) return scaning = true var delay = 0L if (idx < appInfos.size) delay = appInfos[idx].size * 200L / sizeaverage Handler(Looper.getMainLooper()).postDelayed({ if (idx < appInfos.size) { appInfos[idx].checkState = 1 appAdapter.notifyItemChanged(idx) infoBinding.rvApp.smoothScrollToPosition(idx) idx++ infoBinding.scanAppCount.text = idx.toString() } else { stopScan() infoBinding.rvApp.visibility = View.GONE infoBinding.scanApp.text = "检测应用完成" showGif2Image(infoBinding.ivAppStates, Integer.valueOf(R.mipmap.ic_scan_ok)) beginScanPackage() } scaning = false }, delay) } } appScanTimer!!.schedule(appScanTask, 0, 30) } @SuppressLint("NotifyDataSetChanged") fun beginScanPackage() { val apkInfos: ArrayList = ArrayList() /* val pm: PackageManager = Hicore.app.getPackageManager() val intent = Intent("android.intent.action.MAIN", null as Uri?) intent.addCategory("android.intent.category.LAUNCHER") val queryIntentActivities = pm.queryIntentActivities(intent, 0) var apkNameLogs: ArrayList = ArrayList() for (activity in queryIntentActivities) { if (AppUtil.contains(activity.activityInfo.packageName) && !apkNameLogs.contains( activity.activityInfo.packageName)) { apkInfos.add(AppUtil.getAppinfo(activity.activityInfo.packageName)) apkNameLogs.add(activity.activityInfo.packageName) } }*/ apkCount = apkInfos.size infoBinding.rvApk.layoutManager = LinearLayoutManager(this) val appAdapter = ScanAppInfoHolderAdapter(this, apkInfos) infoBinding.rvApk.adapter = appAdapter appAdapter.notifyDataSetChanged() if (apkScanTimer == null) { apkScanTimer = Timer() } apkScanTask = object : TimerTask() { var idx: Int = 0 override fun run() { if (isPause) return Handler(Looper.getMainLooper()).postDelayed({ if (idx < apkInfos.size) { apkInfos[idx].checkState = 1 appAdapter.notifyItemChanged(idx) infoBinding.rvApk.smoothScrollToPosition(idx) idx++ infoBinding.scanPackageCount.text = idx.toString() } else { stopScan() infoBinding.rvApk.visibility = View.GONE infoBinding.scanApp.text = "检测安装包完成" showGif2Image(infoBinding.ivApkStates, Integer.valueOf(R.mipmap.ic_scan_ok)) changeScanState(3) } }, 0) } } apkScanTimer!!.schedule(apkScanTask, 200, 200) } fun stopScan() { if (appScanTimer != null) { appScanTimer!!.cancel() appScanTimer = null } if (apkScanTimer != null) { apkScanTimer!!.cancel() apkScanTimer = null } } @SuppressLint("UseCompatLoadingForDrawables") fun changeScanState(state: Int) { infoBinding.stopScan.setTextColor(resources.getColor(R.color.colorWhite, null)) infoBinding.ivCircleCenter.visibility = View.GONE infoBinding.scanResultTip.visibility = View.GONE infoBinding.scanState.visibility = View.GONE infoBinding.stopScan.visibility = View.GONE infoBinding.lyRbl.layoutRiskBtn.visibility = View.GONE when (state) { 0 -> { infoBinding.scanState.text = "等待检测" infoBinding.scanState.visibility = View.VISIBLE infoBinding.ivCircleCenter.visibility = View.VISIBLE stopGif2Img(R.mipmap.ic_scan_rotate) } 1 -> { infoBinding.viewBg.background = resources.getDrawable(R.mipmap.ic_blue_bg_big, null) infoBinding.ivCircleCenter.visibility = View.VISIBLE infoBinding.ivCircle.setImageResource(R.mipmap.ic_scan_rotate) Utils.showAnimation(mActivity, R.anim.scan_app_anim, infoBinding.ivCircle) infoBinding.stopScan.text = "停止检测" infoBinding.stopScan.setTextColor(resources.getColor(R.color.black_dark, null)) infoBinding.stopScan.background = resources.getDrawable(R.drawable.button_bg_gray, null) infoBinding.stopScan.visibility = View.VISIBLE currentState = 1 } 2 -> { infoBinding.viewBg.background = resources.getDrawable(R.mipmap.ic_blue_bg_big, null) stopGif2Img(R.mipmap.ic_scan_unfinish) infoBinding.scanResultTip.text = "暂停检测应用/安装包" infoBinding.scanResultTip.visibility = View.VISIBLE infoBinding.stopScan.text = "继续检测" infoBinding.stopScan.background = resources.getDrawable(R.drawable.button_bg_them, null) infoBinding.stopScan.visibility = View.VISIBLE currentState = 2 } 3 -> { infoBinding.viewBg.background = resources.getDrawable(R.mipmap.ic_blue_bg_big, null) infoBinding.viewBg.backgroundTintList = ColorStateList.valueOf(-13479169) stopGif2Img(R.mipmap.ic_scan_finish) infoBinding.scanResultTip.text = "安全" infoBinding.scanResultTip.visibility = View.VISIBLE infoBinding.scanState.text = "建议定期检测清理,国家反诈中心实时守护您的网络安全" infoBinding.scanState.background = resources.getDrawable(R.drawable.button_bg_blue_dark, null) infoBinding.scanState.visibility = View.VISIBLE infoBinding.stopScan.text = "安全返回" infoBinding.stopScan.background = resources.getDrawable(R.drawable.button_bg_them, null) infoBinding.stopScan.visibility = View.VISIBLE infoBinding.scanLayout.visibility = View.GONE infoBinding.rlRiskResult.visibility = View.GONE infoBinding.rlSafeResult.visibility = View.VISIBLE infoBinding.safeSpace.visibility = View.VISIBLE infoBinding.tvAppCount.text = appCount.toString() infoBinding.tvPackageCount.text = apkCount.toString() currentState = 3 } 4 -> { stopGif2Img(R.mipmap.ic_scan_finish_virus) infoBinding.viewBg.backgroundTintList = ColorStateList.valueOf(-1289424) infoBinding.scanState.text = "建议定期检测清理,国家反诈中心实时守护您的网络安全" infoBinding.scanState.background = resources.getDrawable(R.drawable.button_bg_red_dark, null) infoBinding.scanState.visibility = View.VISIBLE infoBinding.scanLayout.visibility = View.GONE infoBinding.rlRiskResult.visibility = View.VISIBLE infoBinding.lyRbl.layoutRiskBtn.visibility = View.VISIBLE infoBinding.lyRbl.tvDelete.text = "一键清除" //riskLayoutDeal() //refreshRiskCount() infoBinding.scanResultTip.visibility = View.VISIBLE currentState = 4 } } } private fun showGif2Image(imageView: ImageView, num: Int?) { try { Glide.with(imageView.context).asGif().load(num).into(imageView) } catch (unused: Exception) { } } private fun stopGif2Img(resid: Int) { try { if (infoBinding.ivCircle.drawable != null) { infoBinding.ivCircle.clearAnimation() } infoBinding.ivCircle.setImageResource(resid) } catch (e2: Exception) { e2.printStackTrace() infoBinding.ivCircle.setImageResource(resid) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/WarnPrimessActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.os.Handler import android.os.Looper import android.text.TextUtils import android.view.View import android.widget.TextView import com.demo.antizha.R import com.demo.antizha.databinding.ActivityWarnPrimessBinding import com.demo.antizha.util.SpUtils import qiu.niorgai.StatusBarCompat class WarnPrimessActivity : BaseActivity() { private lateinit var infoBinding: ActivityWarnPrimessBinding private var mOpenCount = "" private var mOldShowCount = -1 override fun initPage() { infoBinding = ActivityWarnPrimessBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this as Activity, true, false) infoBinding.piTitle.rlTitle.setBackgroundColor(resources.getColor(R.color.blue, null)) infoBinding.ivIc.visibility = View.GONE infoBinding.openFlow.tag = "0" infoBinding.openPhone.tag = "1" infoBinding.openPhoneRecord.tag = "2" infoBinding.openSms.tag = "3" infoBinding.piTitle.ivBack.setOnClickListener { finish() } infoBinding.confirm.setOnClickListener { finish() } } override fun onResume() { super.onResume() mOpenCount = "" mOldShowCount = -1 Handler(Looper.getMainLooper()).postDelayed({ infoBinding.tvLabel.text = "预警守护中" infoBinding.tvLabelSmall.text = "准确识别电信网络诈骗" infoBinding.ivIc.visibility = View.VISIBLE infoBinding.confirm.isEnabled = true if (!mOpenCount.contains("0")) { SpUtils.setValue(SpUtils.warnCall, true) SpUtils.setValue(SpUtils.warnSms, true) openState(infoBinding.openFlow, isOpen = true, addOpenCount = true) } }, 500) openState(infoBinding.openFlow, SpUtils.getValue(SpUtils.warnCall, true) && SpUtils.getValue(SpUtils.warnSms, true), true) openState(infoBinding.openPhone, isOpen = true, addOpenCount = true) openState(infoBinding.openPhoneRecord, true, addOpenCount = true) openState(infoBinding.openSms, isOpen = true, addOpenCount = true) openState(infoBinding.openAuto, SpUtils.getValue(SpUtils.primissAuto, false), false) openState(infoBinding.openPower, SpUtils.getValue(SpUtils.primissPower, false), false) openState(infoBinding.openLock, SpUtils.getValue(SpUtils.primissLock, false), false) infoBinding.openAuto.setOnClickListener(OnClickListener(SpUtils.primissAuto)) infoBinding.openPower.setOnClickListener(OnClickListener(SpUtils.primissPower)) infoBinding.openLock.setOnClickListener(OnClickListener(SpUtils.primissLock)) } private fun openState(textView: TextView?, isOpen: Boolean, addOpenCount: Boolean) { val openTag = try { textView!!.tag as String } catch (e2: Exception) { e2.printStackTrace() "" } if (textView != null) { if (isOpen) { textView.isEnabled = false textView.text = "已开启" textView.setTextColor(resources.getColor(R.color.colorGray, null)) textView.setBackgroundResource(R.drawable.shape_gray_3) if (addOpenCount && !TextUtils.isEmpty(openTag) && !mOpenCount.contains(openTag)) { mOpenCount += openTag } return } textView.isEnabled = true textView.text = "去开启" textView.setTextColor(resources.getColor(R.color.blue, null)) textView.setBackgroundResource(R.drawable.shape_blue_3) } } inner class OnClickListener(private val key: String) : View.OnClickListener { override fun onClick(v: View?) { val isOpen = SpUtils.getValue(key, false) SpUtils.setValue(key, !isOpen) openState(v as TextView, !isOpen, false) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/WarnSettingActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.graphics.Typeface import android.text.TextUtils import android.view.View import com.airbnb.lottie.RenderMode import com.demo.antizha.R import com.demo.antizha.databinding.ActivityWarnSettingBinding import com.demo.antizha.util.SpUtils import com.suke.widget.SwitchButton import qiu.niorgai.StatusBarCompat class WarnSettingActivity : BaseActivity() { private lateinit var infoBinding: ActivityWarnSettingBinding private var currentAnimation = "" override fun initPage() { infoBinding = ActivityWarnSettingBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this, true, false) typ_ME = Typeface.createFromAsset(assets, "DIN-Medium.otf") infoBinding.piTitle.tvTitle.text = "来电预警" infoBinding.piTitle.ivRight.setImageResource(R.mipmap.ic_warn_setting) infoBinding.tvCall.typeface = typ_ME infoBinding.tvSms.typeface = typ_ME infoBinding.tvApp.typeface = typ_ME //监听改版状态的事件 infoBinding.switchCall.setOnCheckedChangeListener(OnCheckedChangeListener(SpUtils.warnCall)) infoBinding.switchSms.setOnCheckedChangeListener(OnCheckedChangeListener(SpUtils.warnSms)) //先显示一个打开的动画,具体是否打开在onResume事件中判断 infoBinding.lottieLikeanim.setRenderMode(RenderMode.SOFTWARE) infoBinding.lottieLikeanim.imageAssetsFolder = "images/" infoBinding.lottieLikeanim.setAnimation("lottie_on.json") infoBinding.lottieLikeanim.playAnimation() //监听2个点击事件 infoBinding.piTitle.ivBack.setOnClickListener { finish() } infoBinding.piTitle.ivRight.setOnClickListener { val intentInfo = Intent(this, WarnPrimessActivity::class.java) startActivity(intentInfo) } } override fun onDestroy() { super.onDestroy() infoBinding.lottieLikeanim.cancelAnimation() infoBinding.lottieLikeanim.clearAnimation() infoBinding.lottieLikeanim.clearFocus() } override fun onPause() { super.onPause() infoBinding.lottieLikeanim.pauseAnimation() } override fun onResume() { super.onResume() infoBinding.lottieLikeanim.playAnimation() checkWarnIsOpen() } private fun checkWarnIsOpen() { infoBinding.switchCall.visibility = View.VISIBLE infoBinding.switchSms.visibility = View.VISIBLE infoBinding.tvGoPermission.visibility = View.GONE val warnCallIsOpen = SpUtils.getValue(SpUtils.warnCall, true) val warnSmsIsOpen = SpUtils.getValue(SpUtils.warnSms, true) if (warnCallIsOpen || warnSmsIsOpen) { if (warnCallIsOpen) { infoBinding.switchCall.isChecked = true } if (warnSmsIsOpen) { infoBinding.switchSms.isChecked = true } switchWarnText(true) return } switchWarnText(false) } fun switchWarnText(warnIsOpen: Boolean) { if (!switchAnimation(warnIsOpen)) { if (warnIsOpen) { infoBinding.tvContent.text = "来电预警守护中" infoBinding.tvContentSecond.text = "准确识别电信诈骗" return } infoBinding.tvContent.text = "来电预警未开启" infoBinding.tvContentSecond.text = "无法准确识别电信诈骗,请立即开启" } } private fun switchAnimation(warnIsOpen: Boolean): Boolean { val str = if (warnIsOpen) "lottie_on.json" else "lottie_off.json" if (TextUtils.equals(str, currentAnimation)) { return true } currentAnimation = str infoBinding.lottieLikeanim.setAnimation(str) infoBinding.lottieLikeanim.playAnimation() return false } fun showCurrentWarn() { var warnIsOpen = false val callIsOpen: Boolean = SpUtils.getValue(SpUtils.warnCall, true) val smsIsOpen: Boolean = SpUtils.getValue(SpUtils.warnSms, true) if (callIsOpen || smsIsOpen) { warnIsOpen = true } switchWarnText(warnIsOpen) } inner class OnCheckedChangeListener internal constructor(private val key: String) : SwitchButton.OnCheckedChangeListener { override fun onCheckedChanged(switchButton: SwitchButton?, isChecked: Boolean) { SpUtils.setValue(key, isChecked) if (isChecked) { switchWarnText(true) } else { showCurrentWarn() } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/WebActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.content.Intent import android.graphics.Color import android.net.Uri import android.os.Message import android.text.TextUtils import android.view.View import android.webkit.* import com.demo.antizha.R import com.demo.antizha.databinding.ActivityWebBinding import com.demo.antizha.interfaces.IClickListener import com.demo.antizha.interfaces.IHandler import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.HiWebView import com.demo.antizha.ui.SwipBackLayout import com.demo.antizha.util.DialogUtils import com.demo.antizha.util.Parameters import com.demo.antizha.util.UrlAES import com.demo.antizha.util.UrlUtils.separateParam import qiu.niorgai.StatusBarCompat import java.net.URLDecoder import java.util.concurrent.atomic.AtomicReference class WebActivity : BaseActivity(), IHandler.HandleWebActListener { companion object { const val EXTRA_WEB_PERSONALIZE = "extra_web_personalize" const val EXTRA_WEB_PERSONALIZE_UNSEALING = "extra_web_personalize_unsealing" const val EXTRA_WEB_TITLE = "extra_web_title" const val EXTRA_WEB_URL = "extra_web_url" } private lateinit var infoBinding: ActivityWebBinding private lateinit var mTitle: String private lateinit var mOrginUrl: String private lateinit var swipBackLayout: SwipBackLayout private var caragyCode = 0 private var mPersonalize: String? = null private var toPage = 0 private var articId: String? = null private var shareFullScreen = false override fun initPage() { infoBinding = ActivityWebBinding.inflate(layoutInflater) setContentView(infoBinding.root) StatusBarCompat.translucentStatusBar(this, true, true) swipBackLayout = SwipBackLayout.create(mActivity) swipBackLayout.init() IHandler.setHandleMsgListener(this) mTitle = intent.getStringExtra(EXTRA_WEB_TITLE).toString() mOrginUrl = intent.getStringExtra(EXTRA_WEB_URL).toString() caragyCode = intent.getIntExtra("extra_web_theme_caragy", -9) mPersonalize = intent.getStringExtra(EXTRA_WEB_PERSONALIZE) infoBinding.piTitle.tvTitle.text = mTitle initWebView(infoBinding.webview) infoBinding.webview.loadUrl(mOrginUrl) infoBinding.llProgress.visibility = View.VISIBLE fromUnsealedUrl() infoBinding.piTitle.ivBack.setOnClickListener { if (!HiCore.app.isDouble()) onBackPressed() } } // androidx.activity.ComponentActivity, android.app.Activity override fun onBackPressed() { if (infoBinding.webview.canGoBack()) { when (toPage) { 3 -> { DialogUtils.showInterlinkingDialog(mActivity, "确定要退出答题?", "退出后已作答题目将不会保存", "退出", "继续", OnDialogClick()) } 2 -> { infoBinding.webview.loadUrl(mOrginUrl) } else -> { super.onBackPressed() } } } else { super.onBackPressed() } } private fun initWebView(myWebView: HiWebView) { myWebView.webChromeClient = WebWebChromeClient() myWebView.webViewClient = WebWebViewClient() } private fun fromUnsealedUrl() { if (TextUtils.equals(mPersonalize, EXTRA_WEB_PERSONALIZE_UNSEALING)) { StatusBarCompat.translucentStatusBar((this as Activity), true, false) infoBinding.piTitle.rlTitle.visibility = View.GONE infoBinding.flMask.visibility = View.GONE } } private fun initView() { shareFullScreen = false infoBinding.piTitle.rlTitle.setBackgroundResource(R.drawable.status_bar_bg) infoBinding.piTitle.tvTitle.text = mTitle infoBinding.piTitle.ivBack.visibility = View.VISIBLE infoBinding.piTitle.ivRight.setBackgroundResource(0) } private fun testPage(i: Int) { toPage = i StatusBarCompat.translucentStatusBar((this as Activity), true, false) infoBinding.piTitle.rlTitle.setBackgroundResource(R.drawable.transparent) infoBinding.piTitle.tvTitle.text = mTitle + "人群防诈骗指数测试" swipBackLayout.setInterEvent(true) infoBinding.flMask.visibility = View.GONE infoBinding.piTitle.ivBack.setImageResource(R.mipmap.iv_white_back) infoBinding.piTitle.tvTitle.setTextColor(Color.parseColor("#ffffff")) infoBinding.piTitle.ivRight.setBackgroundResource(R.drawable.iv_share_white) } fun sendWebMsg(param: Parameters) { if (!param.isEmpty) { try { val id: String = param.value("id") if (!TextUtils.isEmpty(id)) { articId = id } val a: String = UrlAES.urlDecrypt(param.value("url")) if (!TextUtils.isEmpty(a)) { val decode: String = URLDecoder.decode(param.value("title"), "UTF-8") val intent = Intent(mActivity, PromosWebDetActivity::class.java) intent.putExtra("extra_web_title", decode) intent.putExtra("extra_web_url", a) intent.putExtra("extra_web_id", articId) startActivity(intent) } val isfullScreen: String = param.value("isfullScreen") val stylecolor: String = param.value("stylecolor") val toPage: String = param.value("toPage") when { TextUtils.equals("yes", isfullScreen) -> { IHandler.HandleListener.mHandler.sendEmptyMessage(2) } TextUtils.equals("no", isfullScreen) -> { IHandler.HandleListener.mHandler.sendEmptyMessage(3) } TextUtils.equals("black", stylecolor) -> { IHandler.HandleListener.mHandler.sendEmptyMessage(4) } TextUtils.equals("white", stylecolor) -> { IHandler.HandleListener.mHandler.sendEmptyMessage(5) } TextUtils.equals("1", toPage) -> { IHandler.HandleListener.mHandler.sendEmptyMessage(8) } TextUtils.equals("2", toPage) -> { IHandler.HandleListener.mHandler.sendEmptyMessage(9) } TextUtils.equals("3", toPage) -> { IHandler.HandleListener.mHandler.sendEmptyMessage(10) } } if (TextUtils.equals(param.value("appBack"), "1")) { IHandler.HandleListener.mHandler.sendEmptyMessage(11) } } catch (unused: java.lang.Exception) { } } } override fun handleMsg(message: Message?) { val activity = mActivity if (activity != null && !activity.isFinishing) { initView() when (message!!.what) { 2 -> { StatusBarCompat.translucentStatusBar(this, true, false) infoBinding.piTitle.rlTitle.visibility = View.VISIBLE infoBinding.flMask.visibility = View.GONE infoBinding.piTitle.rlTitle.setBackgroundResource(R.drawable.transparent) swipBackLayout.setInterEvent(true) infoBinding.piTitle.tvTitle.text = "" infoBinding.piTitle.ivBack.visibility = View.GONE infoBinding.piTitle.ivRight.setBackgroundResource(R.drawable.iv_share_white) shareFullScreen = true return } 3 -> { StatusBarCompat.translucentStatusBar(this, true, true) infoBinding.piTitle.rlTitle.visibility = View.VISIBLE infoBinding.flMask.visibility = View.VISIBLE swipBackLayout.setInterEvent(false) return } 4 -> { StatusBarCompat.translucentStatusBar(this, true, true) infoBinding.piTitle.rlTitle.visibility = View.GONE infoBinding.flMask.visibility = View.GONE swipBackLayout.setInterEvent(true) return } 5 -> { StatusBarCompat.translucentStatusBar(this, true, false) infoBinding.piTitle.rlTitle.visibility = View.GONE infoBinding.flMask.visibility = View.GONE swipBackLayout.setInterEvent(true) return } 6, 7 -> return 8 -> { toPage = 1 StatusBarCompat.translucentStatusBar(this, true, true) infoBinding.piTitle.rlTitle.setBackgroundResource(R.drawable.status_bar_bg) infoBinding.piTitle.tvTitle.text = mTitle swipBackLayout.setInterEvent(false) infoBinding.flMask.visibility = View.VISIBLE infoBinding.piTitle.ivBack.setImageResource(R.drawable.back_bla_arrow) infoBinding.piTitle.tvTitle.setTextColor(Color.parseColor("#1D1A33")) infoBinding.piTitle.ivRight.setBackgroundResource(0) return } 9 -> { testPage(2) return } 10 -> { testPage(3) return } 11 -> { onBackPressed() return } else -> return } } } inner class OnDialogClick internal constructor() : IClickListener { override fun cancelBtn() { val webActivity: WebActivity = this@WebActivity infoBinding.webview.loadUrl(webActivity.mOrginUrl) } override fun clickOKBtn() {} } inner class WebWebChromeClient internal constructor() : WebChromeClient() { // android.webkit.WebChromeClient override fun onProgressChanged(webView: WebView?, i: Int) { if (i == 100) { infoBinding.progressBar.visibility = View.GONE infoBinding.llProgress.visibility = View.GONE return } infoBinding.progressBar.visibility = View.VISIBLE infoBinding.progressBar.progress = i } // android.webkit.WebChromeClient override fun onReceivedTitle(webView: WebView?, str: String?) { super.onReceivedTitle(webView, str) if (TextUtils.isEmpty(mTitle) && !TextUtils.isEmpty(str)) { infoBinding.piTitle.tvTitle.text = mTitle } } } inner class WebWebViewClient internal constructor() : WebViewClient() { override fun onReceivedError(webView: WebView, request: WebResourceRequest, error: WebResourceError) { super.onReceivedError(webView, request, error) if (request.isForMainFrame()) { infoBinding.piNetworkNo.llNetworkNo.visibility = View.VISIBLE infoBinding.webview.visibility = View.GONE } } // android.webkit.WebViewClient override fun shouldInterceptRequest(webView: WebView?, webResourceRequest: WebResourceRequest): WebResourceResponse? { val uri = webResourceRequest.url.toString() if (TextUtils.isEmpty(uri)) { return super.shouldInterceptRequest(webView, webResourceRequest) } sendWebMsg(separateParam(uri)) return super.shouldInterceptRequest(webView, webResourceRequest) } override fun shouldOverrideUrlLoading(webView: WebView?, webResourceRequest: WebResourceRequest): Boolean { val atomicReference = AtomicReference() atomicReference.set(webResourceRequest.url.path) return super.shouldOverrideUrlLoading(webView, webResourceRequest) } // android.webkit.WebViewClient override fun shouldOverrideUrlLoading(webView: WebView, str: String?): Boolean { return if (str == null) { false } else try { if (!str.startsWith("http:") && !str.startsWith("https:")) { startActivity(Intent("android.intent.action.VIEW", Uri.parse(str))) return true } webView.loadUrl(str) true } catch (unused: Exception) { false } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/WebsiteActivity.kt ================================================ package com.demo.antizha.ui.activity import android.content.Intent import android.text.InputFilter import android.text.InputFilter.LengthFilter import android.text.TextUtils import android.view.View import android.widget.EditText import android.widget.ImageView import com.demo.antizha.R import com.demo.antizha.databinding.ActivityWeburlBinding import com.hjq.toast.ToastUtils import java.util.* class WebsiteActivity : BaseActivity() { companion object{ const val MAX_COUNT = 20 } private lateinit var infoBinding: ActivityWeburlBinding private val etContents: LinkedList = LinkedList() private val ivClears: LinkedList = LinkedList() override fun initPage() { infoBinding = ActivityWeburlBinding.inflate(layoutInflater) setContentView(infoBinding.root) infoBinding.piTitle.tvTitle.text = "添加诈骗网址" infoBinding.lyComplete.tvCommitTip.text = "最多可添加${MAX_COUNT}条网址" infoBinding.lyComplete.btnCommit.text = "确定" infoBinding.vLine.visibility = View.GONE infoBinding.flSelectHistory.visibility = View.GONE initData() infoBinding.flSelect.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View?) { if (!isFull()) { addUrl("") } } }) infoBinding.piTitle.ivBack.setOnClickListener { val intent = Intent() setResult(RESULT_CANCELED, intent) finish() } infoBinding.lyComplete.btnCommit.setOnClickListener { val intent = Intent() intent.putStringArrayListExtra("url", getSelectUrl()) setResult(RESULT_OK, intent) finish() } } private fun initData() { val array = intent.getStringArrayListExtra("url") if (array == null || array.size == 0) { for (i in 0..4) addUrl("") } else { val it: Iterator = array.iterator() while (it.hasNext()) { addUrl(it.next()) } } } private fun addUrl(url: String) { val inflate = View.inflate(mActivity, R.layout.recyclerview_url_select, null) val etContent = inflate.findViewById(R.id.et_content) val ivClear = inflate.findViewById(R.id.iv_clear) etContent.filters = arrayOf(LengthFilter(500)) ivClear.setOnClickListener(OnClearClickListener()) infoBinding.linearlayout.addView(inflate) etContents.add(etContent) ivClears.add(ivClear) if (!TextUtils.isEmpty(url)) { etContent.setText(url) } } fun isFull(): Boolean { if (etContents.size < MAX_COUNT) { return false } ToastUtils.show("最多可添加${MAX_COUNT}条网址") return true } private fun getSelectUrl(): ArrayList { val urls = ArrayList() for (i in etContents.indices) { val url = etContents[i].text.toString().trim { it <= ' ' } if (!TextUtils.isEmpty(url) && !urls.contains(url)) { urls.add(url) } } return urls } inner class OnClearClickListener : View.OnClickListener { override fun onClick(view: View) { if (etContents.size == 1) { etContents[0].setText("") return } for ((i, ivClear) in ivClears.withIndex()) { if (ivClear === view) { etContents.removeAt(i) ivClears.removeAt(i) infoBinding.linearlayout.removeViewAt(i) break } } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/activity/WelcomeActivity.kt ================================================ package com.demo.antizha.ui.activity import android.app.Activity import android.content.Intent import android.os.Bundle import android.os.Handler import android.os.Looper import com.demo.antizha.UserInfoBean import com.demo.antizha.interfaces.IOneClickListener import com.demo.antizha.md.JniHandStamp import com.demo.antizha.newwork.DictionaryUtils import com.demo.antizha.newwork.UpdateUtil class WelcomeActivity : Activity() { private var beginSec: Long = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) UserInfoBean.init() UpdateUtil.mActivity = this beginSec = System.currentTimeMillis() //初始化网络 JniHandStamp.handshareKeyAsyn(object : IOneClickListener { override fun clickOKBtn() { DictionaryUtils.getDictionary() UpdateUtil.getVerInfo() } }) closeSplash() } fun finishPage() { if (!isFinishing) { finish() } } private fun closeSplash() { val currentSec = System.currentTimeMillis() if (DictionaryUtils.step < 2 || currentSec - beginSec < MainActivity.SPLASH_TIME || UpdateUtil.uppVerDlg != null) { Handler(Looper.getMainLooper()).postDelayed({ closeSplash() }, 500) return } val intent = Intent() intent.setClass(this, MainActivity::class.java) startActivity(intent); finishPage(); } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/dialog/HiShareDialog.kt ================================================ package com.demo.antizha.ui.dialog import android.annotation.SuppressLint import android.app.Activity import android.os.Parcel import android.os.Parcelable import android.text.TextUtils import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.demo.antizha.BuildConfig import com.demo.antizha.R import com.demo.antizha.UserInfoBean import com.demo.antizha.adapter.HRecyclerViewAdapter import com.demo.antizha.ui.BaseDialog import com.demo.antizha.util.Utils class ShareConfigBean : Parcelable { var apiAddress: String = "" var description: String = "" var downloadUrl: String = "" var iconUrl: String = "" var id: String = "" var initiatorName: String = "" var saveImgUrl: String = "" var title: String = "" constructor() constructor(source: Parcel) { apiAddress = source.readString().toString() description = source.readString().toString() downloadUrl = source.readString().toString() iconUrl = source.readString().toString() id = source.readString().toString() initiatorName = source.readString().toString() saveImgUrl = source.readString().toString() title = source.readString().toString() } override fun describeContents(): Int { return 0 } override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(apiAddress) dest.writeString(description) dest.writeString(downloadUrl) dest.writeString(iconUrl) dest.writeString(id) dest.writeString(initiatorName) dest.writeString(saveImgUrl) dest.writeString(title) } companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): ShareConfigBean { return ShareConfigBean(parcel) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } class HiShareDialog( private var activity: Activity, private var shareBean: ShareConfigBean, private var shareType: Int ) : BaseDialog(activity, R.style.base_dialog_style) { private var shareUrl: String private var title: String private var description: String init { shareUrl = BuildConfig.RELEASE_H5_URL + "/QRCode/?appkey=a28ft4&pcode=10000" title = "下载国家反诈中心APP,公安部打击防范电信网络诈骗官方应用" description = "看更多反诈文章,上国家反诈中心APP" createDialog() } @SuppressLint("ResourceType") private fun createDialog() { setContentView(R.layout.share_dlg) setGravityLayout(0) widthDialog = (-2.0).toFloat() heightDialogdp = -2.0f setCancelable(true) setCanceledOnTouchOutside(true) initOnCreate() window!!.setWindowAnimations(R.anim.anim_bottom_in) findViewById(R.id.cancel_btn).setOnClickListener(object : View.OnClickListener { override fun onClick(view: View?) { dismiss() } }) val recyclerView = findViewById(R.id.h_recyclerview) as RecyclerView val hRecyclerViewAdapter = HRecyclerViewAdapter(activity, shareType) val linearLayoutManager = LinearLayoutManager(activity) linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL recyclerView.layoutManager = linearLayoutManager //recyclerView.setHasFixedSize(true) recyclerView.adapter = hRecyclerViewAdapter hRecyclerViewAdapter.setOnItemClickListener { i, str -> this@HiShareDialog.onItemClick(i, str) } if (!TextUtils.isEmpty(shareBean.downloadUrl)) { shareUrl = shareBean.downloadUrl } if (!TextUtils.isEmpty(shareBean.title)) { title = shareBean.title } if (!TextUtils.isEmpty(shareBean.description)) { description = shareBean.description } shareUrl += "&nodeId=" + UserInfoBean.adcode } fun onItemClick(i: Int, str: String) { when (i) { 6 -> { if (shareType == 2) Utils.copyToClipboard(shareUrl) } } dismiss() } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/fragment/home/HomeFragment.kt ================================================ package com.demo.antizha.ui.fragment.home import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.content.Intent import android.graphics.Typeface import android.os.Bundle import android.os.Handler import android.os.Looper import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.bumptech.glide.annotation.GlideModule import com.bumptech.glide.module.AppGlideModule import com.demo.antizha.BuildConfig import com.demo.antizha.R import com.demo.antizha.UserInfoBean import com.demo.antizha.adapter.HomeNewCaseAdapter import com.demo.antizha.adapter.NewCaseBean import com.demo.antizha.adapter.NewCaseBeanPackage import com.demo.antizha.interfaces.IApiResult import com.demo.antizha.interfaces.IClickListener import com.demo.antizha.md.JniHandStamp import com.demo.antizha.newwork.DictionaryUtils import com.demo.antizha.newwork.UnsafeOkHttpClient import com.demo.antizha.newwork.saveBuff2File import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.RefreshUIEvent import com.demo.antizha.ui.activity.* import com.demo.antizha.util.AppUtil import com.demo.antizha.util.DialogUtils import com.demo.antizha.util.LogUtils import com.demo.antizha.util.Utils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.scwang.smartrefresh.layout.SmartRefreshLayout import com.scwang.smartrefresh.layout.header.ClassicsHeader import com.youth.banner.Banner import com.youth.banner.adapter.BannerAdapter import com.youth.banner.indicator.RoundLinesIndicator import com.youth.banner.listener.OnBannerListener import com.youth.banner.util.BannerUtils import org.greenrobot.eventbus.EventBus import java.io.InputStreamReader @GlideModule class GlideApp : AppGlideModule() { override fun isManifestParsingEnabled(): Boolean { return false } } class ToolBean(val id: Int, val name: String, val imageId: Int) class ToolViewHolder(view: View) : RecyclerView.ViewHolder(view) { var name: TextView = view.findViewById(R.id.tv_name) as TextView var image: ImageView = view.findViewById(R.id.iv_icon) as ImageView } class ToolHolderAdapter(private var homeFragment: HomeFragment, private var context: Context, private var list: ArrayList) : RecyclerView.Adapter() { override fun onBindViewHolder(holder: ToolViewHolder, i: Int) { holder.name.text = list[i].name holder.image.setImageResource(list[i].imageId) holder.itemView.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View?) { if (!HiCore.app.isDouble()) { if (list.size <= 0) return val adapterPosition = holder.absoluteAdapterPosition if (adapterPosition < 0) return val toolBean = list[adapterPosition] when (toolBean.id) { 0 -> { if (!UserInfoBean.isVerified()) DialogUtils.showNormalDialog(context, "请先进行实名认证", "", "取消", "身份验证", homeFragment as IClickListener) else homeFragment.startActivity(Intent(homeFragment.activity, ReportNewActivity::class.java)) } 1 -> { if (!UserInfoBean.isVerified()) DialogUtils.showNormalDialog(context, "请先进行实名认证", "", "取消", "身份验证", homeFragment as IClickListener) else homeFragment.startActivity(Intent(homeFragment.activity, ReporterAidActivity::class.java)) } 2 -> { val intentInfo = Intent(homeFragment.activity, WarnSettingActivity::class.java) homeFragment.startActivity(intentInfo) } 3 -> { if (!UserInfoBean.isVerified()) DialogUtils.showNormalDialog(context, "请先进行实名认证", "", "取消", "身份验证", homeFragment as IClickListener) else homeFragment.startActivity(Intent(homeFragment.activity, CheckIDActivity::class.java)) } } } } }) } override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ToolViewHolder { return ToolViewHolder( LayoutInflater.from(context).inflate(R.layout.tool_item, viewGroup, false) ) } override fun getItemCount(): Int { return list.size } } enum class BanderType { TYPE_RES, TYPE_URL } class BanderBean( val imageRes: Int, val imagePath: String, val url: String, val title: String, val imageType: BanderType ) class BanderHolder(view: View) : RecyclerView.ViewHolder(view) { var imageView: ImageView = view as ImageView } class BanderAdapter( imageUrls: ArrayList ) : BannerAdapter(imageUrls) { override fun onCreateHolder(parent: ViewGroup?, viewType: Int): BanderHolder { val imageView = ImageView(parent!!.context) val params = ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ) imageView.layoutParams = params imageView.scaleType = ImageView.ScaleType.CENTER_CROP //通过裁剪实现圆角 BannerUtils.setBannerRound(imageView, 20f) return BanderHolder(imageView) } override fun onBindView(holder: BanderHolder, data: BanderBean, position: Int, size: Int) { when (data.imageType) { BanderType.TYPE_RES -> holder.imageView.setImageResource(data.imageRes) BanderType.TYPE_URL -> Glide.with(holder.itemView).load(data.imagePath) .into(holder.imageView) } } } class HomeFragment : Fragment(), IClickListener { private lateinit var mActivity: Activity private lateinit var typeME: Typeface private lateinit var homeViewModel: HomeViewModel private lateinit var newCaseAdapter: HomeNewCaseAdapter //fragment_home.xml里面包含的 private lateinit var root: View private lateinit var mFlNoteView: View private lateinit var mRefreshLayout: SmartRefreshLayout private lateinit var mRecyclerview: RecyclerView private lateinit var mHomeTopName: TextView private lateinit var mTvNoteNum: TextView private lateinit var headerView: View private lateinit var mBanner: Banner private lateinit var mToolRecycle: RecyclerView private lateinit var mTvCheckFrad: TextView private lateinit var mVirusCheck: View private lateinit var mFruadCheck: View private lateinit var mLlHead: View private lateinit var mLlFoot: View private lateinit var mTvNewCase: TextView private lateinit var mTvMoreCase: View private lateinit var banderAdapter: BanderAdapter private var tools: ArrayList = ArrayList() private val mNewCaseList: MutableList = ArrayList() private var isLoadmore = false private var pageIndex = 1 private var pageSize = 10 class OnGetLatestCase : IApiResult { private var saveFile: String private var homeFragment: HomeFragment constructor(saveFile: String, homeFragment: HomeFragment) { this.saveFile = saveFile this.homeFragment = homeFragment } override fun onError() { LogUtils.debug("OnGetLatestCase Error", "") homeFragment.getNewCaseApiV2(homeFragment.pageIndex) } override fun onSuccess(data: String) { if (TextUtils.isEmpty(data)) { onError() return } LogUtils.debug("OnGetLatestCase Success", data) homeFragment.addLatestCase(data, saveFile) } } class OnGetLatestCaseV2 : IApiResult { private var saveFile: String private var homeFragment: HomeFragment constructor(saveFile: String, homeFragment: HomeFragment) { this.saveFile = saveFile this.homeFragment = homeFragment } override fun onError() { LogUtils.debug("OnGetLatestCaseV2 Erroe", "") } override fun onSuccess(data: String) { LogUtils.debug("OnGetLatestCaseV2 Success", data) homeFragment.addLatestCaseV2(data, saveFile) } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { ViewModelProvider(this)[HomeViewModel::class.java].also { homeViewModel = it } typeME = Typeface.createFromAsset(mActivity.assets, "DIN-Medium.otf") root = inflater.inflate(R.layout.fragment_home, container, false) mFlNoteView = root.findViewById(R.id.fl_note_view) mRefreshLayout = root.findViewById(R.id.sm_refresh) mRecyclerview = root.findViewById(R.id.recyclerview) mHomeTopName = root.findViewById(R.id.home_top_name) mTvNoteNum = root.findViewById(R.id.tv_num_tip) initViewNewCaseList() initBanner() initRecycleTool(mToolRecycle) initListener() return root } override fun onResume() { super.onResume() } override fun onAttach(context: Context) { super.onAttach(context) mActivity = context as Activity } private fun initViewNewCaseList() { mRecyclerview.layoutManager = LinearLayoutManager(mActivity, LinearLayoutManager.VERTICAL, false) headerView = LayoutInflater.from(mActivity) .inflate(R.layout.home_case_head, mRecyclerview as ViewGroup, false) mBanner = headerView.findViewById(R.id.banner) as Banner mToolRecycle = headerView.findViewById(R.id.rcy_tool) mTvCheckFrad = headerView.findViewById(R.id.tv_check_frad) mVirusCheck = headerView.findViewById(R.id.fl_virus_check) mFruadCheck = headerView.findViewById(R.id.fl_fruad_check) mLlHead = headerView.findViewById(R.id.ll_head) mTvNewCase = headerView.findViewById(R.id.tv_new_case) mHomeTopName.typeface = typeME mTvCheckFrad.typeface = typeME mTvNewCase.typeface = typeME val inflate: View = LayoutInflater.from(mActivity) .inflate(R.layout.item_more_case, mRecyclerview as ViewGroup, false) mLlFoot = inflate.findViewById(R.id.ll_foot) mTvMoreCase = inflate.findViewById(R.id.tv_more_case) mTvMoreCase.setOnClickListener(View.OnClickListener { EventBus.getDefault().postSticky(RefreshUIEvent(RefreshUIEvent.SELECT_WEB_FRAGMENT)) }) newCaseAdapter = HomeNewCaseAdapter(mActivity, mNewCaseList) newCaseAdapter.setHeaderView(headerView) newCaseAdapter.setFooterView(inflate) mRecyclerview.setAdapter(newCaseAdapter) getNewCaseApi(pageIndex) mFlNoteView.setOnClickListener { startActivity(Intent(activity, NoteListActivity::class.java)) } mVirusCheck.setOnClickListener(View.OnClickListener { if (AppUtil.checkPermission(mActivity, true)) startActivity(Intent(activity, VirusKillingActivity::class.java)) }) mFruadCheck.setOnClickListener(View.OnClickListener { startActivity(Intent(activity, CheckFraudActivity::class.java)) }) } private fun initBanner() { val imageList = ArrayList() imageList.add(BanderBean(Integer.valueOf(R.mipmap.banner1), "", "", "", BanderType.TYPE_RES)) mBanner.addBannerLifecycleObserver(this) mBanner.setBannerRound(20f) mBanner.setLoopTime(5000) mBanner.indicator = RoundLinesIndicator(HiCore.getContext()) banderAdapter = BanderAdapter(imageList) mBanner.setAdapter(banderAdapter) val mOnWebListener = object : OnBannerListener { override fun OnBannerClick(data: BanderBean, position: Int) { if (TextUtils.isEmpty(data.url)) return val intent = Intent(context, PromosWebDetActivity::class.java) intent.putExtra("extra_web_title", data.title) val adcode = if (TextUtils.isEmpty(UserInfoBean.adcode)) "110105" else UserInfoBean.adcode intent.putExtra("extra_web_url", data.url + "&nodeId=" + adcode) startActivity(intent) } } mBanner.setOnBannerListener(mOnWebListener) loadBander() } @SuppressLint("NotifyDataSetChanged") fun initRecycleTool(recyclerView: RecyclerView) { initToolBean() recyclerView.layoutManager = GridLayoutManager(mActivity, 4) val toolAdapter = ToolHolderAdapter(this, root.context, tools) recyclerView.adapter = toolAdapter toolAdapter.notifyDataSetChanged() } private fun initToolBean() { val toolText = arrayOf("我要举报", "举报助手", "来电预警", "身份核实") val toolImage = arrayOf( R.drawable.iv_home_report, R.drawable.iv_home_case, R.drawable.iv_home_warn, R.drawable.iv_home_id_check ) tools.clear() for ((i, text) in toolText.withIndex()) { val toolBean = ToolBean(i, text, toolImage[i]) tools.add(toolBean) } } private fun initListener() { mRefreshLayout.setRefreshHeader(ClassicsHeader(root.context)) mRefreshLayout.setEnableLoadMore(false) mRefreshLayout.setEnableRefresh(true) mRefreshLayout.setOnRefreshListener { //下拉刷新 pullToRefresh() } mRefreshLayout.setOnLoadMoreListener { //上拉加载更多 pullToLoadMore() } } override fun cancelBtn() { } override fun clickOKBtn() { val intent = Intent(activity, PersonalInfoAddActivity::class.java) intent.putExtra("from_page_type", PersonalInfoAddActivity.pageBase) startActivity(intent) } private fun pullToRefresh() { loadBander() pageIndex = 1 getNewCaseApi(pageIndex) } private fun pullToLoadMore() { isLoadmore = true val size: Int = newCaseAdapter.itemCount val nextPage = size / pageSize + 1 if (pageIndex < nextPage) { pageIndex = nextPage getNewCaseApi(pageIndex) return } mRefreshLayout.finishLoadMore() } private fun getNewCaseApi(page: Int) { if (DictionaryUtils.step < 2) { Handler(Looper.getMainLooper()).postDelayed({ getNewCaseApi(page) }, 500) return } //https://fzapp.gjfzpt.cn/hicore/api/Information/querylatestcases?Page=1&Rows=2&Sort=releasetime&Order=desc if (page > 2) { onNewCaseRequest(ArrayList()) return } UnsafeOkHttpClient.getDataByGet( BuildConfig.RELEASE_OSS_DOWNLOAD + "h5/news/index/index-${page}.json", addHead = true, OnGetLatestCase("newcase${page}.txt", this)) } private fun getNewCaseApiV2(page: Int) { val hashMap: HashMap = HashMap() hashMap["Sort"] = "releasetime" hashMap["Rows"] = "$pageSize" hashMap["Order"] = "desc" hashMap["Page"] = "$page" UnsafeOkHttpClient.getDataByPost( BuildConfig.RELEASE_API_URL + "/api/Information/querylatestcasesv2", bodyMap = JniHandStamp.princiHttp(hashMap), addHead = true, OnGetLatestCaseV2("latestcase${page}.txt", this) ) } private fun showMoreBtn(noMore: Boolean) { if (noMore) { mRefreshLayout.setEnableLoadMore(false) mTvMoreCase.visibility = View.VISIBLE return } mTvMoreCase.visibility = View.GONE } private fun onNewCaseRequest(cases: ArrayList) { LogUtils.debug("onNewCaseRequest count ", cases.size.toString()) mRefreshLayout.finishRefresh() mRefreshLayout.finishLoadMore() var noMore = true if (cases.size == 0) { if (isLoadmore) { mRefreshLayout.setEnableLoadMore(false) } noMore = false } else { val oldCount = newCaseAdapter.itemCount newCaseAdapter.data.addAll(cases) newCaseAdapter.notifyItemRangeInserted(oldCount, cases.size) isLoadmore = true if (cases.size != pageSize) { mRefreshLayout.setEnableLoadMore(false) } else { mRefreshLayout.setEnableLoadMore(true) noMore = false } } isLoadmore = false showMoreBtn(noMore) } fun addLatestCaseV2(data: String, saveFile: String) { val text = JniHandStamp.getSData(data) if (TextUtils.isEmpty(text)) return if (text[0] != '{') return val json = Gson().fromJson(text, NewCaseBeanPackage::class.java) if (json != null && json.code == 0 && json.data != null) { if (!TextUtils.isEmpty(saveFile)) saveBuff2File(text, saveFile) onNewCaseRequest(json.data.rows) } } private fun getNewCaseList(data: String): ArrayList { if (TextUtils.isEmpty(data) || data[0] != '[') return ArrayList() return Gson().fromJson(data, object : TypeToken>() {}.type) } private fun addLatestCase(data: String, saveFile: String) { //服务器发送的数据明明没有压缩,却故意设置一个错误的zip标记, //让客户端无法正确处理,然后去调用新的接口,这是个什么处理方式? //以上是根据2.0.1代码猜的,他并没有处理age字段, //而是直接在onError或解析出的数值为空里处理 val newCaseList = getNewCaseList(data) for (NewCase in newCaseList) { if (NewCase.cdnCover.substring(0, 4) != "http") NewCase.cdnCover = BuildConfig.RELEASE_OSS_DOWNLOAD + "h5/" + NewCase.cdnCover if (NewCase.localFilePath.substring(0, 4) != "http") NewCase.localFilePath = BuildConfig.RELEASE_OSS_DOWNLOAD + "h5/" + NewCase.localFilePath } if (!TextUtils.isEmpty(saveFile)) saveBuff2File(data, saveFile) onNewCaseRequest(newCaseList) } class NewBanderData(val data: ArrayList?, val code: Int) class NewBander( val createTime: String?, val extraID: Long?, val id: Long, var imgPath: String, val isShow: Int?, val openType: Int?, val sort: Int?, val title: String?, val updateTime: String?, val url: String? ) private fun loadBander() { if (DictionaryUtils.step < 2) { Handler(Looper.getMainLooper()).postDelayed({ loadBander() }, 500) return } val inStream = Utils.openfile("bander.txt") val inputReader = InputStreamReader(inStream, charset("UTF_8")) val buff = inputReader.readText() inStream.close() addNewBander(buff) } @SuppressLint("NotifyDataSetChanged") private fun addNewBander(data: String) { if (data[0] != '{') return val json = Gson().fromJson(data, NewBanderData::class.java) if (json != null && json.code == 0 && json.data != null && json.data.size > 0) { val imageList = ArrayList() for (row in json.data) { if (row.imgPath.substring(0, 4) != "http") row.imgPath = BuildConfig.RELEASE_OSS_DOWNLOAD + "h5/" + row.imgPath imageList.add( BanderBean( 0, row.imgPath, row.url ?: "", row.title ?: "", BanderType.TYPE_URL ) ) } banderAdapter.setDatas(imageList) banderAdapter.notifyDataSetChanged() } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/fragment/home/HomeViewModel.kt ================================================ package com.demo.antizha.ui.fragment.home import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class HomeViewModel : ViewModel() { private val _text = MutableLiveData().apply { value = "This is home Fragment" } val text: LiveData = _text } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/fragment/mine/MineFragment.kt ================================================ package com.demo.antizha.ui.fragment.mine import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.demo.antizha.BuildConfig import com.demo.antizha.R import com.demo.antizha.UserInfoBean import com.demo.antizha.ui.activity.* import com.demo.antizha.util.LogUtils class MineFragment : Fragment() { private lateinit var mActivity: Activity private lateinit var mineViewModel: MineViewModel private lateinit var root: View override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { mineViewModel = ViewModelProvider(this)[MineViewModel::class.java] root = inflater.inflate(R.layout.fragment_mine, container, false) val head: ConstraintLayout = root.findViewById(R.id.cl_head) head.setOnClickListener { val intentInfo = Intent(activity, MinePersonalActivity::class.java) startActivity(intentInfo) } val phone: TextView = root.findViewById(R.id.tv_phone) phone.setOnClickListener { val intentInfo = Intent(activity, MinePersonalActivity::class.java) startActivity(intentInfo) } val setting: RelativeLayout = root.findViewById(R.id.ll_setting) setting.setOnClickListener { val intentInfo = Intent(activity, SettingActivity::class.java) startActivity(intentInfo) } val about: RelativeLayout = root.findViewById(R.id.ll_ablout_app) about.setOnClickListener { val intentInfo = Intent(activity, AboutUsActivity::class.java) startActivity(intentInfo) } val userNote: RelativeLayout = root.findViewById(R.id.ll_user_note) userNote.setOnClickListener { val intentInfo = Intent(activity, WebActivity::class.java) intentInfo.putExtra(WebActivity.EXTRA_WEB_TITLE, "用户手册") intentInfo.putExtra(WebActivity.EXTRA_WEB_URL, BuildConfig.RELEASE_H5_URL + "/UserManual/?time=" + System.currentTimeMillis() / 3000) startActivity(intentInfo) } val feedback: RelativeLayout = root.findViewById(R.id.ll_feedback) feedback.setOnClickListener { val intentInfo = Intent(activity, FeedbackHelpActivity::class.java) startActivity(intentInfo) } return root } override fun onResume() { super.onResume() val phoneNumber: TextView = root.findViewById(R.id.tv_phone) if (!TextUtils.isEmpty(UserInfoBean.mobileNumber)) { val str = UserInfoBean.mobileNumber phoneNumber.text = "您好, ${str.substring(0, 3)}******${str.substring(str.length - 2)}" } else { phoneNumber.text = generatePhoneNumber() } val imei: TextView = root.findViewById(R.id.tv_imei) imei.text = UserInfoBean.imei val accountId: TextView = root.findViewById(R.id.tv_accountid) accountId.text = UserInfoBean.accountId val ver: LinearLayout = root.findViewById(R.id.ll_version) ver.visibility = if (TextUtils.isEmpty(UserInfoBean.name)) View.VISIBLE else View.GONE } override fun onAttach(context: Context) { super.onAttach(context) mActivity = context as Activity } private fun generatePhoneNumber(): String { //手机号生成 val head = getString(R.string.title_mine) val a = listOf( 131, 132, 133, 134, 135, 136, 137, 138, 139, 177, 151, 152, 153, 155, 156 ).random().toString() val b = "******" val c = (10..99).random().toString() return "$head $a$b$c" } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/fragment/mine/MineViewModel.kt ================================================ package com.demo.antizha.ui.fragment.mine import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class MineViewModel : ViewModel() { private val _text = MutableLiveData().apply { value = "This is notifications Fragment" } val text: LiveData = _text } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/fragment/web/WebFragment.kt ================================================ package com.demo.antizha.ui.fragment.web import android.app.Activity import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.os.Bundle import android.os.Handler import android.os.Looper import android.os.Message import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.webkit.WebResourceRequest import android.webkit.WebView import android.widget.* import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.demo.antizha.* import com.demo.antizha.ui.HiCore import com.demo.antizha.ui.activity.PromosWebDetActivity import com.demo.antizha.util.LogUtils import com.demo.antizha.util.Parameters import com.demo.antizha.util.UrlAES import com.just.agentweb.AbsAgentWebSettings import com.just.agentweb.AgentWeb import com.just.agentweb.WebChromeClient import com.just.agentweb.WebViewClient import java.net.URLDecoder class WebFragment : Fragment() { private lateinit var mActivity: Activity private lateinit var dashboardViewModel: WebViewModel private lateinit var agentWeb: AgentWeb private lateinit var webView: WebView private lateinit var webViewFrag: WebViewFrag private lateinit var root: View private lateinit var mVirtualWeb: LinearLayout private lateinit var mllWebContainer: LinearLayout private lateinit var mIvRight: ImageView private lateinit var mLinearLayout: LinearLayout private lateinit var mLlNetworkNo: View private lateinit var mNetTips: TextView private lateinit var mProgressBar: ProgressBar private lateinit var mRlTitle: RelativeLayout private lateinit var mIvBack: ImageView private lateinit var mTvTitle: TextView private lateinit var mWebChromeClient: WebChromeClient private lateinit var mWebViewClient: WebViewClient private lateinit var mOnWebListener: OnWebListener private lateinit var mHandler: Handler private var isInitWeb: Boolean = false private var id: String = "" override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { dashboardViewModel = ViewModelProvider(this)[WebViewModel::class.java] root = inflater.inflate(R.layout.fragment_web, container, false) mVirtualWeb = root.findViewById(R.id.ll_virtual_web) mllWebContainer = root.findViewById(R.id.ll_web_container) mIvRight = root.findViewById(R.id.iv_right) mLinearLayout = root.findViewById(R.id.web_container) mLlNetworkNo = root.findViewById(R.id.ll_network_no) mNetTips = root.findViewById(R.id.net_tips) mProgressBar = root.findViewById(R.id.pro_bar) mRlTitle = root.findViewById(R.id.rl_title) mIvBack = root.findViewById(R.id.iv_back) mTvTitle = root.findViewById(R.id.tv_title) mWebChromeClient = object : WebChromeClient() { override fun onProgressChanged(webView: WebView?, progress: Int) { if (progress == 100) { mProgressBar.visibility = View.GONE } else { mProgressBar.visibility = View.VISIBLE mProgressBar.progress = progress } } } mWebViewClient = object : WebViewClient() { override fun doUpdateVisitedHistory(webView: WebView, url: String?, isReload: Boolean) { super.doUpdateVisitedHistory(webView, url, isReload) webView.clearHistory() } override fun onPageStarted(webView: WebView?, str: String?, bitmap: Bitmap?) { super.onPageStarted(webView, str, bitmap) if (!networkConnected()) { switchLoadingPage(true) } } override fun shouldOverrideUrlLoading( webView: WebView, request: WebResourceRequest ): Boolean { if (!networkConnected()) { switchLoadingPage(true) return false } return super.shouldOverrideUrlLoading(webView, request) } } mOnWebListener = object : OnWebListener { override fun shouldIntercept(aVar: Parameters?) { if (aVar != null) analysisParam(aVar) } override fun webJsFinish() { mActivity.runOnUiThread { switchLoadingPage(false) } } } mHandler = object : Handler(Looper.getMainLooper()) { override fun handleMessage(message: Message) { super.handleMessage(message) if (!mActivity.isFinishing) { val what: Int = message.what if (what == 0) { mRlTitle.visibility = View.VISIBLE } else if (what == 1) { mRlTitle.visibility = View.GONE } } } } return root } private fun networkConnected(): Boolean { val cm: ConnectivityManager = HiCore.getContext() .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val network: Network? = cm.activeNetwork if (network != null) { val nc: NetworkCapabilities? = cm.getNetworkCapabilities(network) if (nc != null) { if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {//WIFI return true } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {//移动数据 return true } } } return false } private fun initPage() { mIvRight.setBackgroundResource(R.drawable.iv_share_white) mIvBack.visibility = View.GONE mRlTitle.visibility = View.GONE mRlTitle.setBackgroundColor(0) webViewFrag = WebViewFrag() initWebViewFrag() viewWeb() } private fun viewWeb() { val url = BuildConfig.RELEASE_H5_URL + "/?userid=" + UserInfoBean.accountId + "&imei=" + UserInfoBean.imei + "&" + (System.currentTimeMillis() / 3000) agentWeb = AgentWeb.with(this).setAgentWebParent(mLinearLayout, LinearLayout.LayoutParams(-1, -1)) .closeIndicator().setWebViewClient(mWebViewClient) .addJavascriptInterface("appjs", WebViewFrag.JsObject()) .setAgentWebWebSettings(AbsAgentWebSettings.getInstance()) .setMainFrameErrorView(R.layout.web_page_error, -1).createAgentWeb().ready().go(url) webView = agentWeb.webCreator.webView agentWeb.webCreator.webView.isHorizontalScrollBarEnabled = false webView.webChromeClient = mWebChromeClient webView.settings.textZoom = 100 } private fun initWebViewFrag() { switchLoadingPage(true) webViewFrag.init(mActivity, mOnWebListener) } fun switchLoadingPage(isLoading: Boolean) { mLinearLayout.visibility = View.VISIBLE if (isLoading) { mNetTips.text = "正在努力加载中..." mLlNetworkNo.visibility = View.VISIBLE } else { mLlNetworkNo.visibility = View.GONE } } override fun onAttach(context: Context) { super.onAttach(context) mActivity = context as Activity } override fun onResume() { super.onResume() if (TextUtils.isEmpty(UserInfoBean.accountId)) return if (!isInitWeb) { mVirtualWeb.visibility = View.GONE mllWebContainer.visibility = View.VISIBLE mProgressBar.visibility = View.VISIBLE isInitWeb = true initPage() } } fun goBack(): Boolean { if (!webView.canGoBack()) { return false } webView.goBack() return true } fun analysisParam(param: Parameters) { if (!param.isEmpty) { try { val tid: String = param.value("id") if (!TextUtils.isEmpty(tid)) { id = tid } val url: String = UrlAES.urlDecrypt(param.value("url")) if (!TextUtils.isEmpty(url)) { val decode: String = URLDecoder.decode(param.value("title"), "UTF-8") val intent = Intent(mActivity, PromosWebDetActivity::class.java) intent.putExtra("extra_web_title", decode) intent.putExtra("extra_web_url", url) intent.putExtra("extra_web_id", id) intent.putExtra("extra_web_enter", 2) startActivity(intent) } val isOnlyFullScreen: String = param.value("isOnlyFullScreen") val isFullScreen: String = param.value("isfullScreen") val stylecolor: String = param.value("stylecolor") when { TextUtils.equals("yes", isFullScreen) -> { //EventBus.getDefault().postSticky(a(100, null)) mHandler.sendEmptyMessage(0) } TextUtils.equals("no", isFullScreen) -> { //EventBus.getDefault().postSticky(a(101, null)) mHandler.sendEmptyMessage(1) } TextUtils.equals("yes", isOnlyFullScreen) -> { //EventBus.getDefault().postSticky(a(100, null)) mHandler.sendEmptyMessage(1) } TextUtils.equals("no", isOnlyFullScreen) -> { //EventBus.getDefault().postSticky(a(101, null)) mHandler.sendEmptyMessage(1) }/* TextUtils.equals("black", stylecolor) -> { EventBus.getDefault().postSticky(a(102, null)) } TextUtils.equals("white", stylecolor) -> { EventBus.getDefault().postSticky(a(103, null)) }*/ } } catch (unused: Exception) { } } } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/fragment/web/WebViewModel.kt ================================================ package com.demo.antizha.ui.fragment.web import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class WebViewModel : ViewModel() { private val _text = MutableLiveData().apply { value = "This is web Fragment" } val text: LiveData = _text } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/view/BottomBar.kt ================================================ package com.demo.antizha.ui.view import android.content.Context import android.graphics.Color import android.util.AttributeSet import android.view.View import android.widget.LinearLayout class BottomBar : LinearLayout { private val bottomBarTabs: MutableList = ArrayList() private var mTabLayout: LinearLayout private var mTabParams: LayoutParams private var currentItemPosition: Int = 0 private set private lateinit var onClickItemMenu: OnClickItemMenu interface OnClickItemMenu { fun onClickItem(nowPosition: Int, position: Int) } constructor(context: Context) : this(context, null) { } constructor(context: Context, attributeSet: AttributeSet) : this(context, attributeSet, 0) { } constructor(context: Context, attributeSet: AttributeSet? = null, defStyleAttr: Int = 0) : super(context, attributeSet, defStyleAttr) { orientation = VERTICAL mTabLayout = LinearLayout(context) mTabLayout.setBackgroundColor(Color.WHITE) mTabLayout.orientation = HORIZONTAL addView(mTabLayout, LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)) mTabParams = LayoutParams(0, LayoutParams.MATCH_PARENT) mTabParams.weight = 1.0f } fun setCurrentItem(position: Int) { mTabLayout.post(Runnable { mTabLayout.getChildAt(position).performClick() }) } fun setCurrentPosition(position: Int) { currentItemPosition = position } fun setOnClickItemMenu(onClickItemMenu: OnClickItemMenu) { this.onClickItemMenu = onClickItemMenu } fun initTabs() { for (i in 0 until BottomBarTab.titles.size) { addItem(BottomBarTab(context, i)) } } fun addItem(bottomBarTab: BottomBarTab) { bottomBarTab.setOnClickListener(object : OnClickListener { override fun onClick(view: View) { onItemSelect(bottomBarTab, view) } }) bottomBarTab.setTabPosition(mTabLayout.childCount, currentItemPosition) bottomBarTab.layoutParams = mTabParams mTabLayout.addView(bottomBarTab) bottomBarTabs.add(bottomBarTab) } fun onItemSelect(bottomBarTab: BottomBarTab, view: View?) { if (bottomBarTab.mTabPosition == currentItemPosition) return onClickItemMenu.onClickItem(bottomBarTab.mTabPosition, currentItemPosition) bottomBarTab.isSelected = true bottomBarTabs.get(currentItemPosition).isSelected = false currentItemPosition = bottomBarTab.mTabPosition } fun getItem(position: Int): BottomBarTab? { return if (bottomBarTabs.size < position) { null } else bottomBarTabs.get(position) } } ================================================ FILE: app/src/main/java/com/demo/antizha/ui/view/BottomBarTab.kt ================================================ package com.demo.antizha.ui.view import android.content.Context import android.graphics.Color import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView import com.demo.antizha.R class BottomBarTab(context: Context, i: Int) : FrameLayout(context) { private lateinit var mIcon: ImageView private lateinit var mTitle: TextView var mTabPosition: Int private set private val unselImages: IntArray private val selImages: IntArray private fun initTab(context: Context, i: Int) { val inflate: View = LayoutInflater.from(context) .inflate(R.layout.tab_bottom_bar, this as ViewGroup, true) mIcon = inflate.findViewById(R.id.iv_tab_bar) as ImageView mTitle = inflate.findViewById(R.id.tv_tab_bar) as TextView mIcon.setImageResource(unselImages[i]) mTitle.setText(titles[i]) } override fun setSelected(selected: Boolean) { super.setSelected(selected) if (selected) { mIcon.setImageResource(selImages[mTabPosition]) mTitle.setTextColor(Color.parseColor("#2946E6")) return } mIcon.setImageResource(unselImages[mTabPosition]) mTitle.setTextColor(Color.parseColor("#666666")) } fun setTabPosition(position: Int, currentPosition: Int) { mTabPosition = position if (position == currentPosition) { setSelected(true) } } companion object { val titles = arrayOf("首页", "骗局曝光", "我的") } init { mTabPosition = -1 unselImages = intArrayOf(R.mipmap.tab_home_unseled, R.mipmap.tab_xc_unseled, R.mipmap.tab_mine_unseled) selImages = intArrayOf(R.mipmap.tab_home_seled, R.mipmap.tab_xc_seled, R.mipmap.tab_mine_seled) initTab(context, i) } } ================================================ FILE: app/src/main/java/com/demo/antizha/util/AESUtil.kt ================================================ package com.demo.antizha.util import android.content.SharedPreferences import android.text.TextUtils import android.util.Base64 import com.demo.antizha.ui.HiCore import java.security.SecureRandom import javax.crypto.Cipher import javax.crypto.KeyGenerator import javax.crypto.SecretKeyFactory import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.PBEKeySpec import javax.crypto.spec.SecretKeySpec object AESUtil { private var cipher: Cipher? = null private val charSet = charset("UTF-8") private const val str_MD5 = "MD5" private const val str_AES = "AES" private const val KEY_ALGORITHM = "SHA1PRNG" private const val DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding" private const val PRIVATE_KEY_SIZE_BIT = 128 private const val PRIVATE_KEY_SIZE_BYTE = 16 private var cryptoSalt: ByteArray? = null private const val ACCEPT_TIME_SEPARATOR_SP = "," @Throws(Exception::class) private fun createSecretKey(str: String): ByteArray? { if (cryptoSalt == null || cryptoSalt!!.size != 32) { val sharedPreferences: SharedPreferences = HiCore.app.getSharedPreferences("crypto_info", 0) val string = sharedPreferences.getString("salt", "").toString() if (!TextUtils.isEmpty(string)) { cryptoSalt = splitString2ByteArray(string) } if (cryptoSalt == null || cryptoSalt!!.size != 32) { val bArr3 = ByteArray(32) SecureRandom().nextBytes(bArr3) sharedPreferences.edit().putString("salt", byteArray2SplitString(bArr3)).apply() cryptoSalt = bArr3 } } return SecretKeySpec(SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1") .generateSecret(PBEKeySpec(str.toCharArray(), cryptoSalt, 1000, 256)).encoded, str_AES).encoded } private fun splitString2ByteArray(str: String): ByteArray? { return splitString2ByteArray(str, "", 0) } private fun splitString2ByteArray(str: String, separator: String, default: Byte): ByteArray? { var separate = separator if (TextUtils.isEmpty(str)) { return null } if (TextUtils.isEmpty(separator)) { separate = ACCEPT_TIME_SEPARATOR_SP } val split = str.split(separate.toRegex()).toTypedArray() val length = split.size val bArr = ByteArray(length) for (i2 in 0 until length) { try { bArr[i2] = split[i2].toByte() } catch (unused: Exception) { bArr[i2] = default } } return bArr } private fun byteArray2SplitString(bArr: ByteArray?): String? { return byteArray2SplitString(bArr, null as String?) } private fun byteArray2SplitString(bArr: ByteArray?, separator: String?): String? { var separate = separator if (bArr == null) { return null } val length = bArr.size if (length <= 0) { return "" } if (TextUtils.isEmpty(separate)) { separate = ACCEPT_TIME_SEPARATOR_SP } val sb = StringBuilder() for (i in 0 until length) { sb.append(bArr[i].toString()) if (i != length - 1) { sb.append(separate) } } return sb.toString() } fun encrypt(seedkey: String, input: String): String { val seed = MD5Utils.getMd5Half(seedkey) return if (seed.length == PRIVATE_KEY_SIZE_BYTE) { try { cipherInit(seed, 1) byteArray2HexStr(cipher!!.doFinal(input.toByteArray(charSet))) } catch (err: Exception) { throw RuntimeException("AESUtil:encrypt fail!", err) } } else { throw RuntimeException("AESUtil:Invalid AES secretKey length (must be 16 bytes)") } } fun decrypt(seedkey: String, input: String): String { val seed = MD5Utils.getMd5Half(seedkey) return if (seed.length == PRIVATE_KEY_SIZE_BYTE) { try { cipherInit(seed, 2) String(cipher!!.doFinal(hexString2ByteArray(input)), charSet) } catch (e2: Exception) { throw RuntimeException("AESUtil:decrypt fail!", e2) } } else { throw RuntimeException("AESUtil:Invalid AES secretKey length (must be 16 bytes)") } } fun byteArray2HexStr(bArr: ByteArray): String { val sb = StringBuilder(bArr.size * 2) val length = bArr.size for (i in 0 until length) { sb.append(String.format("%02X", java.lang.Byte.valueOf(bArr[i]))) } return sb.toString() } private fun hexString2ByteArray(str: String): ByteArray { val bArr = ByteArray(str.length / 2) var i2 = 0 while (i2 < str.length) { val i3 = i2 + 2 bArr[i2 / 2] = str.substring(i2, i3).toInt(16).toByte() i2 = i3 } return bArr } private fun cipherInit(seed: String, opmode: Int) { try { val instance = SecureRandom.getInstance(KEY_ALGORITHM) instance.setSeed(seed.toByteArray()) KeyGenerator.getInstance(str_AES).init(PRIVATE_KEY_SIZE_BIT, instance) val secretKeySpec = SecretKeySpec(seed.toByteArray(), str_AES) cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM) cipher!!.init(opmode, secretKeySpec, IvParameterSpec(MD5Utils.getMd5Half(seed).toByteArray())) } catch (err: Exception) { throw RuntimeException("AESUtil:initParam fail!", err) } } @Throws(java.lang.Exception::class) fun cipherEncrypt(str: String, keySalt: String, iv: String): String { val instance = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM) val secretKeySpec = SecretKeySpec(keySalt.toByteArray(charSet), str_AES) instance.init(Cipher.ENCRYPT_MODE, secretKeySpec, IvParameterSpec(iv.toByteArray(charSet))) return Base64.encodeToString(instance.doFinal(str.toByteArray(charSet)), 0) } @Throws(java.lang.Exception::class) fun cipherDecrypt(str: String?, keySalt: String, iv: String): String { val instance = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM) val secretKeySpec = SecretKeySpec(keySalt.toByteArray(charSet), str_AES) instance.init(Cipher.DECRYPT_MODE, secretKeySpec, IvParameterSpec(iv.toByteArray(charSet))) return String(instance.doFinal(Base64.decode(str, 0)), charSet) } @Throws(java.lang.Exception::class) fun cipherEncrypt_ZeroPadding(str: String, keySalt: ByteArray, iv: String): String { val instance = Cipher.getInstance("AES/CBC/NoPadding") val blockSize = instance!!.blockSize val dataBytes: ByteArray = str.toByteArray(charSet) var plaintextLength = dataBytes.size if (plaintextLength % blockSize != 0) { plaintextLength += (blockSize - plaintextLength % blockSize) } val plaintext = ByteArray(plaintextLength) System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.size) val secretKeySpec = SecretKeySpec(keySalt, str_AES) instance.init(Cipher.ENCRYPT_MODE, secretKeySpec, IvParameterSpec(iv.toByteArray(charSet))) return Base64.encodeToString(instance.doFinal(plaintext), 0).trim() } @Throws(java.lang.Exception::class) fun cipherDecrypt_ZeroPadding(str: String?, keySalt: ByteArray, iv: String): String { val instance = Cipher.getInstance("AES/CBC/NoPadding") val secretKeySpec = SecretKeySpec(keySalt, str_AES) instance.init(Cipher.DECRYPT_MODE, secretKeySpec, IvParameterSpec(iv.toByteArray(charSet))) return String(instance.doFinal(Base64.decode(str, 0)), charSet).trimEnd(0.toChar()) } } ================================================ FILE: app/src/main/java/com/demo/antizha/util/AddressBean.kt ================================================ package com.demo.antizha.util import android.app.Activity import android.text.TextUtils import android.view.Gravity import android.view.View import android.widget.LinearLayout import android.widget.TextView import cn.qqtheme.framework.entity.City import cn.qqtheme.framework.entity.County import cn.qqtheme.framework.entity.Province import cn.qqtheme.framework.picker.AddressPicker import cn.qqtheme.framework.picker.AddressPicker.OnAddressPickListener import com.demo.antizha.R import com.google.gson.Gson import com.google.gson.reflect.TypeToken import java.io.InputStreamReader object AddressBean { open class HiAddressListener : OnAddressPickListener { override fun onAddressPicked(province: Province?, city: City?, county: County?) {} open fun onClear() {} } open class AreaBase { var code: String = "" var name: String = "" } //为了避免和库里的命名重了,加个C //区 class HiDistrict : AreaBase() { var longitude: String = "" var latitude: String = "" } //市 class HiCity : AreaBase() { var townList: List = ArrayList() } //省 class HiProvince : AreaBase() { var cityList: List = ArrayList() } private var hiProvinces: List = ArrayList() //address直接导出的结构 private var provinces: ArrayList = ArrayList() //地区选择器使用的结构 fun initProvince() { val inputStream = Utils.openfile("address.txt") hiProvinces = Gson().fromJson(InputStreamReader(inputStream, "UTF-8"), object : TypeToken>() {}.type) initProvinceList() inputStream.close() } fun getHiProvince(): List { if (hiProvinces.isEmpty()) { initProvince() } return hiProvinces } fun getProvince(): ArrayList { if (hiProvinces.isEmpty()) { initProvince() } return provinces } fun createAddressPicker(activity: Activity, region: String, showClear: Boolean, listener: HiAddressListener): AddressPicker { val picker = AddressPicker(activity, getProvince()) picker.setHideProvince(false) picker.setHideCounty(false) picker.setTextColor(activity.resources.getColor(R.color.colorGray, null)) picker.setSubmitTextColor(activity.resources.getColor(R.color.black, null)) picker.setCancelTextColor(activity.resources.getColor(R.color.colorGray, null)) picker.setDividerColor(activity.resources.getColor(R.color.colorGray, null)) picker.setColumnWeight(0.25f, 0.5f, 0.25f) if (showClear) { val tvTitle = TextView(picker.context) tvTitle.layoutParams = LinearLayout.LayoutParams(-1, -1) tvTitle.visibility = View.VISIBLE tvTitle.text = "清空" tvTitle.gravity = Gravity.CENTER tvTitle.setTextColor(activity.resources.getColor(R.color.black, null)) tvTitle.setOnClickListener(object : View.OnClickListener { override fun onClick(view: View?) { picker.dismiss() listener.onClear() } }) picker.titleView = tvTitle } if (!TextUtils.isEmpty(region)) { val regions = TextUtils.split(region, "\\.") if (regions.size == 3) { picker.setSelectedItem(regions[0], regions[1], regions[2]) } } picker.setOnAddressPickListener(listener) return picker } private fun initProvinceList() { for (prov in hiProvinces) { val province = Province() province.areaId = prov.code province.areaName = prov.name for (cit in prov.cityList) { val city = City() city.areaId = cit.code city.areaName = cit.name city.provinceId = prov.code for (town in cit.townList) { val county = County() county.areaId = town.code county.areaName = town.name county.cityId = cit.code city.counties.add(county) } province.cities.add(city) } provinces.add(province) } } } ================================================ FILE: app/src/main/java/com/demo/antizha/util/AnimUtils.kt ================================================ package com.demo.antizha.util import android.animation.ObjectAnimator import android.view.animation.LinearInterpolator import android.widget.ImageView object AnimUtils { private const val DURATION = 250 /** * 箭头旋转动画 * * @param arrow * @param isFlag */ fun rotateArrow(arrow: ImageView?, isFlag: Boolean) { val srcValue: Float val targetValue: Float if (isFlag) { srcValue = 0f targetValue = 180f } else { srcValue = 180f targetValue = 360f } val objectAnimator = ObjectAnimator.ofFloat(arrow, "rotation", srcValue, targetValue) objectAnimator.duration = DURATION.toLong() objectAnimator.interpolator = LinearInterpolator() objectAnimator.start() } } ================================================ FILE: app/src/main/java/com/demo/antizha/util/AppUtil.kt ================================================ package com.demo.antizha.util import android.annotation.SuppressLint import android.app.Activity import android.app.AppOpsManager import android.app.usage.StorageStatsManager import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent import android.content.pm.PackageInfo import android.graphics.Bitmap import android.graphics.Bitmap.CompressFormat import android.graphics.BitmapFactory import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import android.net.Uri import android.os.Build import android.os.Parcel import android.os.Parcelable import android.provider.Settings import androidx.core.graphics.drawable.toBitmap import com.demo.antizha.ui.HiCore import java.io.ByteArrayOutputStream object AppUtil { internal object BytesBitmap { fun getBitmap(data: ByteArray): Bitmap { return BitmapFactory.decodeByteArray(data, 0, data.size) } fun getBytes(bitmap: Bitmap): ByteArray { val baops = ByteArrayOutputStream() bitmap.compress(CompressFormat.PNG, 0, baops) return baops.toByteArray() } } var gid: Int = 0 class AppInfoBean : Parcelable { var id = 0 var selected: Boolean = false var apkName: String = "" var appName: String = "" var version: String = "" var appIcon: Drawable? = null var checkState: Int = 0 var size: Long = 0L constructor(source: Parcel) { id = source.readInt() apkName = source.readString().toString() appName = source.readString().toString() version = source.readString().toString() appIcon = BitmapDrawable(HiCore.app.resources, BytesBitmap.getBitmap(source.createByteArray()!!)) checkState = source.readInt() size = source.readLong() } constructor(apkName: String, appName: String, version: String, appIcon: Drawable) { this.apkName = apkName this.appName = appName this.version = version this.appIcon = appIcon id = ++gid } override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeInt(id) parcel.writeString(apkName) parcel.writeString(appName) parcel.writeString(version) parcel.writeByteArray(BytesBitmap.getBytes(appIcon!!.toBitmap())) parcel.writeInt(checkState) parcel.writeLong(size) } override fun describeContents(): Int { return 0 } companion object CREATOR : Parcelable.Creator { override fun createFromParcel(parcel: Parcel): AppInfoBean { return AppInfoBean(parcel) } override fun newArray(size: Int): Array { return arrayOfNulls(size) } } } private var list: ArrayList = ArrayList() private val apkNames: ArrayList = ArrayList() @SuppressLint("ServiceCast") fun getAppinfos(): ArrayList { if (list.size == 0) { val pm = HiCore.context.packageManager val sm = HiCore.context.getSystemService(Context.STORAGE_STATS_SERVICE) as StorageStatsManager val packageInfos: List = pm.getInstalledPackages(0) val intent = Intent("android.intent.action.MAIN", null as Uri?) intent.addCategory("android.intent.category.LAUNCHER") val queryIntentActivities = pm.queryIntentActivities(intent, 0) val apkNameLogs: java.util.ArrayList = java.util.ArrayList() for (activity in queryIntentActivities) { if (!apkNameLogs.contains(activity.activityInfo.packageName)) { apkNameLogs.add(activity.activityInfo.packageName) } } for (packageInfo in packageInfos) { if ((packageInfo.applicationInfo.flags and 1) != 0) continue if (!apkNameLogs.contains(packageInfo.packageName)) continue val appBean = AppInfoBean(packageInfo.packageName, packageInfo.applicationInfo.loadLabel(pm).toString(), packageInfo.versionName, packageInfo.applicationInfo.loadIcon(pm)) list.add(appBean) apkNames.add(packageInfo.packageName) val ai = pm.getApplicationInfo(packageInfo.packageName, 0) val storageStats = sm.queryStatsForUid(ai.storageUuid, ai.uid) appBean.size = storageStats.appBytes } } return list } fun contains(name: String): Boolean { return apkNames.contains(name) } fun getAppinfo(name: String): AppInfoBean { return list[apkNames.indexOf(name)] } @Suppress("DEPRECATION") fun checkPermission(activity: Activity, ischeckOpen: Boolean): Boolean { val pm = HiCore.context.packageManager val appInfo = pm.getApplicationInfo(HiCore.context.packageName, 0) val appOpsManager = HiCore.context.getSystemService(Context.APP_OPS_SERVICE) as AppOpsManager val op = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) appOpsManager.unsafeCheckOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, appInfo.uid, appInfo.packageName) else appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, appInfo.uid, appInfo.packageName) val opened = (op == AppOpsManager.MODE_ALLOWED) if (ischeckOpen == opened) return true val intent = Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS) intent.data = Uri.fromParts("package", activity.packageName, null) try { activity.startActivity(intent) } catch (e: ActivityNotFoundException) { e.printStackTrace() } return false } } ================================================ FILE: app/src/main/java/com/demo/antizha/util/CRC64.kt ================================================ package com.demo.antizha.util //CRC-64/XZ class CRC64 { private var crc: Long = -1 companion object { private const val poly = -0x3693a86a2878f0beL private val crcTable = LongArray(256) fun digest(buf: ByteArray): CRC64 { val crc = CRC64() crc.update(buf) return crc } init { for (b in crcTable.indices) { var r = b.toLong() for (i in 0..7) { r = if (r and 1 == 1L) (r ushr 1) xor poly else r ushr 1 } crcTable[b] = r } } } fun update(b: Byte) { crc = crcTable[b.toInt() xor crc.toInt() and 0xFF] xor (crc ushr 8) } @JvmOverloads fun update(buf: ByteArray, offset: Int = 0, len: Int = buf.size) { var off = offset val end = off + len while (off < end) crc = crcTable[buf[off++].toInt() xor crc.toInt() and 0xFF] xor (crc ushr 8) } val value: Long get() = crc.inv() val bytes: ByteArray get() { val value = crc.inv() val b = ByteArray(8) for (i in 0..7) { b[7 - i] = (value ushr i * 8).toByte() } return b } } ================================================ FILE: app/src/main/java/com/demo/antizha/util/DataCleanManager.kt ================================================ package com.demo.antizha.util import android.content.Context import android.os.Environment import java.io.File import java.math.BigDecimal object DataCleanManager { private fun fileSize(file: File?): Long { if (file == null) return 0 var sizeSum: Long = 0 try { val listFiles = file.listFiles() ?: return 0 for (i in listFiles.indices) { val fileSize = if (listFiles[i].isDirectory) { fileSize(listFiles[i]) } else { listFiles[i].length() } sizeSum += fileSize } } catch (e: Exception) { e.printStackTrace() } return sizeSum } private fun fileSize2String(size: Long): String { val sizeKB = size / 1024 if (sizeKB.toDouble() < 1.0) { return sizeKB.toString() + "kB" } val sizeMB = sizeKB.toDouble() / 1024.0 if (sizeMB < 1.0) { val bigDecimal = BigDecimal(sizeKB.toString()) return bigDecimal.setScale(1, 4).toPlainString().toString() + "KB" } val sizeGB = sizeMB / 1024.0 if (sizeGB < 1.0) { val bigDecimal = BigDecimal(sizeMB.toString()) return bigDecimal.setScale(1, 4).toPlainString().toString() + "MB" } val sizeTB = sizeGB / 1024.0 if (sizeTB < 1.0) { val bigDecimal = BigDecimal(sizeGB.toString()) return bigDecimal.setScale(2, 4).toPlainString().toString() + "GB" } val bigDecimal = BigDecimal(sizeTB) return bigDecimal.setScale(2, 4).toPlainString().toString() + "TB" } fun getCheckSize(context: Context): String { var size = fileSize(context.cacheDir) if (Environment.getExternalStorageState() == "mounted") { size += fileSize(context.externalCacheDir) } return fileSize2String(size) } } ================================================ FILE: app/src/main/java/com/demo/antizha/util/DecoderException.java ================================================ package com.demo.antizha.util; /** * Exception thrown if an attempt is made to decode invalid data, or some other failure occurs. */ public class DecoderException extends IllegalStateException { private final Throwable cause; DecoderException(String msg, Throwable cause) { super(msg); this.cause = cause; } public Throwable getCause() { return cause; } } ================================================ FILE: app/src/main/java/com/demo/antizha/util/DialogUtils.kt ================================================ package com.demo.antizha.util import android.app.Activity import android.app.Dialog import android.content.Context import android.content.Intent import android.graphics.Color import android.net.Uri import android.os.Handler import android.os.Looper import android.text.Html import android.text.TextUtils import android.text.method.LinkMovementMethod import android.view.View import android.widget.Button import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import com.demo.antizha.ITimerState import com.demo.antizha.R import com.demo.antizha.interfaces.IClickListener import com.demo.antizha.interfaces.IOneClickListener import com.demo.antizha.ui.BaseDialog import com.demo.antizha.ui.DownTimer import com.demo.antizha.ui.ProgressDialogBar class DialogUtils { companion object { private var progressDialogBar: ProgressDialogBar? = null class DialogDownTimer internal constructor( time: Long, interval: Long, val context: Context, val timerState: ITimerState) : DownTimer(time, interval) { override fun onTimeChang(j: Long) { if ((context as Activity).isFinishing) { return } timerState.timeCount((j / 1000).toInt()) } override fun onTimer() { timerState.timeOver() } } class delayEnableTimerState internal constructor( val button: Button, val buttonTitle: String) : ITimerState { override fun timeCount(i: Int) { val button = button button.text = Html.fromHtml(buttonTitle + "   (" + i + "s)", Html.FROM_HTML_MODE_LEGACY) } override fun timeOver() { button.isEnabled = true this.button.text = buttonTitle this.button.setTextColor(Color.parseColor("#2946E6")) } } fun showNormalDialog(context: Context?, title: String?, subTitle: String?, cancelText: String?, confirmText: String?, iClickListener: IClickListener?): Dialog? { return showBtDialog(context, title, subTitle, cancelText, confirmText, -1, -1, iClickListener) } fun showBtDialog(context: Context?, title: String?, subTitle: String?, cancelText: String?, confirmText: String?, cancelColor: Int, confirmColor: Int, iClickListener: IClickListener?): Dialog? { if (context == null) { return null } val baseDialog = BaseDialog(context, R.style.base_dialog_style) baseDialog.setContentView(R.layout.custom_bt_dialog) baseDialog.setGravityLayout(2) baseDialog.widthDialogdp = -2.0f baseDialog.heightDialogdp = -2.0f baseDialog.setCancelable(false) baseDialog.setCanceledOnTouchOutside(false) baseDialog.initOnCreate() baseDialog.show() val btnCancel = baseDialog.findViewById(R.id.cancel_btn) as Button val btnConfirm = baseDialog.findViewById(R.id.confirm_btn) as Button (baseDialog.findViewById(R.id.customdialog_title) as TextView).text = title (baseDialog.findViewById(R.id.customdialog_subtitle) as TextView).text = subTitle btnCancel.text = cancelText btnConfirm.text = confirmText if (cancelColor == -1) { btnCancel.setTextColor(-14072090) } else { btnCancel.setTextColor(cancelColor) } if (confirmColor == -1) { btnConfirm.setTextColor(-14072090) } else { btnConfirm.setTextColor(confirmColor) } btnCancel.setOnClickListener(object : View.OnClickListener { private var mBaseDialog: BaseDialog? = null override fun onClick(view: View?) { iClickListener?.cancelBtn() mBaseDialog?.dismiss() } init { mBaseDialog = baseDialog } }) btnConfirm.setOnClickListener(object : View.OnClickListener { private var mBaseDialog: BaseDialog? = null override fun onClick(view: View?) { iClickListener?.clickOKBtn() mBaseDialog?.dismiss() } init { mBaseDialog = baseDialog } }) return baseDialog } fun showBtTitleDialog(context: Context?, title: String?, subTitle: String?, cancelText: String?, confirmText: String?, cancelColor: Int, confirmColor: Int, enableCancel: Boolean, iClickListener: IClickListener?): Dialog? { if (context == null) { return null } val baseDialog = BaseDialog(context, R.style.base_dialog_style) baseDialog.setContentView(R.layout.custom_bt_title_dialog) baseDialog.setGravityLayout(2) baseDialog.widthDialogdp = -2.0f baseDialog.heightDialogdp = -2.0f baseDialog.setCancelable(enableCancel) baseDialog.setCanceledOnTouchOutside(enableCancel) baseDialog.initOnCreate() baseDialog.show() val btnCancel = baseDialog.findViewById(R.id.cancel_btn) as Button val btnConfirm = baseDialog.findViewById(R.id.confirm_btn) as Button (baseDialog.findViewById(R.id.customdialog_title) as TextView).text = title (baseDialog.findViewById(R.id.customdialog_subtitle) as TextView).text = subTitle btnCancel.text = cancelText btnConfirm.text = confirmText if (!TextUtils.isEmpty(subTitle)) { (baseDialog.findViewById(R.id.ll_subtit) as LinearLayout).visibility = View.VISIBLE } if (cancelColor == -1) { btnCancel.setTextColor(-14072090) } else { btnCancel.setTextColor(cancelColor) } if (confirmColor == -1) { btnConfirm.setTextColor(-14072090) } else { btnConfirm.setTextColor(confirmColor) } btnCancel.setOnClickListener(object : View.OnClickListener { private var mBaseDialog: BaseDialog? = null override fun onClick(view: View?) { iClickListener?.cancelBtn() mBaseDialog?.dismiss() } init { mBaseDialog = baseDialog } }) btnConfirm.setOnClickListener(object : View.OnClickListener { private var mBaseDialog: BaseDialog? = null override fun onClick(view: View?) { iClickListener?.clickOKBtn() mBaseDialog?.dismiss() } init { mBaseDialog = baseDialog } }) return baseDialog } fun showOneClickDialog(activity: Activity, title: String, subTitle: String, buttonText: String, iOneClickListener: IOneClickListener?): Dialog? { if (activity.isFinishing) { return null } val baseDialog = BaseDialog(activity, R.style.base_dialog_style) baseDialog.setContentView(R.layout.custom_dialog_one) baseDialog.setGravityLayout(2) baseDialog.widthDialog = (-2.0).toFloat() baseDialog.heightDialog = (-2.0).toFloat() baseDialog.setCancelable(false) baseDialog.setCanceledOnTouchOutside(false) baseDialog.initOnCreate() baseDialog.show() val subtitle = baseDialog.findViewById(R.id.subtitle) as TextView val button = baseDialog.findViewById(R.id.button) as Button button.text = buttonText (baseDialog.findViewById(R.id.title) as TextView).text = title if (!TextUtils.isEmpty(subTitle)) { subtitle.visibility = View.VISIBLE subtitle.text = subTitle } button.setOnClickListener(object : View.OnClickListener { private var mBaseDialog: BaseDialog? = null override fun onClick(view: View?) { iOneClickListener?.clickOKBtn() mBaseDialog?.dismiss() } init { mBaseDialog = baseDialog } }) return baseDialog } fun showProgressDialog(str: String?, z: Boolean, activity: Activity?) { if (activity != null) { try { if (!activity.isFinishing) { if (progressDialogBar == null) { progressDialogBar = ProgressDialogBar.create(activity)!! } progressDialogBar!!.setProgress(str) progressDialogBar!!.setCanceledOnTouchOutside(false) progressDialogBar!!.setCancelable(z) progressDialogBar!!.show() } } catch (unused: Exception) { } } } fun destroyProgressDialog() { try { if (progressDialogBar != null) { if (progressDialogBar!!.isShowing) { progressDialogBar!!.dismiss() } progressDialogBar = null } } catch (e: java.lang.Exception) { e.printStackTrace() } } fun showInterlinkingDialog(activity: Activity?, title: String?, subTitle: String?, cancelText: String?, confirmText: String?, iClickListener: IClickListener?): Dialog? { return showInterlinkingDialog(activity, title, subTitle, cancelText, confirmText, -1, -1, iClickListener) } fun showInterlinkingDialog(activity: Activity?, title: String?, subTitle: String?, cancelText: String?, confirmText: String?, cancelColor: Int, confirmColor: Int, iClickListener: IClickListener?): Dialog? { return showInterlinkingDialog(activity, title, subTitle as CharSequence?, false, cancelText, confirmText, cancelColor, confirmColor, iClickListener) } fun showInterlinkingDialog(activity: Activity?, title: String?, subTitle: CharSequence?, interlinking: Boolean, cancelText: String?, confirmText: String?, cancelColor: Int, confirmColor: Int, iClickListener: IClickListener?): Dialog? { if (activity == null || activity.isFinishing) { return null } val baseDialog = BaseDialog(activity, R.style.base_dialog_style) baseDialog.setContentView(R.layout.custom_bt_dialog) baseDialog.setGravityLayout(2) baseDialog.widthDialogdp = -2.0f baseDialog.heightDialogdp = -2.0f baseDialog.setCancelable(false) baseDialog.setCanceledOnTouchOutside(false) baseDialog.initOnCreate() baseDialog.show() val tvTitle = baseDialog.findViewById(R.id.customdialog_title) val tvSubTitle = baseDialog.findViewById(R.id.customdialog_subtitle) val btCancel = baseDialog.findViewById