最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android編程中黑名單的實(shí)現(xiàn)方法

 更新時(shí)間:2016年02月19日 11:16:27   作者:lg878398509  
這篇文章主要介紹了Android編程中黑名單的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Android通過對(duì)比通信錄及自動(dòng)掛斷電話等技巧實(shí)現(xiàn)黑名單功能的功能,需要的朋友可以參考下

本文實(shí)例講述了Android編程中黑名單的實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

說明:由于掛斷電話android   api不是對(duì)外開放的,所以需要使用反射的方法得到撥打電話的服務(wù)。

1.將android源代碼中的"aidl"文件拷貝到項(xiàng)目中

這樣項(xiàng)目中會(huì)生成兩個(gè)包:android.telephony;此包中文件為:NeighboringCellInfo.aidl

com.android.internal.telephony;此包中文件為:ITelephony.aidl

2.通過反射掛斷電話;代碼如下:

/**
* 掛斷電話
*/
public void endCall() {
    try {
      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();
    } catch (Exception e) {
      e.printStackTrace();
    }
}

3.刪除通話記錄中的記錄

/**
* 刪除呼叫記錄
*/
public void deleteCallLog(String incomingNumber) {
    ContentResolver resolver = getContentResolver();
    Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, null,"number=?", new String[]{incomingNumber}, null);
    if(cursor.moveToNext()){
      String id = cursor.getString(cursor.getColumnIndex("_id"));
      resolver.delete(CallLog.Calls.CONTENT_URI, "_id=?", new String[]{id});
    }
}

4.直接這樣調(diào)用是不能刪除電話記錄的,因?yàn)樯呻娫捰涗浀倪^程是一個(gè)異步的過程,在掛斷電話之后不能立即刪除電話記錄,所以這里要使用ContentObserver(內(nèi)容觀察者)

private class MyObserver extends ContentObserver{
    private String incomingNumber;
    public MyObserver(Handler handler,String incomingNumber) {
      super(handler);
      this.incomingNumber = incomingNumber;
    }
    @Override
    public void onChange(boolean selfChange) {
      super.onChange(selfChange);
      deleteCallLog(incomingNumber);
      getContentResolver().unregisterContentObserver(this);
    }
}

6.最后把整個(gè)service代碼貼到下面

