Android 结束通话--实现黑名单拦截


知识点讲解:
 
Android没有对外公开结束通话的API,如果需要结束通话,必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,方法如下:

 1> 从Android的源代码中拷贝以下文件到项目中:
 com.android.internal.telephony包下的ITelephony.aidl
 android.telephony包下的NeighboringCellInfo.aidl
 注意:需要在项目中建立对应的包名存放上述两个aidl文件,
 如下图所示。开发工具会在gen目录下自动生成ITelephony.java


 
2> 调用ITelephony.endCall()结束通话:
 Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
 IBinder binder = (IBinder)method.invoke(null, new Object[]{TELEPHONY_SERVICE});
 ITelephony telephony = ITelephony.Stub.asInterface(binder);
 telephony.endCall();
 
在清单文件AndroidManifest.xml中添加权限:
 
<uses-permission android:name="android.permission.CALL_PHONE" />
 
代码示例:
 
DemoActivity.java:
 
package cn.itcast.endcall;

import java.lang.reflect.Method;

import com.android.internal.telephony.ITelephony;

import android.app.Activity;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.view.View;

public class DemoActivity extends Activity {
 ITelephony iTelephony;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  try {
   // 获取系统电话管理的服务
   Method method = Class.forName("android.os.ServiceManager")
     .getMethod("getService", String.class);
   // 通过反射技术获得binder对象
   IBinder binder = (IBinder) method.invoke(null,
     new Object[] { TELEPHONY_SERVICE });
   iTelephony = ITelephony.Stub.asInterface(binder);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public void endcall(View view) {
  try {
   // iTelephony.endCall();
   iTelephony.call("15139394270");
  } catch (RemoteException e) {
   e.printStackTrace();
  }
 }
}

另附NeighboringCellInfo.aidl:

/* //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;

ITelephony.aidl:

/*
 * 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();
}

相关内容

    暂无相关文章