加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Android 结束通话--达成黑名单拦截

发布时间:2021-11-20 16:48:00 所属栏目:教程 来源:互联网
导读:知识点讲解: Android没有对外公开结束通话的API,如果需要结束通话,必须使用AIDL与电话管理服务进行通信,并调用服务中的API实现结束通话,方法如下: 1 从Android的源代码中拷贝以下文件到项目中: com.android.internal.telephony包下的ITelephony.aidl

知识点讲解:
 
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();
}

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读