Android-手机归属地和座机归属地查询

在开发Android项目 的时候,有个查询手机和座机归属地的需求,然而Android本身并没有发现提供查询归属地的数据库,所以就需要我们自己来想办法查询来满足项目的需求。

我最初的想法,就是把这些归属地数据存到一个普通的文件,文件内容可以用JSON格式的数据格式,然后每次启动App的时候把文件的JSON内容转换成Java的对象,Google提供了一款工具,可以直接把JSON的字符串转换成我们定义好的Class类,比Java提供的JsonObject好很多,然而我考虑到数据库的大小和查询效率,还是决定使用数据库查询。

Goole的转换JSON的工具是Gson,下载链接:http://download.csdn.net/detail/qxs965266509/8367275

使用方法:http://blog.csdn.net/qxs965266509/article/details/42774691

首先,需要下载归属地的数据库:http://download.csdn.net/detail/qxs965266509/8367219

把数据库DB文件存放到assets或者raw文件中

在启动启动后,需要把DB文件拷贝到Sd卡的中自己定义的目录中,当然你可能会疑问,为什么别人的都是拷贝到data文件下的项目文件中的DataBases文件中,而我却没有这么做?原因是:查看该目录需要root权限,当然这不是主要原因,而是在我测试的时候我把整个DB文件复制到data文件下的项目文件中时,并没有把整个DB文件复制过去,而是一部分,我觉得应该是文件太大的原因,所以考虑复制到SD卡中。

复制代码如下:

        public static final String DB_NAME = "callHomeDB.db";

	private int BUFFER_SIZE = 1024;

	private String getDirPath() {
		String path = fileHandler.sdcardFolder.getAbsolutePath();
		return path;
	}

	private void copyContactLocation() {
		try {
			String path = getDirPath() + "/" + DB_NAME;
			File file = new File(path);
			if (!file.exists()) {
				InputStream is = MainActivity.instance.getResources()
						.getAssets().open(DB_NAME);
				FileOutputStream fos = new FileOutputStream(path);
				byte[] buffer = new byte[BUFFER_SIZE];
				int count = 0;
				while ((count = is.read(buffer)) > 0) {
					fos.write(buffer, 0, count);
				}
				fos.close();
				is.close();
			}
		} catch (FileNotFoundException e) {
			log.e("File not found");
			e.printStackTrace();
		} catch (IOException e) {
			log.e("IO exception");
			e.printStackTrace();
		}

	}

下面说一下查询:

有一种方法可以直接把DB文件转换成一个Database数据库对象

    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(path, null);

然而,可以直接操作SQLiteDatabase的实例来查询数据库,如果你的查询次数非常少的情况,可以使用这种,看不出查询效率,查询次数大的话建议不要用这种方式,查询效率太低,严重影响真个项目框架的执行效率,很多东西都会变得不灵敏。

为了提高查询效率,我使用的android提供的查询数据库的SQLiteOpenHelper类,查询效率大大提高,相信android是做了很多优化的。

首先需要重写DataBase的上下文,代码如下:

package com.open.lxxms.handler;

import java.io.File;

import com.open.lib.MyLog;

import android.content.Context;
import android.content.ContextWrapper;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

/**
 * CustomDatabaseContext 2015-1-10 下午7:51:05
 *
 * @author 乔晓松 [email protected]
 */
public class CustomDatabaseContext extends ContextWrapper {

	public String tag = "CustomDatabaseContext";
	public MyLog log = new MyLog(tag, true);

	private String mDirPath;

	public CustomDatabaseContext(Context base, String dirPath) {
		super(base);
		this.mDirPath = dirPath;
		log.e("CustomPathDatabaseContext");
	}

	@Override
	public File getDatabasePath(String name) {
		File result = new File(mDirPath + File.separator + name);

		if (!result.getParentFile().exists()) {
			result.getParentFile().mkdirs();
		}

		return result;
	}

	@Override
	public SQLiteDatabase openOrCreateDatabase(String name, int mode,
			CursorFactory factory) {
		log.e("openOrCreateDatabase1");
		return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name),
				factory);
	}

	@Override
	public SQLiteDatabase openOrCreateDatabase(String name, int mode,
			CursorFactory factory, DatabaseErrorHandler errorHandler) {
		log.e("openOrCreateDatabase2");
		return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name)
				.getAbsolutePath(), factory, errorHandler);
	}
}

下面是我封装的DB的工具类:

