import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ListView;

public class BlockMain extends Activity {
  //记录黑名单的List
  ArrayList<String> blockList = new ArrayList<String>();
  TelephonyManager tManager;
  //监听通话状态的监听器
  CustomPhoneCallListener cpListener;
  public class CustomPhoneCallListener extends PhoneStateListener{
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
      switch (state) {
        case TelephonyManager.CALL_STATE_IDLE:
          break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
          break;
        //电话呼入时
        case TelephonyManager.CALL_STATE_RINGING:
        //如果该号码属于黑名单
        if(isBlock(incomingNumber)){
          try {
            Method method = Class.forName("android.os.ServiceManager")
                          .getMethod("getService", String.class);
            //获取远程TELEPHONY_SERVICE的IBinder对象的代理
            IBinder binder = (IBinder) method.invoke(null,
                    new Object[]{TELEPHONY_SERVICE});
            //将IBinder对象的代理转换为ITelephony对象
            ITelephony telephony = ITelephony.Stub.asInterface(binder);
            //挂断电话
            telephony.endCall();
          } catch (NoSuchMethodException e) {
            e.printStackTrace();
          } catch (ClassNotFoundException e) {
            e.printStackTrace();
          } catch (IllegalArgumentException e) {
            e.printStackTrace();
          } catch (IllegalAccessException e) {
            e.printStackTrace();
          } catch (InvocationTargetException e) {
            e.printStackTrace();
          } catch (RemoteException e) {
            e.printStackTrace();
          }
        }

        default:
          break;
      }
      super.onCallStateChanged(state, incomingNumber);
    }
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_block_main);
    //获取系统的TelephonyManager管理器
    tManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    cpListener = new CustomPhoneCallListener();
    //通过TelephonyManager监听通话状态的改变
    tManager.listen(cpListener, PhoneStateListener.LISTEN_CALL_STATE);
    //获取程序的按钮,并为它的单击事件绑定监听器
    findViewById(R.id.managerBlock).setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View v) {
        // 查询联系人的电话号码
        final Cursor cursor = getContentResolver().query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                      null, null, null, null);
        BaseAdapter adapter = new BaseAdapter() {

          @Override
          public View getView(int position, View convertView, ViewGroup parent) {
            cursor.moveToPosition(position);
            CheckBox rb = new CheckBox(BlockMain.this);
            //获取联系人的电话号码,并去掉中间的中划线
            String number = cursor.getString(cursor
                .getColumnIndex(ContactsContract.
                CommonDataKinds.Phone.NUMBER)).replace("-", "");
            rb.setText(number);
            //如果该号码已经被加入黑名单,默认勾选该号码
            if(isBlock(number)){
            rb.setChecked(true);
          }
          return rb;
        }

        @Override
        public long getItemId(int position) {
          return position;
        }

        @Override
        public Object getItem(int position) {
          return position;
        }

        @Override
        public int getCount() {
          return cursor.getCount();
        }
      };
      //加载list.xml布局文件对象的View
      View selectView = getLayoutInflater().inflate(R.layout.list, null);
      //获取selectView中的名为list的ListView组件
      final ListView listView = (ListView) selectView.findViewById(R.id.list);
      listView.setAdapter(adapter);
      new AlertDialog.Builder(BlockMain.this).setView(selectView)
          .setPositiveButton("确定", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
          // 清空blockList集合
          blockList.clear();
          //遍历ListView组件的每个列表项
          for(int i = 0; i<listView.getCount() ; i++){
            CheckBox checkBox = (CheckBox) listView.getChildAt(i);
            //如果该列表项被勾选
            if(checkBox.isChecked()){
            //添加该列表项的电话号码
            blockList.add(checkBox.getText().toString());
          }
        }
        System.out.println(blockList);
      }
     }).show();
    }
  });
  }

  //判断某个电话号码是否在黑名单中
  public boolean isBlock(String phone){
    for(String s1 : blockList){
      if(s1.equals(phone)){
        return true;
      }
    }
    return false;
  }

}

程序的改进:

1.程序可通过后台运行的Service来监听号码,并设置该Service随系统开机自动运行。

2.程序应该把黑名单(也就是程序中blockList集合里的元素)写入文件中,这样即使手机关机、程序退出,黑名单信息依然不会丢失。

3、程序还应该提供一个输入框,让用户自行输入需要屏蔽的电话号码,这样该程序不仅可以屏蔽系统联系人的号码,也可屏蔽任何想屏蔽的号码。

