閱讀542 返回首頁    go 阿裏雲 go 技術社區[雲棲]


手機衛士14-顯示來電歸屬地





好啦,我們今天就要把號碼歸屬地顯示在有電話打進來的時候,其實也很簡單的啦,我們隻要開一個服務,監聽電話的廣播,然後在電話相應的狀態,進行相應的操作就可以的啦

至於怎樣把那個view顯示到接聽電話那個界麵上,這個更簡單啦,那個Toast是怎樣顯示的,我們就怎樣顯示就可以了。

我們打開Toast的源碼,可以發現在一個靜態的內部類TN裏麵,有這樣一段代碼

其實這一段就是設置好我們的Toast而已的代碼啦,我們可以參照著來寫一下

好啦,我們就要修改上一次寫的AddressService這個類啦,

  1. package com.xiaobin.security.service;

  2. import android.app.Service;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.graphics.PixelFormat;
  6. import android.os.IBinder;
  7. import android.telephony.PhoneStateListener;
  8. import android.telephony.TelephonyManager;
  9. import android.view.WindowManager;
  10. import android.widget.TextView;

  11. import com.xiaobin.security.engine.NumberAddressService;

  12. public class AddressService extends Service
  13. {
  14.         private TelephonyManager telephonyManager;
  15.         private MyPhoneListener listener;
  16.         private WindowManager windowManager;
  17.         private TextView tv;

  18.         @Override
  19.         public IBinder onBind(Intent intent)
  20.         {
  21.                 return null;
  22.         }
  23.         
  24.         @Override
  25.         public void onCreate()
  26.         {
  27.                 super.onCreate();
  28.                 
  29.                 windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
  30.                 listener = new MyPhoneListener();
  31.                 telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
  32.                 telephonyManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
  33.         }
  34.         
  35.         @Override
  36.         public void onDestroy()
  37.         {
  38.                 super.onDestroy();
  39.                 //停止監聽
  40.                 telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE);
  41.         }
  42.         
  43.         //顯示歸屬地的窗體
  44.         private void showLocation(String address)
  45.         {
  46.                 WindowManager.LayoutParams params = new WindowManager.LayoutParams();
  47.                 params.width = WindowManager.LayoutParams.WRAP_CONTENT;
  48.                 params.height = WindowManager.LayoutParams.WRAP_CONTENT;
  49.                 params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE //無法獲取焦點
  50.                                 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE //無法點擊
  51.                                 | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;//保持屏幕亮
  52.                 params.format = PixelFormat.TRANSLUCENT;//設置成半透明的
  53.                 params.type = WindowManager.LayoutParams.TYPE_TOAST;
  54.                 params.setTitle("Toast");
  55.                 
  56.                 tv = new TextView(AddressService.this);
  57.                 tv.setText("歸屬地: " + address);
  58.                 windowManager.addView(tv, params);
  59.         }
  60.         
  61.         //========================================================================
  62.         
  63.         private class MyPhoneListener extends PhoneStateListener
  64.         {
  65.                 @Override
  66.                 public void onCallStateChanged(int state, String incomingNumber)
  67.                 {
  68.                         super.onCallStateChanged(state, incomingNumber);
  69.                         
  70.                         switch(state)
  71.                         {
  72.                                 case TelephonyManager.CALL_STATE_IDLE : //空閑狀態
  73.                                         if(tv != null)
  74.                                         {
  75.                                                 windowManager.removeView(tv);//移除顯示歸屬地的那個view
  76.                                                 tv = null;
  77.                                         }
  78.                                         break;
  79.                                         
  80.                                 case TelephonyManager.CALL_STATE_OFFHOOK : //接通電話
  81.                                         if(tv != null)
  82.                                         {
  83.                                                 windowManager.removeView(tv);//移除顯示歸屬地的那個view
  84.                                                 tv = null;
  85.                                         }
  86.                                         break;
  87.                                         
  88.                                 case TelephonyManager.CALL_STATE_RINGING : //鈴響狀態
  89.                                         String address = NumberAddressService.getAddress(incomingNumber);
  90.                                         showLocation(address);
  91.                                         break;
  92.                                         
  93.                                 default : 
  94.                                         break;
  95.                         }
  96.                 }
  97.         }

  98. }
複製代碼
就這樣,我們的app就會在有電話進來的時候,把電話的歸屬地顯示出來的啦但是記得在測試的時候,記得把我們上一次寫的那個開啟服務的CheckBox勾上,不然就不會顯示出來的啦 好啦,今天的代碼比較簡單,就到這裏,下一次,我們就美化一下這個顯示框,加入風格的選擇  Security_14接電話時顯示電話歸屬地.rar (1.46 MB, 下載次數: 143)

最後更新:2017-04-03 12:53:35

  上一篇:go android的RadioGroup講解
  下一篇:go Swift學習之一:常量與變量