package com.open.lxxms.handler;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;

import com.open.lib.MyLog;
import com.open.lxxms.MainActivity;

/**
 * DBOptions 2015-1-10 下午8:57:47
 *
 * @author 乔晓松 [email protected]
 */
public class DBHandler extends SQLiteOpenHelper {

	public String tag = "DBOptions";
	public MyLog log = new MyLog(tag, true);

	public static final String DB_NAME = "callHomeDB.db";

	private int BUFFER_SIZE = 1024;
	public static final String PACKAGE_NAME = "com.open.lxxms";
	public static final String DB_PATH = "/data"
			+ Environment.getDataDirectory().getAbsolutePath() + "/"
			+ PACKAGE_NAME;

	public static DBHandler getInstance(Context context) {
		DBHandler dbOptions = new DBHandler(context, null, null, 1);
		return dbOptions;
	}

	public DBHandler(Context context, String name, CursorFactory factory,
			int version) {
		// super(context, name, factory, version);
		super(new CustomDatabaseContext(context, getDirPath()), DB_NAME,
				factory, version);
		try {
			String path = getDirPath() + "/" + DB_NAME;
			File file = new File(path);
			if (!file.exists()) {
				InputStream is = MainActivity.instance.getResources()
						.getAssets().open("callHomeDB.db");
				FileOutputStream fos = new FileOutputStream(path);
				byte[] buffer = new byte[BUFFER_SIZE];
				int count = 0;
				while ((count = is.read(buffer)) > 0) {
					fos.write(buffer, 0, count);
				}
				fos.close();
				is.close();
			}
		} catch (FileNotFoundException e) {
			log.e("File not found");
			e.printStackTrace();
		} catch (IOException e) {
			log.e("IO exception");
			e.printStackTrace();
		}
		log.e("DBOptions");
	}

	public static FileHandler fileHandler = FileHandler.getInstance();

	private static String getDirPath() {
		String path = fileHandler.sdcardFolder.getAbsolutePath();
		return path;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		log.e("onCreate");

	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		log.e("onUpgrade");
	}

	public String getResult(SQLiteDatabase database, String number) {
		// log.e(number);
		String result = "未知号码";
		number = number.replaceAll(" ", "");
		// try {
		if (number.length() > 7) {
			String firstNum = number.substring(0, 1);
			if (number.length() >= 10) {
				if ("0".equals(firstNum)) {
					String s1 = number.substring(1);
					String s2 = s1;
					String second = s1.substring(0, 1);
					if (second.equals("1") || second.equals("2")) {
						s2 = s1.substring(0, 2);
					} else {
						s2 = s1.substring(0, 3);
					}
					String sql = "select location from tel_location where _id = ? ";
					String[] param = new String[] { s2 };
					if (database != null && database.isOpen()) {
						Cursor cursor = database.rawQuery(sql, param);
						if (cursor.moveToNext()) {
							result = cursor.getString(0);
						}
						cursor.close();
					}
				} else {
					if (number.indexOf("+86") == 0) {
						number = number.substring(3);
					}
					if (number.indexOf("86") == 0) {
						number = number.substring(2);
					}
					String s1 = number.substring(0, 7);
					String sql = "select location from mob_location where _id = ? ";
					String[] param = new String[] { s1 };
					if (database != null && database.isOpen()) {
						Cursor cursor = database.rawQuery(sql, param);
						if (cursor.moveToNext()) {
							result = cursor.getString(0);
						}
						cursor.close();
					}
				}
			} else {
				result = "本地号码";
			}
		} else {
			if (number.length() < 4) {
				result = "未知号码";
			} else {
				result = "本地号码";
			}
		}
		// } catch (Exception e) {
		// e.printStackTrace();
		// }

		return result;
	}
}

使用方法:

DBHandler dbOptions = DBHandler.getInstance(context);
					SQLiteDatabase database = dbOptions.getReadableDatabase();
String result = dbOptions.getResult(database, number);

归属地的数据库:http://download.csdn.net/detail/qxs965266509/8367219

如有转载,请著名出自http://blog.csdn.net/qxs965266509

时间: 2024-10-28 15:52:05

Android-手机归属地和座机归属地查询的相关文章

[android] 手机卫士输入框抖动和手机震动

查看apiDemos,找到View/Animation/shake找到对应的动画代码,直接拷贝过来 当导入一个项目的时候,报R文件不存在,很多情况是xml文件出错了 Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake); et_phone.startAnimation(shake); 动画的xml文件shake.xml android:interpolator="@anim/cycle_7" interpo

