android开发实战之做手机号和邮编查询小程序

简介:


我在前年做了个查询手机号和邮编地理位置的小程序,已经放到mm和天翼空间上卖了,应这次CU征文我就介绍一下这个项目的详细内幕。

首先最终上效果图

手机号区号归属

 

程序代码结构

手机号区号归属2

1.开发准备

1)开发过程首先从网络上找手机号数据库,我找到的是mdb(微软的access),越新越好

2)android的数据库是sqlite,因此我们必须在电脑上创建好数据库,导入到程序里,到sqlite.org上下载windows版的sqlite3,创建好数据库mobile.db:

全国的城市列表名称,使用id作为唯一标识,可以减少数据库大小,因为android程序中文件大小不能超过1MB

点击(此处)折叠或打开

  1. CREATE TABLE city(id int,name text);

手机号区号归属4

--运营商列表

 

  1. CREATE TABLE isp(id int,name text);

手机号区号归属3

---所有城市的邮政编码

 

  1. CREATE TABLE code_city(code text,city_id integer);

手机号区号归属5

--所有手机号段对应的运营商和城市列表,这个表公有44400条数据,若是把isp和city的id作为两个字段的话,会超过1MB,我把isp和city的id进行合并成一个字段(最高位为ispid(isp只有3个),后三位为city(357个)的id)能够省下200kb的大小,最终整个库为806KB

 

  1. CREATE TABLE mobile (start_num integer, end_num integer, isp_city_id integer);--所有手机号段对应的运营商和城市列表

2.开始开发

新建工程,我选择的是1.6,只是两年前的最新版本,我目前也懒得更新了

手机号区号归属6

2.1 AndroidManifest.xml 这个是android里最重要的文件,这个文件类似于ssh里的applicationContext.xml之类的定义了活动和权限等等信息,我基本上没有改这个文件,因为是单机的不需要调用网络蓝牙和文件写入之类的权限

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.       package="yifangyou.mobile_query"
  4.       android:versionCode="1"
  5.       android:versionName="1.0">
  6. <application android:icon="@drawable/icon" android:label="@string/app_name">
  7. <activity android:label="@string/app_name" android:name=".mobile_query">
  8. <intent-filter>
  9. <action android:name="android.intent.action.MAIN" />
  10. <category android:name="android.intent.category.LAUNCHER" />
  11. </intent-filter>
  12. </activity>
  13.  
  14. </application>
  15. <uses-sdk android:minSdkVersion="2" />
  16.  
  17. </manifest>

2.2,在res目录下建立raw目录把mobile.db放入

2.3,在res/values/strings.xml是保存程序中用到的中文字,代码里最好不要写中文,便于实现多语言版本

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string name="app_name">手机号区号归属</string>
  4. <string name="searching_txt">请稍后,查询中...</string>
  5. <string name="search_complete_txt">查询完毕</string>
  6. <string name="search_txt">查询</string>
  7. <string name="result_txt">查询结果</string>
  8. <string name="enter_txt">手机号或者区号</string>
  9. <string name="id_empty_txt">手机号或者区号为空!</string>
  10. <string name="id_error_txt">手机号或者区号错误</string>
  11. <string name="enter_again_txt">请输入手机号或者区号</string>
  12. <string name="mobile_error_txt">手机号必须是11位的数字串</string>
  13. <string name="telphone_error_txt">区号必须是大于等于3位的数字串</string>
  14. <string name="location_txt">所属地区:</string>
  15. <string name="unknown_txt">未知</string>
  16. <string name="about_line_txt">开发者:yifangyou\n发布时间:2010年07月\nCopyright?2010 yifangyou\n</string>
  17. <string name="help_line_txt">本程序实现查询手机号或者区号对应的地理位置信息,精确到省市和运营商,信息库2010年07月01日整理完成,共18万条数据,包含最新的152、186、188、189号码段的归属地数据。\n使用方法:在输入框内输入11位手机号或者3、4位区号,点击搜索即可</string>
  18. <string name="about_txt">关于</string>
  19. <string name="exit_txt">退出</string>
  20. <string name="help_txt">帮助</string>
  21. <string name="exit_info_txt">已经退出,谢谢使用</string>
  22. <string name="clean_txt">清空</string>
  23. <string name="ok_txt">确定</string>
  24. </resources>

