Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 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();
}更多Android相关信息见Android 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=11