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
================================================
.*:id
http://schemas.android.com/apk/res/android
.*:name
http://schemas.android.com/apk/res/android
.*
http://schemas.android.com/apk/res/android
ANDROID_ATTRIBUTE_ORDER
================================================
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