Android 简单几步实现手机号码归属地查询,可监听文本框的变化自动查询

本文介绍如何在Android程序中实现手机号码归属地查询功能,包括数据库文件的拷贝、查询工具类的使用及查询过程,展示了从数据库中获取手机号码对应归属地的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手机号码归属地查询需要用到一个数据库文件,我们可以用小米公司的数据库文件

第一步:数据库文件存储在

data/data/包名/files/数据库文件名.db";下
那么我们要如何在用户安装我们的程序的时候。将数据库文件拷贝到改目录下呢
我们可以将数据库文件放在assets目录下,在程序启动时,将其拷贝到该目录下即可,
数据库文件链接http://pan.baidu.com/s/1pJAa8Kb
将里面的addrees.db拷贝到assets目录下注意,
拷贝功能函数的实现如下
private void copyDBM() {
Log.i(TAG,"copyDBM");
/*只需拷贝一次*/
try {
//getFilesDir()得到根目录
File file = new File(getFilesDir(), "address.db");
if (file.exists() && file.length() > 0) {
/*已存在,不需要拷贝*/
Log.i(TAG,"不需要拷贝");
} else {
Log.i(TAG,"需要拷贝");
InputStream is = getAssets().open("address.db");
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
}
is.close();
fileOutputStream.close();
}

} catch (IOException e) {
e.printStackTrace();
}

}
查询数据库的工具类如下
package com.zaizai.safty.db.dao;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
* 查询数据库类
* Created by zaizai on 2015/11/4.
*/
public class NumberAddressQueryUtils {

/**
* 传一个号码,返回一个归属地字符串
*
* @param number
* @return
*/
private static String path = "data/data/com.zaizai.safty/files/address.db";
private static SQLiteDatabase database;


public static String queryNumber(String number) {
String address = number;
/*手机号码正则表达式匹配\d代表0到9的数字 ^1[345678]\d{9}*/
if (number.matches("^1[345678]\\d{9}$")) {
/*手机号码*/

//path 把数据库文件拷贝到data/data/<pagename>/files/address.db
database = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
Cursor cursor = database.rawQuery("select location from data2 where id = (select outkey from data1 where id = ?)", new String[]{number.substring(0, 7)});
while (cursor.moveToNext()) {
String location = cursor.getString(0);
address = location;
}
cursor.close();
} else {
// 其他的电话号码
switch (number.length()) {
case 3:
// 110
if ("110".equals(number))
address = "匪警号码";
if ("120".equals(number))
address = "急救电话";
if ("119".equals(number))
address = "火警电话";
break;
case 4:
// 5554
address = "模拟器";
break;
case 5:
// 10086
address = "客服电话";
break;
case 7:
//
address = "本地号码";
break;

case 8:
address = "本地号码";
break;

default:
// /处理长途电话 10
if (number.length() > 10 && number.startsWith("0")) {
// 010-59790386
Cursor cursor = database.rawQuery(
"select location from data2 where area = ?",
new String[]{number.substring(1, 3)});

while (cursor.moveToNext()) {
String location = cursor.getString(0);
address = location.substring(0, location.length() - 2);
}
cursor.close();

// 0855-59790386
cursor = database.rawQuery(
"select location from data2 where area = ?",
new String[]{number.substring(1, 4)});
while (cursor.moveToNext()) {
String location = cursor.getString(0);
address = location.substring(0, location.length() - 2);

}
}

break;
}
}

return address;
}
}

activity代码如下

package com.zaizai.safty;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.zaizai.safty.db.dao.NumberAddressQueryUtils;

import static com.zaizai.safty.R.id.et_phone;

/**
* Created by zaizai on 2015/11/4.
*/
public class NumberAddressQueryActivity extends AppCompatActivity {

private static final String TAG = "zaizai";
private EditText etPhone;
private TextView etResult;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_number_adderss_query);

etPhone = (EditText) findViewById(et_phone);
etResult = (TextView) findViewById(R.id.tv_result);
etPhone.addTextChangedListener(new TextWatcher() {
/**
* 文本变化前回调
* @param s
* @param start
* @param count
* @param after
*/
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

/**
* 文本变化时回调
* @param s
* @param start
* @param before
* @param count
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s != null && s.length() >= 3) {
/*查询数据库,并且显示结果*/
String address = NumberAddressQueryUtils.queryNumber(s.toString());
etResult.setText(address);
}

}

/**
* 文本变化后回调
* @param s
*/

@Override
public void afterTextChanged(Editable s) {

}
});
}

/**
* 点击查询号码归属地
*
* @param view
*/
public void numberAddressQuery(View view) {
String phone = etPhone.getText().toString().trim();
if (TextUtils.isEmpty(phone)) {
Toast.makeText(NumberAddressQueryActivity.this, "号码为空", Toast.LENGTH_LONG).show();
return;
} else {


String address = NumberAddressQueryUtils.queryNumber(phone);
etResult.setText(address);
/*去数据库查询号码归属地*/
//1、网络查询 2、本地数据库查询
/*工具类查询数据库*/

Log.i(TAG, "您要查询的电话号码" + phone);
}
}
}
布局文件如下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="55dip"
android:background="@android:color/holo_green_dark"
android:gravity="center"
android:text="号码归属地的查询"
android:textColor="@android:color/black"
android:textSize="22sp" />

<EditText
android:id="@+id/et_phone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:ems="10"
android:inputType="phone" />

<Button
android:id="@+id/number_address_qurey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="numberAddressQuery"
android:text="查询" />

<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示结果" />


</LinearLayout>

转载于:https://my.oschina.net/zaizaiangels/blog/526550

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值