2.4建立菜单,如下面的@+id/help表示菜单项的id,在程序代码中需要响应这个菜单时用到

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item android:id="@+id/help"
  4.         android:alphabeticShortcut="h"
  5.         android:title="帮助" />
  6. <item android:id="@+id/about"
  7.         android:alphabeticShortcut="a"
  8.         android:title="关于" />
  9. <item android:id="@+id/exit"
  10.         android:alphabeticShortcut="e"
  11.         android:title="退出" />
  12. </menu>

2.4页面布局,我这个程序界面比较简单用线性竖向布局

main.xml:

 

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_;fill_parent"
  5.     android:layout_height="fill_parent"
  6. >
  7. <LinearLayout
  8.     android:orientation="horizontal"
  9.     android:layout_;fill_parent"
  10.     android:layout_height="wrap_content"
  11. >
  12. <TextView
  13.          android:layout_;wrap_content"
  14.          android:layout_height="wrap_content"
  15.          android:text="@string/enter_txt"
  16. />
  17. <EditText android:id="@+id/search"
  18.          android:layout_;wrap_content"
  19.          android:layout_height="wrap_content"
  20.          android:text=""
  21.          android:layout_weight="1.0"
  22. />
  23. <Button android:id="@+id/submit"
  24.         android:layout_;wrap_content"
  25.         android:layout_height="wrap_content"
  26.         android:layout_alignParentRight="true"
  27.         android:text="@string/search_txt">
  28. </Button>
  29. </LinearLayout>
  30. <TextView
  31.          android:layout_;fill_parent"
  32.          android:layout_height="wrap_content"
  33.          android:textColor="#99FF0000"
  34.          android:text="@string/result_txt"
  35. />
  36. <TextView android:id="@+id/result"
  37.          android:layout_;fill_parent"
  38.          android:layout_height="wrap_content"
  39.          android:textColor="#9900FF00"
  40.          android:text=""
  41. />
  42. <Button android:id="@+id/clean"
  43.         android:layout_;wrap_content"
  44.         android:layout_height="wrap_content"
  45.         android:layout_alignParentRight="true"
  46.         android:text="@string/clean_txt"/>
  47. </LinearLayout>

2.5主程序

1)首先对各个按钮进行设置监听事件,里面的R.id.xxx是对应main.xml

 

  1. public void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3.         setContentView(R.layout.main);//加载布局文件main.xml
  4.         dbm = new DBManager(this);//这是初始化数据库操作类
  5.         search_et = (EditText) findViewById(R.id.search);
  6.         result_et = (TextView) findViewById(R.id.result);
  7. Button btn = (Button) findViewById(R.id.submit);//定义查询按钮的事件
  8.         btn.setOnClickListener(new OnClickListener() {
  9. public void onClick(View v) {
  10.                 result_et.setText(getString(R.string.searching_txt));    //读取输入框的数据库
  11. search();
  12. }
  13. });
  14. Button clean_btn=(Button)findViewById(R.id.clean);
  15.         clean_btn.setOnClickListener(new OnClickListener(){
  16. public void onClick(View v){
  17.                 search_et.setText("");
  18. }
  19. });
  20.         isp_names=dbm.get_isp_name();
  21.         city_names=dbm.get_city_name();
  22. }

菜单显示菜单和设置菜单事件

  1. public boolean onCreateOptionsMenu(Menu menu) {
  2. super.onCreateOptionsMenu(menu);
  3. try {
  4.             MenuInflater inflater = getMenuInflater();
  5. inflater.inflate(R.menu.index, menu);
  6. } catch (Exception e) {
  7.  
  8. }
  9. return true;
  10. }
  11.  
  12. public boolean onOptionsItemSelected(MenuItem item) {
  13. super.onOptionsItemSelected(item);
  14. int id = item.getItemId();
  15. switch (id) {
  16. case R.id.help:
  17.             showHelp();
  18. break;
  19. case R.id.about:
  20.             showAbout();
  21. break;
  22. default:
  23.             alert(getString(R.string.app_name)
  24. + getString(R.string.exit_info_txt));
  25. finish();
  26. break;
  27. }
  28. return true;
  29. }

剩下的就是查询数据库了

