安卓——屏蔽陌生来电
发布日期:2021-06-29 11:11:58 浏览次数:3 分类:技术文章

本文共 7252 字,大约阅读时间需要 24 分钟。

我只能说网上代码坑惨我了,下载的案例有的都用不来,后来研究了一下,发现也是比较简单的。唯一有点特殊的就是那个aidl文件那里,第一次接触,问了毕业 的学长知道这回事……

一;
该案例就是两个关键类TelephonyManager(获取系统的TelephonyManager管理器)和PhoneStateListener(监听电话状态的)其中的onCallStateChanged((int state, String incomingNumber))就是当电话状态改变时会回调该方法。
接下来再程序中具体介绍一下吧
在oncreat方法中

//获取系统的TelephonyManager管理器        tManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);        //获取PhoneStateListener的实例        pListener = new PhonecallListener();        //为电话管理器添加监听事件        tManager.listen(pListener, PhoneStateListener.LISTEN_CALL_STATE);

创建好这些变量

PhonecallListener为继承PhoneStateListener的内部类

//内部类,继承PhoneStateListener的子类public class PhonecallListener extends PhoneStateListener    {
@Override //重写的方法,当电话状态改变时调用。state为改变后的状态.... public void onCallStateChanged(int state, String incomingNumber) { System.out.println("监听开始"); switch(state) { case TelephonyManager.CALL_STATE_IDLE:break; case TelephonyManager.CALL_STATE_OFFHOOK:break; //当有电话拨入时 case TelephonyManager.CALL_STATE_RINGING: System.out.println("来电"); if(isBlock(incomingNumber)) { 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(); System.out.println("挂断成功"); }catch(Exception e){e.printStackTrace();} } break; } super.onCallStateChanged(state, incomingNumber); } }

类的分布图

这里写图片描述
注意这个两个aidl文件以及所在的包
NeighboringCellInfo文件必须位于android.telephony;包中
其内容为

package android.telephony;parcelable NeighboringCellInfo;

ITelephony文件必须位于com.android.internal.telephony包中

其内容为

interface ITelephony {    /**     * Dial a number. This doesn't place the call. It displays     * the Dialer screen.     * @param number the number to be dialed. If null, this     * would display the Dialer screen with no number pre-filled.     */    void dial(String number);    /**     * Place a call to the specified number.     * @param number the number to be called.     */    void call(String number);    /**     * If there is currently a call in progress, show the call screen.     * The DTMF dialpad may or may not be visible initially, depending on     * whether it was up when the user last exited the InCallScreen.     *     * @return true if the call screen was shown.     */    boolean showCallScreen();    /**     * Variation of showCallScreen() that also specifies whether the     * DTMF dialpad should be initially visible when the InCallScreen     * comes up.     *     * @param showDialpad if true, make the dialpad visible initially,     *                    otherwise hide the dialpad initially.     * @return true if the call screen was shown.     *     * @see showCallScreen     */    boolean showCallScreenWithDialpad(boolean showDialpad);    /**     * End call or go to the Home screen     *     * @return whether it hung up     */    boolean endCall();    /**     * Answer the currently-ringing call.     *     * If there's already a current active call, that call will be     * automatically put on hold.  If both lines are currently in use, the     * current active call will be ended.     *     * TODO: provide a flag to let the caller specify what policy to use     * if both lines are in use.  (The current behavior is hardwired to     * "answer incoming, end ongoing", which is how the CALL button     * is specced to behave.)     *     * TODO: this should be a oneway call (especially since it's called     * directly from the key queue thread).     */    void answerRingingCall();    /**     * Silence the ringer if an incoming call is currently ringing.     * (If vibrating, stop the vibrator also.)     *     * It's safe to call this if the ringer has already been silenced, or     * even if there's no incoming call.  (If so, this method will do nothing.)     *     * TODO: this should be a oneway call too (see above).     *       (Actually *all* the methods here that return void can     *       probably be oneway.)     */    void silenceRinger();    /**     * Check if we are in either an active or holding call     * @return true if the phone state is OFFHOOK.     */    boolean isOffhook();    /**     * Check if an incoming phone call is ringing or call waiting.     * @return true if the phone state is RINGING.     */    boolean isRinging();    /**     * Check if the phone is idle.     * @return true if the phone state is IDLE.     */    boolean isIdle();    /**     * Check to see if the radio is on or not.     * @return returns true if the radio is on.     */    boolean isRadioOn();    /**     * Check if the SIM pin lock is enabled.     * @return true if the SIM pin lock is enabled.     */    boolean isSimPinEnabled();    /**     * Cancels the missed calls notification.     */    void cancelMissedCallsNotification();     /**     * Supply a pin to unlock the SIM.  Blocks until a result is determined.     * @param pin The pin to check.     * @return whether the operation was a success.     */    boolean supplyPin(String pin);    /**     * Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated     * without SEND (so dial is not appropriate).     *      * @param dialString the MMI command to be executed.     * @return true if MMI command is executed.     */    boolean handlePinMmi(String dialString);    /**     * Toggles the radio on or off.     */    void toggleRadioOnOff();    /**     * Set the radio to on or off     */    boolean setRadio(boolean turnOn);    /**     * Request to update location information in service state     */    void updateServiceLocation();    /**     * Enable location update notifications.     */    void enableLocationUpdates();    /**     * Disable location update notifications.     */    void disableLocationUpdates();    /**     * Enable a specific APN type.     */    int enableApnType(String type);    /**     * Disable a specific APN type.     */    int disableApnType(String type);    /**     * Allow mobile data connections.     */    boolean enableDataConnectivity();    /**     * Disallow mobile data connections.     */    boolean disableDataConnectivity();    /**     * Report whether data connectivity is possible.     */    boolean isDataConnectivityPossible();    Bundle getCellLocation();    /**     * Returns the neighboring cell information of the device.     */    List
getNeighboringCellInfo(); int getCallState(); int getDataActivity(); int getDataState();}

在eclipse中添加aidl文件的方法

先在这个包中新建.java然后到工作所在文件文件夹中吧java的后缀改成aidl即可.

还有一个重要的就是传限permission

源码下载:

转载地址:https://blog.csdn.net/zw1996/article/details/78087666 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:安卓布局——tabhost底部
下一篇:安卓界面——最开始界面的加载

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月06日 05时21分47秒