黑名单来电自动挂断

本文介绍了一个基于Android平台的来电拦截程序,通过监听电话状态并利用AIDL与电话管理Service通信来实现黑名单号码的自动挂断功能。此外,还讨论了程序如何通过系统联系人ContentProvider获取联系人信息,并提供了用户自定义黑名单的功能。

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

该程序也是监听TelephonyManager的通话状态来实现该功能,当系统检测到有电话呼入时,立刻判断该号码是否在黑名单中,如果该号码在黑名单中立即挂断该号码即可.
遗憾的是,Android没有对外公开挂断电话的API,如果需要挂断电话,必须使用 AIDL与电话管理Service进行通信,并调用服务中的API实现结束通话.
为了调用远程AIDLService,开发者需要讲Android源代码中如下的两个文件复制到相应的位置.

  1. com.android.internal.teleplony 包下的 ITelephony.aidl.
  2. android.teleplony 包下的 NeighboringCellinfo.aidl.

    本程序还要调用系统联系人 ContentProvider来获取系统联系人信息,获取系统联系人信息之后,程序需要提供一份袋复选框的列表供用户勾选黑名单.


/**
 * 
 */
package org.crazyit.manager;

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

import com.android.internal.telephony.ITelephony;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.ContactsContract;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
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;

/**
 * Description: <br/>
 * 网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> <br/>
 * Copyright (C), 2001-2012, Yeeku.H.Lee <br/>
 * This program is protected by copyright laws. <br/>
 * Program Name: <br/>
 * Date:
 * 
 * @author Yeeku.H.Lee kongyeeku@163.com
 * @version 1.0
 */
public class BlackListActivity 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 number)
        {
            switch (state)
            {
                case TelephonyManager.CALL_STATE_IDLE:
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    break;
                // 当电话呼入时
                case TelephonyManager.CALL_STATE_RINGING:
                    // 如果该号码属于黑名单
                    if (isBlock(number))
                    {
                        System.out.println("~~~挂断电话~~~");
                        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 (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                    break;
            }
            super.onCallStateChanged(state, number);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 获取系统的TelephonyManager管理器
        tManager = (TelephonyManager) 
            getSystemService(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 int getCount()
                        {
                            return cursor.getCount();
                        }

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

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

                        @Override
                        public View getView(int position,
                            View convertView, ViewGroup parent)
                        {
                            cursor.moveToPosition(position);
                            CheckBox rb = new CheckBox(BlackListActivity.this);
                            // 获取联系人的电话号码,并去掉中间的中划线、空格
                            String number = cursor
                                .getString(cursor.getColumnIndex(
                                ContactsContract.CommonDataKinds
                                .Phone.NUMBER))
                                .replace("-", "")
                                .replace(" ", "");
                            rb.setText(number);
                            // 如果该号码已经被加入黑名单、默认勾选该号码
                            if (isBlock(number))
                            {
                                rb.setChecked(true);
                            }
                            return rb;
                        }
                    };
                    // 加载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(BlackListActivity.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)
    {
        System.out.println("呼入号码:" + phone);
        System.out.println("--------" + blockList);

        for (String s1 : blockList)
        {
            if (s1.equals(phone))
            {
                return true;
            }
        }
        return false;
    }
}

如果用户不希望接听某个号码的来电,只要把此人的号码添加到黑名单中即可.
这个程序还可以进一步改进:

  1. 程序可通过后台运行的Service来监听号码,并设置该Service随系统开机自动打开运行.
  2. 程序应该把黑名单(也就是程序中的blackList集合中的元素)写入文件中,这样即使手机关机,程序退出,黑名单信息也不会丢失.
  3. 程序还应该提供一个输入框.让用户自行输入需要屏蔽的号码.这样改程序不仅可以屏蔽系统联系人号码,也可以屏蔽任何想屏蔽的号码.

在清单文件 AndroidManifest.xml中需要添加如下权限 :

<!-- 授予该应用控制通话的权限 -->
    <uses-permission android:name="android.permission.CALL_PHONE" />    
    <!-- 授予该应用读取通话状态的权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!-- 授予读联系人ContentProvider的权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <!-- 授予写联系人ContentProvider的权限 -->
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值