注意由于我使用的库是放在raw下,android无法把这个文件作为数据库(不知道为什么),我的解决是把这个文件写到android的数据库库能够读到的地方(一般是程序的安装目录下的files下即可)去

 

  1. public DBManager(Context context) {
  2. this.context = context;
  3. try {
  4.             dbpath = context.getPackageManager().getApplicationInfo(
  5. context.getPackageName(), 0).dataDir
  6. + "/files/" + DB_NAME;
  7.             initDB();
  8.             db = SQLiteDatabase.openOrCreateDatabase(dbpath, null);
  9. } catch (NameNotFoundException e) {
  10.             e.printStackTrace();
  11. }
  12. }
  13.  
  14. public boolean initDB() {
  15. java.io.File f = new java.io.File(dbpath);
  16. if (f.exists()) {
  17. return true;
  18. }
  19. FileOutputStream stream;
  20. try {
  21. stream = context.openFileOutput(DB_NAME, Context.MODE_PRIVATE);
  22.             fp = context.getResources().openRawResource(R.raw.mobile);
  23. try {
  24. int size = fp.available();
  25. byte[] buffer = new byte[size];
  26.                 fp.read(buffer);
  27. stream.write(buffer);
  28.                 fp.close();
  29. stream.close();
  30. } catch (IOException e1) {
  31.                 e1.printStackTrace();
  32. return false;
  33. }
  34. } catch (FileNotFoundException e) {
  35. // TODO Auto-generated catch block
  36.             e.printStackTrace();
  37. }
  38. return false;
  39. }


     本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/1032046 ,如需转载请自行联系原作者

相关文章
|
1月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
288 76
|
16天前
|
监控 前端开发 小程序
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
77 11
|
23天前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
17天前
|
人工智能 开发框架 小程序
工会成立100周年纪念,开发职工健身AI运动小程序、APP方案推荐
为庆祝中华全国总工会成立100周年,特推出基于AI技术的智能健身系统,以小程序和APP形式呈现,助力职工健康生活。方案包括:1) 小程序插件,支持多种运动识别,开箱即用;2) APP插件,提供更高精度的运动检测;3) 成熟的「AI乐运动」系统,支持赛事活动管理。这些方案满足不同需求,推动全民健身体验升级,彰显工会对职工健康的关怀。
|
26天前
|
人工智能 小程序 NoSQL
【一步步开发AI运动小程序】二十一、如何将AI运动项目配置持久化到后端?
本文介绍基于云智「Ai运动识别引擎」的运动配置持久化方案,旨在优化小程序或Uni APP中AI运动识别能力。通过将运动检测参数(如`Key`、`Name`、`TickMode`、`rules`或`samples`)持久化到后端,可避免因频繁调整运动参数而重新发布应用,提升用户体验。持久化数据结构支持规则和姿态样本存储,适用于关系数据库、文件或文档数据库(如MongoDB)。此外,云智还提供运动自动适配工具及「AI乐运动」产品,助力快速实现AI体育、全民健身等场景。
|
23天前
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
|
1月前
|
人工智能 自然语言处理 小程序
技术小白如何利用DeepSeek半小时开发微信小程序?
通过通义灵码的“AI程序员”功能,即使没有编程基础也能轻松创建小程序或网页。借助DeepSeek V3和R1满血版模型,用户只需用自然语言描述需求,就能自动生成代码并优化程序。例如,一个文科生仅通过描述需求就成功开发了一款记录日常活动的微信小程序。此外,通义灵码还提供智能问答模式,帮助用户解决开发中的各种问题,极大简化了开发流程,让普通人的开发体验更加顺畅。
906 11
技术小白如何利用DeepSeek半小时开发微信小程序?
|
1月前
|
人工智能 小程序 前端开发
【一步步开发AI运动小程序】十八、如何识别用户上传图片中的人体、运动、动作、姿态?
【云智AI运动识别小程序插件】为小程序提供人体、运动及姿态检测的AI能力,本地引擎支持10余种运动,无需后台服务,具备快速、低成本等优势。本文介绍如何通过Canvas方案读取用户上传图片的像素数据,实现人体检测与姿态分析功能,代码简单高效,适合快速集成。更多内容欢迎交流!
|
30天前
|
人工智能 小程序 前端开发
【一步步开发AI运动小程序】十九、运动识别中如何解析RGBA帧图片?
本文介绍了如何将相机抽取的RGBA帧图像解析为`.jpg`或`.png`格式,适用于体测、赛事等场景。首先讲解了RGBA图像结构,其为一维数组,每四个元素表示一个像素的颜色与透明度值。接着通过`uni.createOffscreenCanvas()`创建离屏画布以减少绘制干扰,并提供代码实现,将RGBA数据逐像素绘制到画布上生成图片。最后说明了为何不直接使用拍照API及图像转换的调用频率建议,强调应先暂存帧数据,运动结束后再进行转换和上传,以优化性能。
|
1月前
|
小程序 JavaScript 前端开发
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
259 11

热门文章

最新文章

下一篇
oss创建bucket