TelephonyManager对黑名单的管理的更多相关文章

  1. Android提供的系统服务之--TelephonyManager(电话管理器)

    Android提供的系统服务之--TelephonyManager(电话管理器) 转载请注明出处--coder-pig TelephonyManager的作用: 用于管理手机通话状态,获取电话信息(设 ...

  2. 自学Aruba6.3-账号管理(web页面配置)

    点击返回:自学Aruba之路 自学Aruba6.3-账号管理(web页面配置) 1 管理员账号管理 Configuration---Administrator中 角色名称 说明 root 该角色允许管 ...

  3. 李洪强iOS开发之-环信02_iOS SDK 介绍及导入

    李洪强iOS开发之-环信02_iOS SDK 介绍及导入 iOS SDK 介绍及导入 iOS SDK 介绍 环信 SDK 为用户开发 IM 相关的应用提供的一套完善的开发框架.包括以下几个部分: SD ...

  4. iOS 环信集成项目应用

    环信iOS端3.0版本集成记录--聊天界面篇 环信离线推送证书... 1,环信处在后台的时候,消息的接收与推送 离线发推送 配置属性 EMCallOptions *options = [[EMClie ...

  5. Android TelephonyManager电话管理器

    今天介绍一下Android的电话管理器--TelephonyManager,TelephonyManager管理手机通话状态.电话网络信息的服务类,获取TelephonyManager: Teleph ...

  6. 利用电话管理器TelephonyManager获取网络和SIM卡信息

    import java.util.ArrayList;import java.util.HashMap;import java.util.Map; import android.os.Bundle;i ...

  7. Linux系统下的软件管理(rpm)、搭建第三方软件库、yum的黑名单

    对wps-office进行模糊匹配照样可以查找出该软件yum clean all ? ? ? ?##清空yum缓存识别新配置 测验安装wps软件: 安装成功即可使用办公软件 1.yum install ...

  8. Android初级教程反射+AIDL+内容观察者监控黑名单号码代码模板

    对于想要拦截一些莫名的陌生号码,就需要电话拦截功能与删除其电话记录功能.拦截的主要业务逻辑,分别是在一个服务里面进行:1.注册电话监听:2.取消注册电话监听(当然注册于取消是在服务里面建立一个广播接收 ...

  9. C#开发微信门户及应用(37)--微信公众号标签管理功能

    微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...

随机推荐

  1. SAP FI/CO凭证不一致的解决办法

    First, use program RKACOR20 to delete the incorrect CO documents. OKBA - Transfer FI Documents to CO ...

  2. struts2 if正确标签示例

    下面总结一下struts2 中if标签的使用 (1)判断字符串是否为空 <s:if test="user.username==null or user.username==''&quo ...

  3. MonkeyRunner学习(2)常用命令

    目录: 1.截图 2.暂停 (时延秒) 3.屏幕操作 4.打印 5.字符串发送到键盘输入(登录输入) 6.唤醒设备屏幕 7.重起手机 8.按键(系统键) 9.回车键 10.for 循环 11.循环截图 ...

  4. 【linux命令】:查看系统运行状态,命令top 【转载】

    原文:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html 简介 top命令是Linux下常用的性能分析工具,能够实时显示系 ...

  5. Android_SDK的常用命令

    一.配置环境变量 要想使用这些命令,就必须先配置环境变量.  将android-sdk-windows目录下的platform-tools目录和tools目录配置到path环境变量中 二.adb命令 ...

  6. hiho_1053_居民迁移

    题目大意 有N个居民点在一条直线上,每个居民点有一个x表示坐标,y表示居民点的现有居民数.现在要求将居民点的居民重新分配,每个居民点的居民最远迁移的距离为R,要求分配完之后,居民点中居民数最多的居民点 ...

  7. vim 学习记录2

    当前行进行替换:s/XXX/YYY/gXXX是需要替换的字符串,YYY是替换后的字符串. 全局替换:% s/XXX/YYY/g. 对指定部分进行替换用V进入visual模式,再进行:s/XXX/YYY ...

  8. [C:\Users\Administrator\.IntelliJIdea2016.1\system\tomcat\Unnamed_demo_2\work\Catalina\localhost\demo\org\apache\jsp\index_jsp.java]

    http://www.oschina.net/question/1444338_2146454?sort=time

  9. SCCM部署win7操作系统,系统盘为D盘

    SCCM部署win7操作系统,系统盘为D盘 1. 系统部署完毕之后是这样的 2.解决方案 解决分发干净Windows7操作系统盘符为”D”的方法也比较简单. 在SCCM管理控制台中,打开”软件库””操 ...

  10. linux笔记:linux常用命令-权限管理命令

    一个文件的权限只有root和所有者可以更改. 权限管理命令:chmod(改变文件或目录的权限) 权限的数字表示: 用权限加减的方式改变权限(u代表所有者,g代表所属组,o代表其他人,a代表所有人): ...