精华内容
下载资源
问答
  • 由于诈骗电话越来越猖狂,号码归属地显示越来越重要,本篇文章主要介绍了android手机卫士来电显示号码归属地,有要的朋友可以了解一下。
  • 全国手机号码归属地数据库2016年8月327665条 本数据库含有最全手机号段数据: 电信:133、153、177(新)、180、181、189 移动:134、135、136、137、138、139、150、151、152、157、158、159、178(新)、182、183、184...
  • 全国手机号码归属地数据库2016年8月327665条 本数据库含有最全手机号段数据: 电信:133、153、177(新)、180、181、189 移动:134、135、136、137、138、139、150、151、152、157、158、159、178(新)、182、183、184...
  • 手机号码归属地来电显示程序时用的到
  • 开启服务监听手机来电,查询数据库,显示归属地 详细内容可以参考这篇博文:http://www.cnblogs.com/taoshihan/p/5331232.html AddressService.java package com.qingguow.mobilesafe.service; import ...

    继续N天前的项目

    开启服务监听手机来电,查询数据库,显示归属地

    详细内容可以参考这篇博文:http://www.cnblogs.com/taoshihan/p/5331232.html

     AddressService.java

    package com.qingguow.mobilesafe.service;
    
    import com.qingguow.mobilesafe.utils.NumberQueryAddressUtil;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    import android.widget.Toast;
    
    /**
     * 来电显示
     * 
     * @author taoshihan
     * 
     */
    public class AddressService extends Service {
        private TelephonyManager tm;
        private MyPhoneStateListener phoneStateListener;
    
        @Override
        public IBinder onBind(Intent arg0) {
            // TODO Auto-generated method stub
            return null;
        }
        /**
         * 服务创建
         */
        @Override
        public void onCreate() {
            super.onCreate();
            tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
            phoneStateListener = new MyPhoneStateListener();
            tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
        }
    
        private class MyPhoneStateListener extends PhoneStateListener {
            @Override
            public void onCallStateChanged(int state, String incomingNumber) {
                super.onCallStateChanged(state, incomingNumber);
                switch (state) {
                case TelephonyManager.CALL_STATE_RINGING:
                    String info = NumberQueryAddressUtil
                            .queryAddress(incomingNumber);
                    Toast.makeText(getApplicationContext(), info, 1).show();
                    break;
                default:
                    break;
                }
            }
        }
        /**
         * 服务销毁
         */
        @Override
        public void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
            //取消监听
            tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
            phoneStateListener=null;
        }
    }

     

    设置中心,配置是否开启来电归属地显示

    直接使用我们之前定义好的组合控件

        <com.qingguow.mobilesafe.ui.SettingItemView
            tsh:title="设置显示号码归属地"
            tsh:desc_on="设置显示号码归属地已开启"
            tsh:desc_off="设置显示号码归属地已关闭"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/siv_show_address">
        </com.qingguow.mobilesafe.ui.SettingItemView>

     

    获取到SettingItemView对象,我们自定义的控件,设置状态

    调用SettingItemView对象的setOnClickListener()方法,设置点击事件,重写onClick方法

    调用SettingItemView对象的isChecked()方法,得到当前是否选中

    判断状态,调用SettingItemView对象的setChecked()方法,设置状态,参数:布尔值

    调用startService()方法,开启监听手机状态的服务,参数:Intent对象,

    调用stopService()方法,关闭服务

     

    判断当前服务是否开启,设置控件的默认选中状态

    新建一个工具类ServicesUtils.java

    定义一个静态方法isServiceRunning(),传入参数:Context上下文,String服务名

    调用Context对象的getSystemService()方法,获取ActivityManager对象,参数:Context.ACTIVITY_SERVICE

    调用ActivityManager对象的getRunningServices()方法,得到运行的服务List集合,参数:int最大值

    for循环List集合,每条是个RunningServiceInfo对象

    调用RunningServiceInfo.servie.getClassName(),获取到String服务类名,判断一下如果相等返回true

     

    SettingActivity.java

    package com.qingguow.mobilesafe;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    
    import com.qingguow.mobilesafe.service.AddressService;
    import com.qingguow.mobilesafe.ui.SettingItemView;
    import com.qingguow.mobilesafe.utils.ServiceUtils;
    
    public class SettingActivity extends Activity {
        private SettingItemView siv_item;
        private SharedPreferences sp;
        // 设置是否开启号码归属地
        private SettingItemView showAddressBtn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_setting);
    
            // 设置号码归属地
            showAddressBtn = (SettingItemView) findViewById(R.id.siv_show_address);
            if (ServiceUtils.isRunningService(this,
                    "com.qingguow.mobilesafe.service.AddressService")) {
                showAddressBtn.setChecked(true);
            } else {
                showAddressBtn.setChecked(false);
            }
            showAddressBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    if (showAddressBtn.isChecked()) {
                        showAddressBtn.setChecked(false);
                        stopService(new Intent(getApplicationContext(),
                                AddressService.class));
                    } else {
                        showAddressBtn.setChecked(true);
                        startService(new Intent(getApplicationContext(),
                                AddressService.class));
                    }
                }
            });
    
            siv_item = (SettingItemView) findViewById(R.id.siv_item);
            sp = getSharedPreferences("config", MODE_PRIVATE);
            // 根据保存的数据设置状态
            boolean update = sp.getBoolean("update", false);
            if (update) {
                siv_item.setChecked(true);
            } else {
                siv_item.setChecked(false);
            }
    
            // 自动更新的点击事件
            siv_item.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    Editor editor = sp.edit();
                    if (siv_item.isChecked()) {
                        // 设置不选中
                        siv_item.setChecked(false);
                        editor.putBoolean("update", false);
                    } else {
                        // 设置选中
                        siv_item.setChecked(true);
                        editor.putBoolean("update", true);
                    }
                    editor.commit();
                }
            });
        }
    }

     

     

    ServicesUtils.java

    package com.qingguow.mobilesafe.utils;
    
    import java.util.List;
    
    import android.app.ActivityManager;
    import android.app.ActivityManager.RunningServiceInfo;
    import android.content.Context;
    /**
     * 服务工具类
     * @author taoshihan
     *
     */
    public class ServiceUtils {
        /**
         * 判断某服务是否开启
         * @param context
         * @param serviceName
         * @return
         */
        public static boolean isRunningService(Context context,String serviceName){
            ActivityManager am=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            List<RunningServiceInfo> infos=am.getRunningServices(100);
            for(RunningServiceInfo info:infos){
                String name=info.service.getClassName();
                if(name.equals(serviceName)){
                    return true;
                }
            }
            return false;
        }
    }

     

    展开全文
  • Android设置来电号码归属地

    千次阅读 2014-02-28 10:43:08
    FAQ Content [DESCRIPTION] ...如何关闭MTK内置来电号码归属地?...MTK平台号码归属地分为...手机号码归属地: 是MTK自己做的,关闭只需要关闭MTK_PHONE_NUMBER_GEODESCRIPTION这个option即可; 数据库文件所在路

    FAQ Content

    [DESCRIPTION]
     
    如何关闭MTK内置来电号码归属地?
     
    [SOLUTION]
     
    MTK平台号码归属地分为两种:1.手机号码归属地;2.固话号码归属地;
     
    手机号码归属地
    是MTK自己做的,关闭只需要关闭MTK_PHONE_NUMBER_GEODESCRIPTION这个option即可;
    数据库文件所在路径为 alps/mediatek/source/external/geocoding/geocoding.db
    仅支持汉语。
     
    固话号码归属地
    是Google Android系统自带的,关闭需要注解掉Google的原始code;
    数据库文件所在路径为 alps/external/libphonenumber/java/src/com/android/i18n/phonenumbers/geocoding/data
    支持多国语言。
     
     
    可能遇到的问题:
    --1------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    国内定制版本有可能关闭MTK_PHONE_NUMBER_GEODESCRIPTION会编译报错,是因为有设置编译的一些option的依赖检查,
    在打开OP01或OP02的版本中不允许关闭MTK_PHONE_NUMBER_GEODESCRIPTION,如果要关闭可以去掉以下检查code:
    文件: android_dep_rule.mak
    位置: alps\mediatek\build\addon\core
    ##############################################################
    # for phone number geo-description
    ifneq ($(filter OP01% OP02%, $(OPTR_SPEC_SEG_DEF)),)
      ifeq (no,$(strip $(MTK_PHONE_NUMBER_GEODESCRIPTION)))
        $(call dep-err-seta-or-onb, OPTR_SPEC_SEG_DEF,none OP01/OP02,MTK_PHONE_NUMBER_GEODESCRIPTION)
      endif
    endif
    --2------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    如果不关闭MTK_PHONE_NUMBER_GEODESCRIPTION来实现关闭归属地,采用如下操作:
    可以在CallerInfo.java, updateGeoDescription() 中将geoDescription设为空字符串null
    再在DefaultCallLogInsertionHelper.java 的 getGeocodedLocationFor()方法返回空字符串null
    展开全文
  •  1、显示来电号码归属地;  2、可在“设置中心”设置“是否启用来电号码归属地显示” 二、代码实现  (以服务的形式监听来电状态)  1、在项目服务包中新增一个服务类(取名ShowComingPhoneAdd,继承...

    一、目标

      1、显示来电号码的归属地;

      2、可在“设置中心”设置“是否启用来电号码归属地显示”

     

    二、代码实现

      (以服务的形式监听来电状态)

      1、在项目服务包中新增一个服务类(取名ShowComingPhoneAdd,继承系统Service)用于监听来电状态,并在清单文件中注册;

      2、建立TelephonyManager对象的成员变量(取名tm),用于获取手机状态;

      3、在新建的服务类中复写服务的onCreate()和onDestroy方法(),用于实现当服务创建(onCreate)时监听来电状态,当服务销毁(onDestroy)时取消来电监听;

      4、在服务创建时(onCreate()方法中)通过TelephonyManager对象(tm)的getSystemService(String name)方法获取系统服务(即实例化),参数String name为TELEPHONY_SERVICE时表示获取电话特征,并强转;再通过TelephonyManager对象(tm)的listen(PhoneStateListener listener, int events)方法监听电话状态,参数PhoneStateListener listener为电话状态监听器,需要自定义一个类继承该监听器类,详见第7步,参数int events表示监听事件,TelephonyManager.CALL_STATE_RINGING表示监听来电事件;

      5、在服务销毁时(onDestroy()方法中)通过TelephonyManager对象(tm)的listen()方法和自定义监听器对象设为null来销毁监听;

      6、在服务类(ShowComingPhoneAdd)中自定义电话监听器类(取名MyPhoneListener,继承PhoneStateListener),复写其onCallStateChanged(int state, String incomingNumber) 方法,表示电话状态改变时回调该方法,参数int state表示电话状态,String incomingNumber表示来电号码,在电话状态改变(onCallStateChanged())方法中:

        (1)通过switch...case...语句判断电话状态state;

        (2)当其值为TelephonyManager.CALL_STATE_RINGING表示电话铃声响起,则将来电号码(incomingNumber)传至号码归属地工具类(NumberAddQueryUtils)中的查询号码归属地(queryNumber())方法中,从而获得String类型的号码归属地

        (3)通过Toast对象显示出来,也可以采用其他方法将归属地显示出来;

      7、在清单文件中增加读取电话状态权限(READ_PHONE_STATE)

    自定义电话状态监听器类代码:

     1 private class MyPhoneListener extends PhoneStateListener {
     2         
     3         //电话状态改变回调的方法
     4         @Override
     5         public void onCallStateChanged(int state, String incomingNumber) {
     6             //state:电话状态,incomingNumber:来电号码
     7             super.onCallStateChanged(state, incomingNumber);
     8             switch (state) {
     9             case TelephonyManager.CALL_STATE_RINGING://来电
    10                 String inComingPhoneAdd = NumberAddQueryUtils.queryNumber(incomingNumber);
    11                 Toast.makeText(getApplicationContext(), inComingPhoneAdd, Toast.LENGTH_LONG).show();
    12                 break;
    13             default:
    14                 break;
    15             }
    16         }        
    17     }
    View Code

    onCreate方法代码:

    1 //当服务创建时建立来电监听
    2     @Override
    3     public void onCreate() {
    4         super.onCreate();
    5         tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    6         //监听来电
    7         listener = new MyPhoneListener();
    8         tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    9     }
    View Code

     

    onDestroy方法代码:

    1 //当服务销毁时取消来电监听
    2     @Override
    3     public void onDestroy() {
    4         super.onDestroy();    
    5         tm.listen(listener,PhoneStateListener.LISTEN_NONE);
    6         listener = null;
    7     }
    View Code

     

      8、在“设置中心”(SettingActivity)页面的布局文件(activity_setting)中,增加一条自定义的控件(com.example.mobilesafe.ui.SettingItemView,可复制上面的控件),用于设置是否显示来电号码归属地,根据要求设置标题、内容、默认状态、id(setting_show_incoming_add)等信息;

      9、在“设置中心”(SettingActivity)页面中定义自定义控件(SettingItemView,取名setting_show_incoming_add)和Intent对象(取名showAddIntent)两个成员变量;

      10、Intent对象(showAddIntent)用于通过自定义控件的勾选情况启动或取消来电号码归属地显示服务(ShowComingPhoneAdd),通过new Intent(Context packageContext, Class<?> cls)实例化并通过当前上下文(参数Context packageContext,此例为this)与目标类(参数Class<?> cls,此例为来电号码归属地显示服务类(ShowComingPhoneAdd.class))关联;

      11、定义自定义控件(SettingItemView)通过findViewById()找个布局文件中的自定义控件并强制,再通过setOnClickListener(OnClickListener l)为其设置点击事件,参数OnClickListener l通过new 实例化,并实现其中未实现的点击事件处理方法(onClick(View v));在点击事件处理方法onClick()中:

        (1)判断自定义的“显示来电号码归属地”控件(setting_show_incoming_add)是否处于选中状态,如果是选中状态,则通过自定义控件(setting_show_incoming_add)的setChecked(boolean checked)设置其值为false,并通过stopService(Intent name)方法停止显示来电号码归属地服务,参数Intent为第10步定义的Intent对象;

        (2)如果是非选中状态,则设置为true,并通过startService(Intent service)方法启动服务。

    “设置中心”(SettingActivity)中来电显示代码:

     1 //设置是否开启来电号码归属地显示功能
     2         setting_show_incoming_add = (SettingItemView) findViewById(R.id.setting_show_incoming_add);
     3         showAddIntent = new Intent(this,ShowComingPhoneAdd.class);        
     4         setting_show_incoming_add.setOnClickListener(new OnClickListener(){
     5 
     6             @Override
     7             public void onClick(View v) {
     8                 if(setting_show_incoming_add.isChecked()){
     9                     //设为非选中状态,取消显示来电归属地服务
    10                     setting_show_incoming_add.setChecked(false);
    11                     stopService(showAddIntent);
    12                     Toast.makeText(getApplicationContext(), "已停止显示来电号码归属地服务", 0).show();
    13                 }else {
    14                     //设为选中状态,启动显示来电归属地服务
    15                     setting_show_incoming_add.setChecked(true);
    16                     startService(showAddIntent);
    17                     Toast.makeText(getApplicationContext(), "已启动显示来电号码归属地服务", 0).show();
    18                 }
    19             }
    20             
    21         });
    View Code

     

     

    转载于:https://www.cnblogs.com/Red-Shark/p/4432691.html

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

    前言

    近期有个项目需要用到号码归属查询,归属地数据库可能比不上ip138,淘宝上也有卖的-,-! 文本提供一个279188条记录并压缩成562KB的归属地数据。
    我在互联网上搜索了相关文章,要不是数据库查询或者是访问网上的api,到底有没有更好的方式,我想各大手机软件的归属地都是属于本地查询的。
    当我发现了Android Jni 使用C++对二进制文件查询 这篇文章,发现效率真是高,作者的算法也相当出色。
    于是直接把它用C#来实现了一个版本,并且加上号码的类型,效率上没相差太多,起码我们的项目已经够用了。


    这是原文的一段话:

    随便去网络上搜索一个号码归属地数据库下载,你可能会找到各种格式,access,txt,db等。除了用insert sql语句外,你还可以用CSV文件格式来互相转换。因为SQLite Expert 支持CSV文件导入,导出。
    数据最佳存放方式如上图中的表1CallerLoc和表2LocationInfo。这样用一条连表sql语句查询即可。类似这样的sql语句:select number, area from CallerLoc join LocationInfo on CallerLoc.location = LocationInfo.location。
    假设你有了这样的xx.db文件,可以把该文件放在Android项目的assets文件下,然后在自定义的ContentProvider中的query方法中,尝试把xx.db 复制到手机的/data/data/你的项目包名/databases中,查询用上面提到的sql语句就行了。
    这是一个解决方案,但是db文件太大了,280,000条记录差不多有8MB大小。 别人解压你的apk,dat文件一下子就被别人窃取走了。
    有什么方式可以解决这个问题?分析表1,感觉数据还可以压缩(用自定义的格式),把数据写入到一个文件中,通过打开文件来搜索,写入方式用二进制的话,别人就窃取不了了。Java处理速度慢的话,还可以改用C++,通过JNI桥梁来处理。

    相关技术和理论请参考原作者地址:

    Android 号码,来电归属地 Jni 使用C++对二进制文件查询(一) 理论篇

    Android 号码,来电归属地 Jni 使用C++对二进制文件查询(二) C++实现篇

    Android 号码,来电归属地 Jni 使用C++对二进制文件查询(三) APK 实现篇

    提供本文所修改过的源代码下载

    简单说下修改过的类库

    areacode.dat(562KB)
    内嵌的资源文件,此文件是根据areacode.txt(9,522KB)生成而来。(279188条数据)

    NumberInfoCompress

    号码压缩的结构体,和原文C++版本的基本一致,只是增加了号码类型的储存;(占用8个字节)

    PhoneInfo

    号码的结构信息,分别有号码段、地区、类型。

    PhoneWriter

    压缩号码归属地并生成二进制文件。

     1 public void DoWriter(Stream stream, Encoding encoding) {
     2     if (_data == null || _data.Count == 0)
     3         return;
     4 
     5     BinaryWriter bw = new BinaryWriter(stream, encoding);
     6 
     7     //设置偏移量在开头预留写入NumberInfoCompress的总数
     8     this.WriteCount(bw, 0, _phoneInfoCompressCount);
     9 
    10     //设置偏移量在开头预留号码类型的总数
    11     this.WriteCount(bw, 4, 0);
    12 
    13     //先读取第一条号码数据
    14     var enumerator = this._data.GetEnumerator();
    15 
    16     if (!enumerator.MoveNext())
    17         return;
    18 
    19     //为什么要预先读取一条数据呢?获取第一条数据是为了和下一条进行对比
    20     var phoneInfo = enumerator.Current;
    21 
    22     //增加城市信息,并且返回集合所在索引位置
    23     var cityIdx = this.AddCity(phoneInfo.City);
    24     //增加号码类型信息,并且返回集合所在索引位置
    25     var cardIdx = this.AddCard(phoneInfo.CardType);
    26 
    27     //构造一个8字节存储的结构体
    28     var pre = new NumberInfoCompress(phoneInfo.Code, 0, cityIdx, cardIdx);
    29 
    30     while (enumerator.MoveNext()) {
    31         //读取下一条数据,准备和上一条比较
    32         phoneInfo = enumerator.Current;
    33         cityIdx = this.AddCity(phoneInfo.City);
    34         cardIdx = this.AddCard(phoneInfo.CardType);
    35 
    36         //和上个号码对比是否连续的,比如 1370875 1370876 1370877。
    37         //1370875开头有3个,表示13708 375:从75开始有3个连续的号码
    38         if (phoneInfo.Code - (pre.GetBegin() + pre.GetSkip()) == 1 && cityIdx == pre.GetCityIndex()) {
    39             //设置号码段连续位置
    40             pre.SetSkip((ushort)(phoneInfo.Code - pre.GetBegin()));
    41         } else {
    42             //递增一个
    43             ++_phoneInfoCompressCount;
    44 
    45             //写入13708号码段的数据
    46             this.Write(bw, pre);
    47 
    48             //继续构造一个8字节存储的结构体等待下次循环比较
    49             pre = new NumberInfoCompress(phoneInfo.Code, 0, cityIdx, cardIdx);
    50         }
    51     }
    52 
    53     //写入最后的号码数据
    54     this.Write(bw, pre);
    55     ++_phoneInfoCompressCount;//记录总数
    56 
    57     //写入NumberInfoCompress的总数
    58     this.WriteCount(bw, 0, _phoneInfoCompressCount);
    59 
    60     //写入号码类型的总数
    61     this.WriteCount(bw, 4, (uint)(_listCard.Count));
    62 
    63     //结尾写入城市地区数据
    64     this.WriteCity(bw, encoding);
    65 
    66     //结尾写入号码类型数据
    67     this.WriteCard(bw, encoding);
    68 
    69     bw.Close();
    70     bw.Dispose();
    71 }

     

    PhoneReader

    用来读取areacode.dat,比如查询号码归属地。   

     1 public PhoneInfo GetPhoneInfo(Stream stream, Encoding encoding, int number) {
     2     PhoneInfo result = new PhoneInfo();
     3 
     4     result.Code = number;
     5 
     6     BinaryReader br = new BinaryReader(stream, encoding);
     7 
     8     //获取索引总数
     9     int phoneInfoCompressCount = br.ReadInt32();
    10     //号码类型总数
    11     int cardCount = br.ReadInt32();
    12     int left = 0, right = phoneInfoCompressCount - 1;
    13 
    14     var per = new NumberInfoCompress();
    15     var perSize = Marshal.SizeOf(per);
    16 
    17     //使用折半查询(二分法)
    18     while (left <= right) {
    19         //折半
    20         int middle = (left + right) / 2;
    21         //索引总数8字节 + middle * NumberInfoCompress字节数
    22         stream.Position = sizeof(int) * 2 + middle * perSize;
    23 
    24         //读取NumberInfoCompress数据
    25         per.Before = br.ReadUInt16();
    26         per.After = br.ReadUInt16();
    27         per.CityIndex = br.ReadUInt16();
    28         per.CardIndex = br.ReadUInt16();
    29 
    30         //判断号码是否匹配
    31         if (number < per.GetBegin()) {
    32             right = middle - 1;//在左半区间找
    33         } else if (number > (per.GetBegin() + per.GetSkip())) {
    34             left = middle + 1;//在右半区间找
    35         } else {
    36             //已找到,直接查询城市和号码类型
    37             result.City = DoFindCityThing(br, phoneInfoCompressCount, per);
    38             result.CardType = DoFindCardThing(br, cardCount, per);
    39             return result;
    40         }
    41     }
    42     br.Close();
    43     br.Dispose();
    44     return result;
    45 }
    46 
    47 private string DoFindCityThing(BinaryReader br, int phoneInfoCompressCount, NumberInfoCompress infoMiddle) {
    48     //计算城市区域信息位置
    49     //sizeof(int) * 2 开头位置储存了一个4字节的NumberInfoCompress总数和类型总数
    50     //phoneInfoCompressCount NumberInfoCompress总数
    51     //Marshal.SizeOf(infoMiddle) NumberInfoCompress占用空间
    52     //infoMiddle.GetCityIndex() 城市的所在位置
    53     //_maxCityLength 城市总数
    54     //偏移量 = 索引总数8字节 + 索引总数 * NumberInfoCompress字节数 + 城市的所在位置 * 城市大小
    55     long totalOffset = sizeof(int) * 2 + phoneInfoCompressCount * Marshal.SizeOf(infoMiddle)
    56         + infoMiddle.GetCityIndex() * this._maxCityLength;
    57 
    58     br.BaseStream.Position = totalOffset;//设置偏移量
    59     char[] charCity = br.ReadChars(this._maxCityLength);
    60     return new string(charCity, 0, Array.IndexOf(charCity, '\0'));
    61 }
    62 
    63 private string DoFindCardThing(BinaryReader br, int cardCount, NumberInfoCompress infoMiddle) {
    64     //号码类型存储在尾端
    65     //所以偏移量 = (流的总长度 - 类型总数 * 类型大小) + 所在位置 * 类型大小
    66     long totalOffset = (br.BaseStream.Length - cardCount * this._maxCardLength) + infoMiddle.GetCardIndex() * this._maxCardLength;
    67 
    68     br.BaseStream.Position = totalOffset;//设置偏移量
    69     char[] charCard = br.ReadChars(this._maxCardLength);
    70     return new string(charCard, 0, Array.IndexOf(charCard, '\0'));
    71 }

     

    AreaCode

    封装了手机归属地查询函数。

    FrmAreaCode

    用来演示如何查询电话号码归属地以及把文本文件生成为压缩过的二进制文件(areacode.dat)。




    结语

    原作者的压缩算法我们也可以稍作改变,但是用这种算法的前提条件是必须有序且有规律,最后用二分法才会提高查询速度。
    项目资源里面的文本文件是每行一个号码段,如:号码,区域,类型;读者可以自行存储到任何数据库等地方,方便日后管理。

     

    转载于:https://www.cnblogs.com/johnwu/p/3344765.html

    展开全文
  • android 如何关闭来电号码归属地

    千次阅读 2014-10-12 22:15:06
    手机号码归属地;2.固话号码归属地;   手机号码归属地: 是MTK自己做的,关闭只需要关闭MTK_PHONE_NUMBER_GEODESCRIPTION这个option即可; 数据库文件所在路径为 alps/mediatek/external/geocoding/geocoding.db;...
  • 手机号码归属地查询,数据库,用于来电显示开发
  • 2.创建监听器内部实现类,重写内部方法,如果手机是响铃状态,调用dao层中的ShowAddress类中的查询号码归属地的方法, 3.在程序设置模块添加"是否开启来电号码归属地显示条目",注册onclick事件
  • 手机号码归属地查询17万 MDB格式 有来电显示小型CRM,需要的请留言
  • 收录手机号码归属地查询的MDB格式数据库 有来电显示的简单CRM,需要的话请留言
  • * 获得来电归属地 手机的正则表达式为:^1[358]\d{9}$ */ public String getAddress(String number) { String address = null; File file = context.getDatabasePath(TableContanst.ADDRESS_DB_NAME); ...
  • 手机号码归属地查询支持全国最新的15X号段、18X号段的查询,自带数据库总量超过十八万五千条手机号码归属地信息,可以详细查询到手机号码的开户地信息,包括该号码所属省份、城市、长途区号以及该号码 SIM卡类型(仅...
  • Android中来电号码归属地的显示

    千次阅读 2014-07-20 10:33:20
    昨日shixia360手机卫士有个来电显示归属地的功能,具体的显示大概就是
  • libphonenumber 是google 开源的库,提供手机号码格式化,来电归属地,运营商等多种功能十分强大,现在做个简单的demo 1、首先下载 libphonumber 相关的库 here, 下载 carrier-1.9.jar、geocoder-2.32.jar、...
  • 手机卫士14-显示来电归属地

    千次阅读 2013-12-08 23:14:38
    好啦,我们今天就要把号码归属地显示在有电话打进来的时候,其实也很简单的啦,我们只要开一个服务,监听电话的广播,然后在电话相应的状态,进行相应的操作就可以的啦 至于怎样把那个view显示到接听电话那个界面...
  • libphonenumber 是google 开源的库,提供手机号码格式化,来电归属地,运营商等多种功能十分强大,现在做个简单的demo   1、首先下载 libphonumber 相关的库 here, 下载 carrier-1.9.jar、geocoder-2.32.jar、...
  • 非常好用的一款PPC上显示来电号码归属地的工具,支持号段单独更新,适用于windows mobile系统的多个版本,支持开机自动启动,支持黑名单、自动挂断、录音等多种方便实用的功能,绝对物超所值!
  • 问题分析 手机号码又主要分两种,018179700104和18179700104,即带0开头和不带0开头的。 ...:由于数据库数据量大,且来电归属地的表数据量庞大,还需要同时匹配手机号码和邮编。 首先我们来...
  • Android项目:手机安全卫士(10)—— 电话号码归属地显示 1 概述 前一篇文章已经提供了电话号码归属地查询功能,现在要做的,就是在打电话和来电显示的时候,显示一个电话归属地提示框,就像这样: ...
  • 金立S520手机归属地

    2010-03-20 08:42:52
    金立S520手机号码归属地查询数据,其中包含全国手机、固话数据信息,查询来电归属地

空空如也

空空如也

1 2 3 4 5 6
收藏数 120
精华内容 48
关键字:

手机号码来电归属地