Android黑名单挂断电话的操作

  1. 实现电话状态的监听

    • 获取电话管理器(TelephonyManager)
    • 用管理器监听电话的状态
    • 添加权限
TelephonyManager tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(listener, 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:// 响铃状态
                if(blackNumber.equals(incomingNumber)){
                endCall();
}
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:// 接通电话状态
                break;
            case TelephonyManager.CALL_STATE_IDLE:// 空闲状态
                break;
            }
        }
    }

uses-permission android:name=”android.permission.READ_PHONE_STATE”/

2.用反射获取ITelephony挂断电话

 - 首先要调用telephony的远程服务
  -在工程中添加两个包package android.telephony;
  package com.android.internal.telephony;
`````
private void endCall() {
        // 不能用直接调用挂断电话,要用反射的方法调用
        try {
            Class clazz = getClassLoader().loadClass(
                    "android.os.ServiceManager");
            Method m = clazz.getMethod("getService", String.class);
            IBinder iBinder = (IBinder) m.invoke(null,
                    Context.TELEPHONY_SERVICE);
            // IBinder挂断电话需要用到AIDL,拷贝需要用到的AIDL文件,ITelephony.aidl和NeighboringCellInfo.aidl,包名要与原包名一致
            ITelephony iTelephony=ITelephony.Stub.asInterface(iBinder);
            iTelephony.endCall();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }




<div class="se-preview-section-delimiter"></div>

-添加权限

uses-permission android:name="android.permission.CALL_PHONE"/

-添加权限

uses-permission android:name=”android.permission.CALL_PHONE”/


附:两个包中类的代码

/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the “License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an “AS IS” BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.android.internal.telephony;

import android.os.Bundle;
import java.util.List;
import android.telephony.NeighboringCellInfo;

/**
* Interface used to interact with the phone. Mostly this is used by the
* TelephonyManager class. A few places are still using this directly.
* Please clean them up if possible and use TelephonyManager insteadl.
*
* {@hide}
*/
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 <code>dial</code> 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<NeighboringCellInfo> getNeighboringCellInfo();

 int getCallState();
 int getDataActivity();
 int getDataState();

/**
 * Returns the current active phone type as integer.
 * Returns TelephonyManager.PHONE_TYPE_CDMA if RILConstants.CDMA_PHONE
 * and TelephonyManager.PHONE_TYPE_GSM if RILConstants.GSM_PHONE
 */
int getActivePhoneType();

/**
 * Returns the CDMA ERI icon index to display
 */
int getCdmaEriIconIndex();

/**
 * Returns the CDMA ERI icon mode,
 * 0 - ON
 * 1 - FLASHING
 */
int getCdmaEriIconMode();

/**
 * Returns the CDMA ERI text,
 */
String getCdmaEriText();

/**
 * Returns true if CDMA provisioning needs to run.
 */
boolean getCdmaNeedsProvisioning();

/**
  * Returns the unread count of voicemails
  */
int getVoiceMessageCount();

/**
  * Returns the network type
  */
int getNetworkType();

/**
 * Return true if an ICC card is present
 */
boolean hasIccCard();

}

/* //device/java/android/android/content/Intent.aidl
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the “License”);
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an “AS IS” BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

package android.telephony;

parcelable NeighboringCellInfo;
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值