1. 程式人生 > >Android下的來電管理——呼叫隱藏的API

Android下的來電管理——呼叫隱藏的API

感覺下面這種方法不科學,目前我不是使用這種方式接聽和拒絕的。

Android 的API裡沒有直接提供方法可以接聽電話,其實接聽電話、撥打電話這些通訊方面的功能在最底層是通過傳送AT 指令實現,傳送AT指令要開啟linux系統/dev/目錄下的某個AT口裝置檔案,不同的手機和不同的韌體,這個檔名都不相同,所以用這種底層的方法實現比較麻煩(涉及到linux系統程式設計和通訊方面的知識)。 既然Android系統的應用層通過介面就能撥打電話、接聽電話,Android FrameWork的原始碼又是公開的,從原始碼出發。

 關鍵檔案 :frameworks/base/telephony/java/com/android/internal/telephony/Phone.java

Phone.java 是一個interface,提供很多和手機相關的方法,有我們要找的拒絕來電rejectCall()和接聽來電acceptCall(),還有其它如鎖定手機網路型別(GSM,WCDMA等 )...Phone只是一個介面,應該怎樣例項化呢?在相同目錄下可以找到PhoneFactory 這個類,裡面的靜態方法getDefaultPhone()可以例項化一個Phone物件(會根據當前手機型別例項化成GsmPhone或CdmaPhone,當然Wcdma的也會例項化成GsmPhone,這個不多說,至於TD手機,問中國移動要程式碼去吧 )。

        用PhoneFactory的靜態方法直接例項化Phone這個物件,Phone的函式就可以任意呼叫了,我們現在只關心rejectCall()和accptCall()這兩個函式。

程式碼如

//引用未公開的API  
    import com.android.internal.telephony.Phone;  
    import com.android.internal.telephony.PhoneFactory;  
    import com.android.internal.telephone.CallStateException;  
    public class MyPhone(){  
        private Phone mPhone = null;  
              
        public MyPhone(){  
           mPhone = PhoneFactory.getDefaultPhone();  
        }  
        /**打電話*/  
        public void call(String number){  
            try  
            {  
                connection = phone.dial( number );  
                         
            }  
            catch(CallStateException e){  
                //Log.e(tag,e.toString() );  
            }  
        }  
          
        /**接電話*/  
        public void acceptCall(){  
            try  
            {  
                phone.acceptCall();  
            }  
            catch(CallStateException e){  
                //Log.e(tag,e.toString() );  
            }  
          
        }  
          
        /**拒接電話*/  
        public void rejectCall(){  
            try{  
                phone.rejectCall();  
            }catch(CallStateException e){  
                //Log.e(tag,e.toString() );  
            }  
        }  
          
          
    }  

  把程式碼放到Eclipse裡吧,會發現根本無法import兩個關鍵的類名Phone和PhoneFactory,因為androd.jar包裡不包含這兩個類,Google沒有把它們放在SDK裡,至少目前SDK1.5-2.2都是沒有的,可能是牽涉到法律問題吧。

  要引用這此未公開到SDK裡的API,可以直接在原始碼環境下把應用程式編譯成apk檔案。

相關推薦

Android來電管理——呼叫隱藏API

感覺下面這種方法不科學,目前我不是使用這種方式接聽和拒絕的。 Android 的API裡沒有直接提供方法可以接聽電話,其實接聽電話、撥打電話這些通訊方面的功能在最底層是通過傳送AT 指令實現,傳送AT指令要開啟linux系統/dev/目錄下的某個AT口裝置檔案,不同

突破Android P(Preview 1)對呼叫隱藏API限制的方法