public class AddressService extends Service{
  private static final String TAG = "AddressService";
  private TelephonyManager manager;
  private MyPhoneListener listener;
  private WindowManager wManager;
  private View view;
  private SharedPreferences sp;
  long startTime = 0;
  long endTime = 0;
  private BlackNumberDao dao;
  @Override
  public IBinder onBind(Intent arg0) {
    return null;
  }
  /**
   * 服務(wù)第一次被創(chuàng)建的時(shí)候調(diào)用的方法
   * 服務(wù)被初始化時(shí)調(diào)用的方法
   */
  @Override
  public void onCreate() {
    super.onCreate();
    listener = new MyPhoneListener();
    manager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    wManager = (WindowManager) this.getSystemService(WINDOW_SERVICE);
    manager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
    sp = getSharedPreferences("config", MODE_PRIVATE);
    dao = new BlackNumberDao(this);
//   if(3000>(endTime - startTime)){
//     String ns = Context.NOTIFICATION_SERVICE;
//     NotificationManager mNotificationManager = (NotificationManager) getSystemService(ns);
//     //定義通知欄展現(xiàn)的內(nèi)容信息
//     int icon = R.drawable.icon5;
//     CharSequence tickerText = "我的通知欄標(biāo)題";
//     long when = System.currentTimeMillis();
//     Notification notification = new Notification(icon, tickerText, when);
//     //定義下拉通知欄時(shí)要展現(xiàn)的內(nèi)容信息
//     Context context = getApplicationContext();
//     CharSequence contentTitle = "我的通知欄標(biāo)展開標(biāo)題";
//     CharSequence contentText = "我的通知欄展開詳細(xì)內(nèi)容";
//     Intent notificationIntent = new Intent(AddressService.this,BootStartDemo.class);
//     PendingIntent contentIntent = PendingIntent.getActivity(AddressService.this, 0,notificationIntent, 0);
//     notification.setLatestEventInfo(context, contentTitle, contentText,contentIntent);
//     //用mNotificationManager的notify方法通知用戶生成標(biāo)題欄消息通知
//     mNotificationManager.notify(1, notification);
//   }
  }
  /**
   * 服務(wù)停止的時(shí)候調(diào)用
   */
  @Override
  public void onDestroy() {
    super.onDestroy();
    manager.listen(listener, PhoneStateListener.LISTEN_NONE);
    listener = null;
  }
  private class MyPhoneListener extends PhoneStateListener{
    /**
     * 電話狀態(tài)發(fā)生改變的時(shí)候調(diào)用的方法
     */
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
      super.onCallStateChanged(state, incomingNumber);
      switch (state) {
      case TelephonyManager.CALL_STATE_IDLE:
        if(null != view){
          wManager.removeView(view);
          view = null;
        }
        endTime = System.currentTimeMillis();
        break;
      case TelephonyManager.CALL_STATE_RINGING: // 零響狀態(tài)
        //判斷number是否在黑名單中
        if(dao.find(incomingNumber)){
          //掛斷電話
          endCall();
          //刪除呼叫記錄
//         deleteCallLog(incomingNumber);
          ContentResolver resolver = getContentResolver();
          resolver.registerContentObserver(CallLog.Calls.CONTENT_URI, true, new MyObserver(new Handler(),incomingNumber));
        }
        Log.i(TAG,"來電號(hào)碼為"+ incomingNumber);
        String address = NumberAddressService.getAddress(incomingNumber);
        Log.i(TAG,"歸屬地為"+ address);
        showLocation(address);
        //獲取當(dāng)前系統(tǒng)的時(shí)間
        startTime = System.currentTimeMillis();
        break;
      case TelephonyManager.CALL_STATE_OFFHOOK: //接通電話狀態(tài)
        break;
      }
    }
  }
  /**
   * 在窗體上顯示出來位置信息
   * @param address
   */
  public void showLocation(String address) {
    WindowManager.LayoutParams params = new WindowManager.LayoutParams();
    params.height = WindowManager.LayoutParams.WRAP_CONTENT;
    params.width = WindowManager.LayoutParams.WRAP_CONTENT;
    params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
    params.format = PixelFormat.TRANSLUCENT;
    params.type = WindowManager.LayoutParams.TYPE_TOAST;
    params.setTitle("Toast");
    params.gravity = Gravity.LEFT | Gravity.TOP;
    int x = sp.getInt("lastx", 0);
    int y = sp.getInt("lasty", 0);
    params.x = x;
    params.y = y;
    view = View.inflate(getApplicationContext(), R.layout.show_location, null);
    LinearLayout ll_location = (LinearLayout) view.findViewById(R.id.ll_location);
    TextView tv_location = (TextView) view.findViewById(R.id.tv_location);
    int background = sp.getInt("background", 0);
    if(0 == background){
      ll_location.setBackgroundResource(R.drawable.call_locate_gray);
    }else if(1 == background){
      ll_location.setBackgroundResource(R.drawable.call_locate_orange);
    }else {
      ll_location.setBackgroundResource(R.drawable.call_locate_green);
    }
    tv_location.setText(address);
    tv_location.setTextSize(24);
    wManager.addView(view, params);
  }
  /**
   * 刪除呼叫記錄
   */
  public void deleteCallLog(String incomingNumber) {
    ContentResolver resolver = getContentResolver();
    Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, null,"number=?", new String[]{incomingNumber}, null);
    if(cursor.moveToNext()){
      String id = cursor.getString(cursor.getColumnIndex("_id"));
      resolver.delete(CallLog.Calls.CONTENT_URI, "_id=?", new String[]{id});
    }
  }
  /**
   * 掛斷電話
   */
  public void endCall() {
    try {
      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();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
  private class MyObserver extends ContentObserver{
    private String incomingNumber;
    public MyObserver(Handler handler,String incomingNumber) {
      super(handler);
      this.incomingNumber = incomingNumber;
    }
    @Override
    public void onChange(boolean selfChange) {
      super.onChange(selfChange);
      deleteCallLog(incomingNumber);
      getContentResolver().unregisterContentObserver(this);
    }
  }
}

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進(jìn)階教程》、《Android通信方式總結(jié)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 微信網(wǎng)頁 第三方登錄原理詳解

    微信網(wǎng)頁 第三方登錄原理詳解

    本文主要介紹微信網(wǎng)頁 第三方登錄原理,這里整理了詳細(xì)的資料及接口說明和參數(shù)說明,有需要的小伙伴可以參考下
    2016-09-09
  • Android實(shí)現(xiàn)雙層ViewPager嵌套

    Android實(shí)現(xiàn)雙層ViewPager嵌套

    這篇文章主要介紹了Android實(shí)現(xiàn)雙層ViewPager嵌套,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • Android 快速使用正則表達(dá)式,校驗(yàn)身份證號(hào)的實(shí)例

    Android 快速使用正則表達(dá)式,校驗(yàn)身份證號(hào)的實(shí)例

    下面小編就為大家分享一篇Android 快速使用正則表達(dá)式,校驗(yàn)身份證號(hào)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • android 仿微信demo——微信啟動(dòng)界面實(shí)現(xiàn)

    android 仿微信demo——微信啟動(dòng)界面實(shí)現(xiàn)

    本篇文章主要介紹了微信小程序-閱讀小程序?qū)嵗╠emo),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望能給你們提供幫助
    2021-06-06
  • 詳解Android中Intent的使用方法

    詳解Android中Intent的使用方法

    這篇文章主要介紹了Android中Intent的使用方法,Android中的Intent是一個(gè)非常重要且常用的類,需要認(rèn)真學(xué)習(xí),感興趣的小伙伴們可以參考一下
    2015-12-12
  • Android 藍(lán)牙開發(fā)實(shí)例解析

    Android 藍(lán)牙開發(fā)實(shí)例解析

    本文主要介紹Android 藍(lán)牙開發(fā),這里提供實(shí)例代碼和詳細(xì)解析實(shí)現(xiàn)方法,對(duì)開發(fā)Android藍(lán)牙開發(fā)的朋友提供簡單示例,有需要的朋友可以參考下
    2016-08-08
  • Android自定義可循環(huán)的滾動(dòng)選擇器CycleWheelView

    Android自定義可循環(huán)的滾動(dòng)選擇器CycleWheelView

    Android自定義可循環(huán)的滾動(dòng)選擇器CycleWheelView替代TimePicker/NumberPicker/WheelView,很實(shí)用的一篇文章分享給大家,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Kotlin中的反射機(jī)制深入講解

    Kotlin中的反射機(jī)制深入講解

    反射,簡單來說,是一種在運(yùn)行時(shí)動(dòng)態(tài)地訪問對(duì)象屬性和方法的方式,而不需要事先確定這些屬性是什么。下面這篇文章主要給大家介紹了關(guān)于Kotlin中反射機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2018-11-11
  • Android Binder入門學(xué)習(xí)筆記

    Android Binder入門學(xué)習(xí)筆記

    這篇文章主要給大家介紹了關(guān)于Android Binder入門學(xué)習(xí)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Android中如何安全地打印日志詳解

    Android中如何安全地打印日志詳解

    日志是我們?cè)谌粘i_發(fā)中必不可少的一部分,下面這篇文章主要給大家介紹了關(guān)于Android中如何安全地打印日志的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們一起來看看吧。
    2017-12-12

最新評(píng)論

洞口县| 翁牛特旗| 平泉县| 博客| 都安| 富蕴县| 定远县| 万山特区| 太和县| 永嘉县| 高青县| 南召县| 海丰县| 驻马店市| 关岭| 姜堰市| 伊春市| 河西区| 本溪| 若羌县| 洛隆县| 三江| 随州市| 内丘县| 虹口区| 贞丰县| 赣榆县| 宝兴县| 大庆市| 丁青县| 静宁县| 河北区| 萝北县| 孟州市| 工布江达县| 囊谦县| 临猗县| 石城县| 广昌县| 芜湖市| 南靖县|