zoukankan      html  css  js  c++  java
  • Android通过AIDL和反射调用系统拨打电话和挂断电话

    首先在项目中添加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;
    import android.telephony.CellInfo;
    
    /**
     * 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 callingPackage, 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 if there is a call in progress, otherwise does nothing.
         *
         * @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);
    
        /**
         * Supply puk to unlock the SIM and set SIM pin to new pin.
         *  Blocks until a result is determined.
         * @param puk The puk to check.
         *        pin The new pin to be set in SIM
         * @return whether the operation was a success.
         */
        boolean supplyPuk(String puk, String pin);
    
        /**
         * Supply a pin to unlock the SIM.  Blocks until a result is determined.
         * Returns a specific success/error code.
         * @param pin The pin to check.
         * @return retValue[0] = Phone.PIN_RESULT_SUCCESS on success. Otherwise error code
         *         retValue[1] = number of attempts remaining if known otherwise -1
         */
        int[] supplyPinReportResult(String pin);
    
        /**
         * Supply puk to unlock the SIM and set SIM pin to new pin.
         * Blocks until a result is determined.
         * Returns a specific success/error code
         * @param puk The puk to check
         *        pin The pin to check.
         * @return retValue[0] = Phone.PIN_RESULT_SUCCESS on success. Otherwise error code
         *         retValue[1] = number of attempts remaining if known otherwise -1
         */
        int[] supplyPukReportResult(String puk, 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);
    
        /**
         * Set the radio to on or off unconditionally
         */
        boolean setRadioPower(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(String callingPkg);
    
         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 OTA service provisioning needs to run.
         * Only relevant on some technologies, others will always
         * return false.
         */
        boolean needsOtaServiceProvisioning();
    
        /**
          * Returns the unread count of voicemails
          */
        int getVoiceMessageCount();
    
        /**
          * Returns the network type for data transmission
          */
        int getNetworkType();
    
        /**
          * Returns the network type for data transmission
          */
        int getDataNetworkType();
    
        /**
          * Returns the network type for voice
          */
        int getVoiceNetworkType();
    
        /**
         * Return true if an ICC card is present
         */
        boolean hasIccCard();
    
        /**
         * Return if the current radio is LTE on CDMA. This
         * is a tri-state return value as for a period of time
         * the mode may be unknown.
         *
         * @return {@link Phone#LTE_ON_CDMA_UNKNOWN}, {@link Phone#LTE_ON_CDMA_FALSE}
         * or {@link PHone#LTE_ON_CDMA_TRUE}
         */
        int getLteOnCdmaMode();
    
        /**
         * Returns the all observed cell information of the device.
         */
        List<CellInfo> getAllCellInfo();
    
        /**
         * Sets minimum time in milli-seconds between onCellInfoChanged
         */
        void setCellInfoListRate(int rateInMillis);
    }

    注意:call()方法的参数因版本不同,版本<=4.2.2的一个参数void call(String number);版本>=4.3的两个参数void call(String callingPackage,String number)

    添加完ITelephony.aidl文件后,Rebuild Project一下(AS中的)。

    接下来关键部分在启动窗体中,看代码:

       @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
            Class<TelephonyManager> managerClass = TelephonyManager.class;//得到TelephonyManager的Class对象
            try {//得到挂断电话的方法
                Method getITelephony = managerClass.getDeclaredMethod("getITelephony", (Class[]) null);
                //打开权限
                getITelephony.setAccessible(true);
                //得到TelephonyManager对象
                TelephonyManager manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
                //得到ITelephony对象,进行所需要的操作
                ITelephony iTelephony = (ITelephony) getITelephony.invoke(manager, (Object[]) null);
                try {
                    //打电话
                    iTelephony.call(getPackageName(),"xxxxxxxxxxx");
                    Thread.sleep(5000);
    //挂电话 iTelephony.endCall(); }
    catch (RemoteException e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } }

    还有权限添加,over,好了!

  • 相关阅读:
    zabbix3.0配置服务器流量告警
    centos6.5环境Redis下载及编译安装
    tomcat报错catalina.sh: line 401: /usr/java/jdk1.7.52/bin/java: No such file or directory
    zabbix报警Too many processes on zabbix server
    tomcat报错:java.net.SocketException: Permission denied["http-nio-80"]
    tomcat启动报错:Injection of autowired dependencies failed
    java的split的坑,会忽略空值
    教训:任何的程序脚本,即便你认为再没有问题,也要测试一下再上线。
    如何修改HDFS的备份数
    sqoop遇到的问题
  • 原文地址:https://www.cnblogs.com/IT-Goddess/p/5702618.html
Copyright © 2011-2022 走看看