Android 手机卫士--自定义属性

在前面的文章中,已经实现了“设置中心”第一栏的功能以及布局 本文地址:http://www.cnblogs.com/wuyudong/p/5936016.html,转载请注明出处. 自定义属性声明 接下来实现其他栏的布局和功能,由于它们之间的功能和布局类似,只是属性名称不同.所以本文在自定义控件的基础上实现自定义属性 首先参考标准控件的源码,这里选择TextView 源码路径为:D:\adt-bundle-windows-x86_64_20140101\sdk\platforms\android

android手机安全卫士、Kotlin漫画、支付宝动画、沉浸状态栏等源码

Android精选源码 轻量级底部导航栏 android手机卫士源码 android实现高仿今日头条源码 一个用Kotlin写的简单漫画App源码 android吐槽项目完整源码 实现可以滑动文字逐渐变色的TabLayout android实现将app隐藏加密功能的源码 android实现横向滚动的卡片堆叠布局 android仿支付宝的咻咻动画源码 android状态栏和沉浸式导航栏管理源码 Android优质博客 从BaseActivity与BaseFragment的封装谈起 这篇博客主要是从

Android手机 Fildder真机抓包

Android 手机 Fildder 真Fiddler是一个http调试代理,它能 够记录所有的你电脑和互联网之间的http通讯,Fiddler 可以也可以让你检查所有的http通讯,设置断点,以及Fiddle 所有的"进出"的数据(指cookie,html,js,css等文件,这些都可以让你胡乱修改的意思). Fiddler 要比其他的网络调试器要更加简单,因为它仅仅暴露http通讯还有提供一个用户友好的格式. 对于Android开发的同事最头疼的事情莫过于真机抓包,然后Fiddle

mac 无法连接android手机进行调试 解决方案

第一步: 查看usb设备信息 在 终端输入:system_profiler SPUSBDataType     可以查看连接的usb设备的信息 比如我的usb信息如下(部分内容): Android: Product ID: 0x2769              Vendor ID: 0x22d9              Version: 2.31              Serial Number: 6e5d48a4              Speed: Up to 480 Mb/sec

Android手机使用Fiddler方法介绍(原)

Fiddler是一款免费的抓包.调试工具,比Wireshark要小巧,更简洁,本节就来介绍如何通过WIFI来抓取Android手机的HTTP和HTTPS包. 一.连接Android手机 1.1.手机端配置 电脑配置WIFI后,手机需要设置当前WIFI的代理,而这个代理地址可以通过电脑的"ipconfig"命令得到,如下图所示: 以上的192.168.191.1就是本机的IP地址,然后在手机端的WIFI的高级设置中将代理地址设置为查询到的IP,端口号码自己定义,一会儿要用到,IP代理模式

Android手机使用广播监听手机收到的短信

我们使用的Android手机在收到短信的时候会发出一条系统广播.该条广播中存放着接收到的短信的详细信息.本文将详细介绍如何通过动态注册广播来监听短信. 注册广播有两种方式,一种是动态注册,另一种是静态注册.动态注册,顾名思义就是在程序运行时注册的,需要用到广播的时候就注册,用完即销毁.静态注是在AndroidManifest.xml中注册的,在<application>中使用<receiver>标签注册. 那么如何创建一个监听短信的广播接收器呢,其实只需要新建一个类,让这个类继承B

Exchange邮箱设置,android手机和mac book

假设 用户名:abc 密码:123 公司名是:qq 一 android手机: 1 输入地址:[email protected] 2 密码:123 3 协议:EXCHANGE 点击下一步 用户名:abc 域名:qqcorp 密码:123 服务器:mail.qq.com ==>>是以mail开头的 安全类型:SST/TLS(接受所有证书)  ==>>选择接受所有证书 客户端证书:无 二,mac book 第一步: 名称:abc 电子邮箱地址:[email protected] 密码:1

mac系统连接android手机

mac系统不能连接android手机问题的解决方案: 1.插上手机 2.找到android手机的vendor ID: 终端执行CMD:  system_profiler SPUSBDataType 在列出的usb设备中找到自己的手机,copy下vendor ID N828 Android Phone: Product ID: 0x0c02               Vendor ID: 0x0bb4  (HTC Corporation) Version: 2.55 Serial Number: