<?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
style="@style/TitleStyle"
android:text="归属地查询" /> <EditText
android:id="@+id/et_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="number"
/> <Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="query"
android:text="查询" /> <TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:text="查询结果"
android:textSize="18sp" /> </LinearLayout>
package com.itheima52.mobilesafe.activity;

import android.app.Activity;
import android.os.Bundle;
import android.os.Vibrator;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.EditText;
import android.widget.TextView; import com.itheima52.mobilesafe.R;
import com.itheima52.mobilesafe.db.dao.AddressDao; /**
* 归属地查询页面
* 1.网络查询
* 2.数据库查询
*/
public class AddressActivity extends Activity { private EditText etNumber;
private TextView tvResult; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_address);
etNumber = (EditText) findViewById(R.id.et_number);
tvResult = (TextView) findViewById(R.id.tv_result); // 监听EditText的变化
etNumber.addTextChangedListener(new TextWatcher() {
// 文字 发生变化时的回调
@Override
public void onTextChanged(CharSequence s, int start, int before,int count) {
String address = AddressDao.getAddress(s.toString());
tvResult.setText(address);
}
// 文字变化前的回调
@Override
public void beforeTextChanged(CharSequence s, int start, int count,int after) {
}
// 文字变化结束之后的回调
@Override
public void afterTextChanged(Editable s) {
}
});
} /**
* 开始查询
*/
public void query(View view) {
String number = etNumber.getText().toString().trim();
if (!TextUtils.isEmpty(number)) {
String address = AddressDao.getAddress(number);
tvResult.setText(address);
} else {
Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);//动画
/*res/anim/shake.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromXDelta="0" X移动坐标0到10,不用差补器则只是从0移动到10然后就不动了,
android:interpolator="@anim/cycle_7" 差补器
android:toXDelta="10" />
<!--
res/anim/cycle_7.xml
<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="7" /> 一秒钟内移动7次,
-->
*/ /* shake.setInterpolator(new Interpolator() {//自定义差补器
@Override
public float getInterpolation(float x) {
//y=ax+b
return y;//y=x表示是匀速运动
}
});*/
etNumber.startAnimation(shake);//输入框左右摆动
vibrate();
}
} /**
* 手机震动, 需要权限 android.permission.VIBRATE
*/
private void vibrate() {
Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
// vibrator.vibrate(2000);震动两秒
vibrator.vibrate(new long[] { 1000, 2000, 1000, 3000 }, -1);// 先等待1秒,再震动2秒,再等待1秒,再震动3秒,
// 参2等于-1表示只执行一次
// 参2等于0表示从数组第0个文字开始循环,
// 参2表示从数组第几个位置开始循环,数组可以无限的写下去。
// 取消震动vibrator.cancel()
}
}
package com.itheima52.mobilesafe.db.dao;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase; /**
* 拷贝数据库(从assets目录拷贝到data/data/com.itheima52.mobilesafe/files/address.db)
*/
private void copyDB(String dbName) {//"address.db"
// File filesDir = getFilesDir();
// System.out.println("路径:" + filesDir.getAbsolutePath()); data/data/com.itheima52.mobilesafe/files
File destFile = new File(getFilesDir(), "address.db");// 要拷贝的目标地址,前面是文件夹后面是文件名,也可以new File(getFilesDir() + "/address.db"),
if (destFile.exists()) {//不要重复拷贝
System.out.println("数据库" + "address.db" + "已存在!");
return;
}
FileOutputStream out = null;
InputStream in = null;
try {
in = getAssets().open("address.db");//获取assets目录下的address.db文件。
out = new FileOutputStream(destFile);
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} /**
* 归属地查询工具
*/
public class AddressDao { private static final String PATH = "data/data/com.itheima52.mobilesafe/files/address.db";// 注意,该路径必须是data/data目录的文件,不能是assets的目录,否则数据库访问不到 public static String getAddress(String number) {
String address = "未知号码";//没有查出来
// 获取数据库对象
SQLiteDatabase database = SQLiteDatabase.openDatabase(PATH, null,SQLiteDatabase.OPEN_READONLY);//因为数据库是现成的所以不用SQLHelper来创建数据库。第三个是访问模式。
// 手机号码特点: 1 + (3,4,5,6,7,8) + (9位数字),^1[3-8]\d{9}$
if (number.matches("^1[3-8]\\d{9}$")) {// 匹配手机号码
Cursor cursor = database
.rawQuery(
"select location from data2 where id=(select outkey from data1 where id=?)",
new String[] { number.substring(0, 7) });
if (cursor.moveToNext()) {//只有一条数据所以只用if不用while
address = cursor.getString(0);
}
cursor.close();
} else if (number.matches("^\\d+$")) {// 匹配数字
switch (number.length()) {
case 3:
address = "报警电话";
break;
case 4:
address = "模拟器";
break;
case 5:
address = "客服电话";
break;
case 7:
case 8:
address = "本地电话";
break;
default:
// 01088881234
//
if (number.startsWith("0") && number.length() > 10) {// 有可能是长途电话
// 有些区号是4位,有些区号是3位(包括0)
// 先查询4位区号
Cursor cursor = database.rawQuery(
"select location from data2 where area =?",
new String[] { number.substring(1, 4) });
if (cursor.moveToNext()) {//找到了
address = cursor.getString(0);
} else {//没有查到
cursor.close();
// 查询3位区号
cursor = database.rawQuery(
"select location from data2 where area =?",
new String[] { number.substring(1, 3) });
if (cursor.moveToNext()) {
address = cursor.getString(0);
}
cursor.close();
}
}
break;
}
}
database.close();// 关闭数据库
return address;
}
}

android134 360 07 归属地查询的更多相关文章

  1. Android实现归属地查询功能

    实现归属地查询大体有两种方法可以实现,一种是通过归属地API进行查询,另一种是查询本地数据库.两种方法各有优劣,最好结合起来使用,我本次采用的是查询数据库的方法.首先需要从网上下载归属地数据库call ...

  2. 【原创】Java实现手机号码归属地查询

    网络上已经有很多的手机号码归属地查询的API接口,但是这些接口总是有一些大大小小的缺陷. 总结一下这些缺陷: 1.要直接将它的搜索框链接形式粘到自己的页面,点击查询的时候还要跳转到他们的网站来展示归属 ...

  3. 本地的手机号码归属地查询-oracle数据

    最近做的项目中,有个功能是手机归属地查询,因为项目要在内网下运行,所以不能用提供的webservice,只好在网上找手机归属地的数据,很多都是access的,我们的项目是用oracle,只好自己转吧, ...

  4. 百度手机号码归属地查询api与返回json处理

    前天无意间在网上看到百度ApiStore,然后好奇就进去看了看.正好最近在某博培训Android,刚学到java基础.抱着锻炼的心态选择手机号码归属地查询api进行练手.api地址 (http://a ...

  5. 手机归属地查询-IP地址查询-身份证查询-域名备案查询--Api接口

    使用这些接口是需要密钥的 公共密钥 appkey: 10003  secret: d1149a30182aa2088ef645309ea193bf  生成后sign: b59bc3ef6191eb9f ...

  6. 免费的手机号码归属地查询API接口文档

    聚合数据手机号码归属四查询API接口,根据手机号码或手机号码的前7位,查询手机号码归属地信息,包括省份 .城市.区号.邮编.运营商和卡类型. 通过链接https://www.juhe.cn/docs/ ...

  7. C# 号码归属地查询算法

    C# 号码归属地查询算法(根据Android来电归属地二进制文件查询修改) 前言 近期有个项目需要用到号码归属查询,归属地数据库可能比不上ip138,淘宝上也有卖的-,-! 文本提供一个279188条 ...

  8. C# 号码归属地查询算法(根据Android来电归属地二进制文件查询修改)

    前言 近期有个项目需要用到号码归属查询,归属地数据库可能比不上ip138,淘宝上也有卖的-,-! 文本提供一个279188条记录并压缩成562KB的归属地数据.我在互联网上搜索了相关文章,要不是数据库 ...

  9. 通讯服务类API调用的代码示例合集:短信服务、手机号归属地查询、电信基站查询等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 短信服务:通知类和验证码短信,全国三网合一通道,5秒内到达,费用低 ...

随机推荐

  1. mysql 触发器学习(可以将mysql数据同步到redis)

    1. 一个简单的例子 1.1. 创建表: create table t(s1 integer); 1.2. 触发器: delimiter | create trigger t_trigger befo ...

  2. file的getPath getAbsolutePath和getCanonicalPath的区别

    转自:http://www.blogjava.net/dreamstone/archive/2007/08/08/134968.html file的这几个取得path的方法各有不同,下边说说详细的区别 ...

  3. 剑指Offer:互为变位词

    // 判断两个单词是否互为变位词: 如果两个单词中的字母相同,并且每个字母出现的次数也相同, 那么这两个单词互为变位词 #include <stdio.h> #include <st ...

  4. Android学习过程

    0. Tutorial 1. 基础知识的书 2. 实践为主的书 3. 阅读开源项目 4. 自己做项目 5. 理论为主的书 6. 编程规范和技巧性的书 通过实例了解Android开发 组件:Activi ...

  5. uboot环境变量与内核MTD分区关系

    uboot 与系统内核中MTD分区的关系: 分区只是内核的概念,就是说A-B地址放内核,C-D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等. 1:在内核MTD中可以定义分区A~B, ...

  6. MySQL SQL优化之字符串索引隐式转换

    之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结 ...

  7. HDU 4777 Rabbit Kingdom 树状数组

    分析:找到每一个点的左边离他最近的不互质数,记录下标(L数组),右边一样如此(R数组),预处理 这个过程需要分解质因数O(n*sqrt(n)) 然后离线,按照区间右端点排序 然后扫一遍,对于当前拍好顺 ...

  8. java.lang.NoClassDefFoundError: javax/transaction/Synchronization (jUnit测试报错)

      测试hibernate   报错原因项目缺少包   在 hibernate 解压目录下找到 jta.jar 文件     往项目中添加该 jar 包,即可解决   添加方法:[右击项目]--> ...

  9. [原创]使用squish打包与混淆cocos2d-x的lua脚本

    squish是一个开源的用于打包lua脚本的小工具,它的主要功能是将多个lua文件整合成一个文件,并在此基础上做压缩和混淆等处理,混淆和压缩后的代码可以直接被执行而不需要先做解压还原等操作. 它的gi ...

  10. 解析XML最快速的方式

    采用提JAXB技术 1.根据xml生成xsd 执行:java -jar trang.jar a.xml a.xsd 2.根据java的xjc来生成实现类 执行:xjc a.xsd 注:在执行前最好把数 ...