青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

life02

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks
http://blog.csdn.net/tyfjy/article/details/6452126

今天介紹一下在Android中實現通話接通后震動提示,這里通話主要是針對撥出的電話.想要在接通的時候給出震動提示那么我們就需要知道通話何時是被接通的.這樣才能在進入該狀態后給出提示.SDK中并沒有直接獲得這種狀態的方式.首先我們看一下SDK中電話服務類為我們提供了哪些通話狀態.

SDK中的TelephonyManager類提供了3種電話的狀態.

CALL_STATE_IDLE 空閑狀態

CALL_STATE_OFFHOOK 摘機狀態

CALL_STATE_RINGING  響鈴狀態

這幾個狀態很容易理解,其中摘機狀態即拿起話筒(對于座機電話而言的動作),但這個狀態可能發生在撥入電話接通時,也可能是撥出電話時.但是卻不能說明撥出電話接通時.通過以上3種狀態我們僅能組合出:掛機,來電接通.這兩個狀態.而今天我們要實現的功能卻無法做到.

看來我們需要尋找其他方法來實現了,SDK靠不住啊……

 

還好Android在運行時會有大量的log產生,看看我們能不能從這上面找到突波口呢.我們選擇AndroidRadio模塊的日志來分析.首先我們需要寫一段代碼來讀取Radio相關的log.讀取log就不得不用到logcat.

  1.     Process process;  
  2.         InputStream inputstream;  
  3.         BufferedReader bufferedreader;  
  4.         try {  
  5.             process = Runtime.getRuntime().exec("logcat -v time -b radio");  
  6.             inputstream = process.getInputStream();  
  7.             InputStreamReader inputstreamreader = new InputStreamReader(  
  8.                     inputstream);  
  9.             bufferedreader = new BufferedReader(inputstreamreader);  
  10.     String str = "";  
  11. while ((str = bufferedreader.readLine()) != null) {  
  12.        log.i("mLogcat",str);  
  13. }  
  14. catch (Exception e) {  
  15.               
  16.         }  
 

 

另外,要讓程序能夠讀取系統log需要指定權限,在AndroidManifest.xml文件中加入一下內容.

  1. <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>  
 

 

 

通過上面這段代碼我們就可以將Radiolog輸出到了,這樣我們就可以通過在DDMS中查看這些log,分析其中的通話過程.具體抓到的log就不貼出來了.大家可以自己編寫程序通過上面的代碼來抓取和分析.我只說一下我的分析結果.

通過分析log發現了一些蛛絲馬跡.其中有幾條日志很有用.

GET_CURRENT_CALLS  id=1,DIALING

GET_CURRENT_CALLS  id=1,ALERTING

GET_CURRENT_CALLS  id=1,ACTIVE

由于log較長我只拿了每條log的開頭部分,真實的會多很多內容.當我們撥出電話的時候,會輸入這么幾條log.

撥號->提醒->活動.

 

大致是這么個過程.經過幾次測試發現,電話接通時會進入活動狀態,并會輸出:GET_CURRENT_CALLS  id=1,ACTIVE  這條log,至此我們已經接近成功了.

不過之后我又發現在撥號開始到電話接通這段時間內會經過多次的

撥號->提醒->活動,這樣的狀態變化,僅當話筒中嘟聲響起后GET_CURRENT_CALLS這條日志會鎖定在ALERTING.在電話接通前便不再出現

GET_CURRENT_CALLS日志了.

可能上面的這段表述大家不是很清楚,換句話說在通話接通之前會出現多次的

GET_CURRENT_CALLS ACTIVE 這樣的日志,而僅有一次是電話接通產生的.這就給我們造成了麻煩.不能只是單純的抓取GET_CURRENT_CALLS ACTIVE 這樣的信息來判斷了.

我們只能通過一些邏輯上的判斷來實現了.下面看我的代碼.

  1. class TestThread implements Runnable {  
  2.     //振動器   
  3.     Vibrator mVibrator;  
  4.     //電話服務   
  5.     TelephonyManager telManager;  
  6.     public TestThread(Vibrator mVibrator, TelephonyManager telManager) {  
  7.         this.mVibrator = mVibrator;  
  8.         this.telManager = telManager;  
  9.     }  
  10.     @Override  
  11.     public void run() {  
  12.         //獲取當前話機狀態   
  13.         int callState = telManager.getCallState();  
  14.         Log.i("TestService""開始.........." + Thread.currentThread().getName());  
  15.         //記錄撥號開始時間   
  16.         long threadStart = System.currentTimeMillis();  
  17.         Process process;  
  18.         InputStream inputstream;  
  19.         BufferedReader bufferedreader;  
  20.         try {  
  21.             process = Runtime.getRuntime().exec("logcat -v time -b radio");  
  22.             inputstream = process.getInputStream();  
  23.             InputStreamReader inputstreamreader = new InputStreamReader(  
  24.                     inputstream);  
  25.             bufferedreader = new BufferedReader(inputstreamreader);  
  26.             String str = "";  
  27.             long dialingStart = 0;  
  28.             boolean enableVibrator = false;  
  29.             boolean isAlert = false;  
  30.             while ((str = bufferedreader.readLine()) != null) {  
  31.                 //如果話機狀態從摘機變為空閑,銷毀線程   
  32.                 if (callState == TelephonyManager.CALL_STATE_OFFHOOK  
  33.                         && telManager.getCallState() == TelephonyManager.CALL_STATE_IDLE) {  
  34.                     break;  
  35.                 }  
  36.                 // 線程運行5分鐘自動銷毀   
  37.                 if (System.currentTimeMillis() - threadStart > 300000) {  
  38.                     break;  
  39.                 }  
  40.                 Log.i("TestService", Thread.currentThread().getName() + ":"  
  41.                         + str);  
  42.                 // 記錄GSM狀態DIALING   
  43.                 if (str.contains("GET_CURRENT_CALLS")  
  44.                         && str.contains("DIALING")) {  
  45.                     // 當DIALING開始并且已經經過ALERTING或者首次DIALING   
  46.                     if (!isAlert || dialingStart == 0) {  
  47.                         //記錄DIALING狀態產生時間   
  48.                         dialingStart = System.currentTimeMillis();  
  49.                         isAlert = false;  
  50.                     }  
  51.                     continue;  
  52.                 }  
  53.                 if (str.contains("GET_CURRENT_CALLS")  
  54.                         && str.contains("ALERTING")&&!enableVibrator) {  
  55.                       
  56.                     long temp = System.currentTimeMillis() - dialingStart;  
  57.                     isAlert = true;  
  58.                     //這個是關鍵,當第一次DIALING狀態的時間,與當前的ALERTING間隔時間在1.5秒以上并且在20秒以內的話   
  59.                     //那么認為下次的ACTIVE狀態為通話接通.   
  60.                     if (temp > 1500 && temp < 20000) {  
  61.                         enableVibrator = true;  
  62.                         Log.i("TestService""間隔時間....." + temp + "....."  
  63.                                 + Thread.currentThread().getName());  
  64.                     }  
  65.                     continue;  
  66.                 }  
  67.                 if (str.contains("GET_CURRENT_CALLS") && str.contains("ACTIVE")  
  68.                         && enableVibrator) {  
  69.                     mVibrator.vibrate(100);  
  70.                     enableVibrator = false;  
  71.                     break;  
  72.                 }  
  73.             }  
  74.             Log.i("TestService""結束.........."  
  75.                     + Thread.currentThread().getName());  
  76.         } catch (Exception e) {  
  77.             // TODO: handle exception   
  78.         }  
  79.     }  
  80. }  
 

 

我的這個方法比較牽強,是通過判斷第一次DIALING與每一次ALERTING之間的間隔,當間隔大于1.5秒.那么認為已經進入了"嘟"聲提示的時候了,那么下一個ACTIVE將是電話接通.這個1.5秒是通過分析日志得出的.但是這種方法我始終覺得不太靠譜.如果大家有好的方法可以交流交流.

剩下的就是讓這個線程在電話撥出時觸發,并且常駐在電話中時候準備這就可以了.可以采用Service配合Receiver來實現.Service來實現常駐,Receiver來實現監聽撥出電話.基本就可以完成,我們想要的功能了.

以上代碼我都測試過99%有效,哈哈.這里面提到了一些Android的基礎內容像logcat,Service,Receiver.這些如果大家不了解的話可以到網上搜一下.有很多寫的很不錯的文章介紹Android的基礎內容.我這里就不一一介紹了.

希望我寫的東西對大家有所幫助.OK,就到這里吧.

 

posted on 2012-01-06 09:50 life02 閱讀(734) 評論(0)  編輯 收藏 引用 所屬分類: Android開發
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品国产精品| 亚洲乱码一区二区| 亚洲精品一区久久久久久| 伊伊综合在线| 在线播放精品| 亚洲精品一区二区三区不| 9l国产精品久久久久麻豆| 在线亚洲高清视频| 亚洲欧美另类在线| 久久久久这里只有精品| 欧美~级网站不卡| 亚洲国产高清高潮精品美女| 91久久久国产精品| 亚洲精品日韩在线观看| 亚洲一级二级在线| 久久九九热免费视频| 欧美大片免费久久精品三p| 欧美精品一区二区三区久久久竹菊 | 欧美刺激性大交免费视频 | 亚洲高清视频的网址| 亚洲精品乱码久久久久久| 亚洲视频欧美在线| 久久久久成人网| 亚洲国产婷婷香蕉久久久久久99| 99热这里只有成人精品国产| 欧美亚洲视频在线观看| 欧美激情欧美狂野欧美精品| 国产精品亚发布| 99re热精品| 麻豆freexxxx性91精品| 99一区二区| 久久男人资源视频| 欧美亚洲第一页| 91久久久国产精品| 久久三级视频| 国产精品99久久久久久久vr| 欧美91福利在线观看| 国产一区二区三区久久久久久久久 | 亚洲激情自拍| 欧美一区二区三区婷婷月色| 亚洲精品乱码久久久久久久久| 欧美在线免费视屏| 国产精品v欧美精品v日韩| 亚洲激情电影在线| 久久久一二三| 欧美亚洲免费高清在线观看| 欧美日韩精品欧美日韩精品 | 午夜精品久久久久久久久 | 亚洲一卡二卡三卡四卡五卡| 牛夜精品久久久久久久99黑人 | 正在播放亚洲| 亚洲高清色综合| 久久久久9999亚洲精品| 国产欧美大片| 午夜精品免费在线| 亚洲一区二区三区777| 欧美乱在线观看| 亚洲人成绝费网站色www| 久久夜色精品亚洲噜噜国产mv| 午夜在线一区| 国内精品久久久久影院 日本资源| 午夜精品久久久久久久99樱桃 | 一本色道久久加勒比精品| 男女激情视频一区| 亚洲乱码一区二区| 亚洲黄色免费| 欧美久久久久| 亚洲网站在线看| 99精品久久久| 国产精品久久7| 久久国产福利国产秒拍| 欧美伊人久久久久久久久影院| 国产一区二区欧美| 久久综合精品一区| 美日韩在线观看| 一本色道久久综合狠狠躁的推荐| 日韩一二在线观看| 国产目拍亚洲精品99久久精品 | 亚洲日本中文| 日韩亚洲在线| 国产在线不卡视频| 欧美激情在线| 国产精品久久国产精麻豆99网站| 午夜精品av| 麻豆国产va免费精品高清在线| 亚洲精品综合精品自拍| 亚洲视频一二| 黄色成人精品网站| 亚洲精品你懂的| 国产精品jvid在线观看蜜臀| 亚洲二区视频在线| 99视频在线观看一区三区| 亚洲午夜女主播在线直播| 中文精品一区二区三区| 99re这里只有精品6| 99国内精品| 精品成人一区二区三区| 亚洲狼人综合| 伊人婷婷久久| 亚洲无玛一区| 亚洲日本欧美天堂| 亚洲专区一区二区三区| 亚洲欧洲综合另类在线| 亚洲欧美www| 一区二区三区日韩在线观看| 久久精品综合网| 亚洲欧美文学| 欧美日韩在线免费观看| 欧美不卡在线视频| 国产精品视频一二三| 亚洲精品日本| 亚洲日韩成人| 久久久久久国产精品mv| 亚洲欧美日韩精品在线| 欧美精品一区二区视频| 久久一区二区精品| 国产欧美va欧美va香蕉在| 999在线观看精品免费不卡网站| 激情欧美丁香| 亚洲欧美日韩在线播放| 亚洲一卡久久| 欧美日韩影院| 日韩视频一区二区三区| 亚洲国产免费| 久久蜜桃资源一区二区老牛| 欧美资源在线观看| 国产精品久久久免费| 欧美激情亚洲精品| 经典三级久久| 久久久久久久欧美精品| 久久五月天婷婷| 国产亚洲欧美一级| 亚洲欧美日韩在线高清直播| 欧美亚洲视频在线看网址| 国产精品久久久久久久久久尿| 亚洲精品乱码久久久久久按摩观| 亚洲高清网站| 欧美福利在线| 999亚洲国产精| 亚洲欧美日韩综合| 国产精品腿扒开做爽爽爽挤奶网站| 中日韩高清电影网| 亚洲欧美999| 国产精品国内视频| 亚洲欧美一区二区激情| 欧美在线黄色| 在线看日韩av| 欧美国产三区| 亚洲视频在线观看| 久久超碰97中文字幕| 黄色成人在线网址| 牛牛国产精品| 亚洲视频在线一区| 欧美专区第一页| 亚洲福利国产精品| 欧美日韩国产综合视频在线观看 | 亚洲欧美一区二区激情| 午夜精品亚洲| 久久久久久久久久看片| 亚洲美女淫视频| 欧美精品成人一区二区在线观看| 亚洲精品视频免费观看| 亚洲一区国产| 国产综合色产在线精品| 欧美黄色aaaa| 亚洲欧美日韩区| 欧美激情中文字幕在线| 亚洲综合日韩| 1769国产精品| 国产精品蜜臀在线观看| 久久资源在线| 亚洲视频一区二区在线观看| 久久亚洲私人国产精品va| 亚洲精品视频在线观看免费| 国产精品日韩一区| 蜜臀av在线播放一区二区三区| 国产精品99久久99久久久二8| 久久综合狠狠综合久久综合88| 一区二区欧美亚洲| 激情综合网激情| 国产精品成人一区二区| 麻豆精品91| 欧美一区二区三区免费视| 欧美激情中文字幕在线| 久久成人精品| 亚洲自拍高清| 亚洲免费激情| 亚洲国产精品久久久久婷婷884| 国产精品影视天天线| 欧美日韩国产区一| 欧美成人国产一区二区| 久久九九热re6这里有精品| 亚洲在线播放| 亚洲午夜成aⅴ人片| 亚洲国产视频a| 母乳一区在线观看| 久久手机免费观看| 久久成人精品无人区| 性视频1819p久久| 亚洲一区在线播放|