奇技指南 在之前的文章《Android P 呼叫隱藏API限制原理》中,我們分析了Android P Preview 1版本對隱藏API呼叫限制的原理,這次我們帶來了繞過限制的的方法。 本文首發於公眾號奇卓社,已授權轉載。 概要 本文基於對AndroidP(Previ

Android P 呼叫隱藏API限制原理

隨著Android P預覽版的釋出,谷歌在改進系統穩定性的措施上又增加了新的限制,即應用程式引用非SDK介面,無論採用直接、反射、JNI獲取等手段都將受到限制。在谷歌提供的預覽版文件&&App Compatibility Changes一節中,我們可以知道如下資

Android黑名單來電管理

public class BlocklistDbHelper extends SQLiteOpenHelper { private final static String TAG = "BlocklistDbHelper"; public static final String DA

android 隱藏API顯式呼叫以及內部資源使用方法

一、android.jar包 android.jar是我們Android應用開發包,它內部包含了我們在應用開發中需要使用的所有API呼叫。 二、顯式使用 Android 隱藏 API 和內部 API 在進行Android應用開發的時候,一般會選擇指定的編譯

Android的配置管理之道之使用curl命令訪問gerrit的REST API

簡單的測試 reset api 可以像下面這樣 curl http://localhost:8080/path/to/api/ curl命令預設是傳送GET請求的,可以通過選項 -X來設定 cu

Android的配置管理之道之repo的使用

谷歌對android的原始碼管理使用的是git。但是在git的基礎上,谷歌開發出來了一套新的工具,python寫的一套指令碼,名字是repo。 Android原始碼工程(AOSP)是非常多的git倉庫組成的。目前估計有上百個獨立的git倉庫。 怎麼管理這些倉

聽說 Android 9.0 要禁用 @Hide Api呼叫,你怎麼看?

Android 9.0? Hi,大家好,我是承香墨影! 距離 Android 8.0 釋出,已經過了五個月,雖然現在佔有率並不高,不過呢,Google 已經著手準備下一版本的 Android 系統。 上週,據快科技爆出來的訊息,在 XDA社群 有人

OpenwrtC呼叫UCI API

“uci”是”Unified Configuration Interface”(統一配置介面)的縮寫,意在OpenWrt整個系統的配置集中化。 許多程式在系統某處擁有自己的配置檔案,比如/etc/network/interfaces, /etc/expor

Android studio使用SDK隱藏API方法

方法一:1. 編譯 Android 原始碼 2. 找到 \out\target\common\obj\JAVA_LIBRARIES\framework_intermediates\classes.ja

Android利用Shell命令管理網路介面

為啥要使用shell命令操縱本地網路?因為這樣就可以繞過上層connectService來幹一些事情,至於具體要乾點什麼事情,容我先賣個關子在以後的blog裡說明。 首先進入adb shell,然後去Ping一個伺服器的ip地址 ping 211.69.198.222 P

linux系統呼叫API、系統命令,核心函式的區別與聯絡

1.系統呼叫: 應用程式和核心間的橋樑,是應用程式訪問核心的入口點;但通常情況下,應用程式通過作業系統提供的API進行程式設計而不是使用系統呼叫直接程式設計; linux的全部系統呼叫加起來大約只有250個左右。 2.API:   API常以c庫(libc)的形式提供,

Android列印呼叫

1. Java層如何列印呼叫棧? 在優化Android啟動過程時,同事給出一種打印出呼叫棧的函式。分享一下     java.util.Map<Thread, StackTraceElement[]> ts = Thread.getAllStack

Android的配置管理之道之主從gerrit配置使用replication外掛

gerrit配置使用replication外掛 最終實現的效果如下圖所示 實現員工下帶程式碼從一個從gerrit下載,上傳程式碼到主gerrit上。 首先是主gerrit伺服器上面要配置一下s

Android編譯自己的庫檔案jar並在應用中呼叫

主要為了解決如下問題:專案中使用了Android未公開的API,在Eclipse下會有紅叉顯示。不同的專案抽出相同部分的程式碼共用。必需的前提條件:需要有Android原始碼,編譯的庫檔案主要是封裝未公開API或者共用程式碼。工程1:Java庫檔案工程該工程最終會生成以

Android 隱藏虛擬導航欄的方法,不需要root,需要的時候調出,彈dialog不會閃現

    相信做安卓開發的人員對虛擬導航欄都有著特殊的經歷,在沒有root的情況下,如果隱藏它?    有的時候我們需要這樣一個場景,它會自動隱藏,不論我點選螢幕,或者彈出dialog,都不希望它彈出來,只有我需要用的,手指上劃顯示即可,不需要的時候永遠不要出來。    筆者也

Android提高第十三篇之探祕藍芽隱藏API

package com.testReflect; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import

android如何實現EditText顯示隱藏密碼的實現,

在Google釋出了support:design:23+以後我們發現有這麼一個東西TextInputLayout,先看下效果圖: <android.support.design.widget.TextInputLayout a

匯入Android系統原始碼jar包, 使用所有隱藏API的方法

一.編譯Android原始碼,假設原始碼在Z:\android2.3.4_GB_T34,編譯完成後在Z:\android2.3.4_GB_T34\out\target\common\obj\JAVA_LIBRARIES\framework_intermediates目錄下會生

android中webView JS呼叫Android的方法、webView的拉重新整理(SwipeRefreshLayout)、下載檔案

最近一直在寫webView的東西,發現有好多功能點,記一下。 JS呼叫Android的方法: 在JS中:寫 window.JavaScriptinterface.closecurrent(); 在Adnriod中: webView.ad