Android監(jiān)聽系統(tǒng)來電并彈出提示窗口
1.問題
項(xiàng)目中有自己企業(yè)的通訊錄,但是在應(yīng)用中撥打公司通訊錄的聯(lián)系人,由于手機(jī)通訊錄中沒有相應(yīng)的信息,只顯示一串電話號(hào)
2 .目的
監(jiān)聽系統(tǒng)來電,獲取到電話號(hào)碼,通過調(diào)用接口,查詢出來相應(yīng)電話號(hào)碼的詳細(xì)信息,并彈出系統(tǒng)懸浮框,給用戶提示。
3.實(shí)現(xiàn)
首先 注冊(cè)廣播監(jiān)聽系統(tǒng)來電。監(jiān)聽系統(tǒng)來電需要、注冊(cè)相應(yīng)的權(quán)限
代碼地址:https://github.com/sdsjk/phone_alert.git
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
自定義廣播去監(jiān)聽系統(tǒng)來電
public class PhoneReceiver extends BroadcastReceiver { private Context mcontext; @Override public void onReceive(Context context, Intent intent){ mcontext=context; System.out.println("action"+intent.getAction()); if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){ //如果是去電(撥出) Log.e("TAG","撥出"); }else{ Log.e("TAG","來電"); TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); //設(shè)置一個(gè)監(jiān)聽器 } } private PhoneStateListener listener=new PhoneStateListener(){ @Override public void onCallStateChanged(int state, final String incomingNumber) { // TODO Auto-generated method stub //state 當(dāng)前狀態(tài) incomingNumber,貌似沒有去電的API super.onCallStateChanged(state, incomingNumber); switch(state){ case TelephonyManager.CALL_STATE_IDLE: Log.e("TAG","掛斷"); break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.e("TAG","接聽"); break; case TelephonyManager.CALL_STATE_RINGING: //輸出來電號(hào)碼 Log.e("TAG","響鈴:來電號(hào)碼"+incomingNumber); Log.e("TAG","響鈴:======"+Thread.currentThread().getName()); break; } } }; };
需要靜態(tài)注冊(cè)廣播
<receiver android:name="com.cloud.adapter.myview.PhoneReceiver"> <intent-filter> <action android:name="android.intent.action.PHONE_STATE"/> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> </intent-filter> </receiver>
其次在注冊(cè)完,廣播之后我們需要在監(jiān)聽到系統(tǒng)的來電之后,后獲取到電話號(hào)之后去請(qǐng)求接口,獲取數(shù)據(jù)。并彈出系統(tǒng)懸浮框。
注意:在彈出系統(tǒng)懸浮框的時(shí)候需要注冊(cè)權(quán)限,并且檢查應(yīng)用的允許彈出懸浮框權(quán)限是否開啟。
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
在監(jiān)聽中的 TelephonyManager.CALL_STATE_RINGING中操作
inflate= LayoutInflater.from(mcontext); wm = (WindowManager)mcontext.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = WindowManager.LayoutParams.TYPE_PHONE; params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.gravity= Gravity.CENTER; params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = 600; params.format = PixelFormat.RGBA_8888; phoneView=inflate.inflate(R.layout.phone_alert,null); wm.addView(phoneView, params);
自定義一個(gè)布局文件,作為要添加的View,布局文件如下
<?xml version="1.0" encoding="utf-8"?> <com.cloud.adapter.myview.MyLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="300dp" android:layout_height="200dp" android:orientation="vertical" android:layout_gravity="center" android:id="@+id/rootview" > <LinearLayout android:background="@drawable/top_background" android:layout_width="300dp" android:layout_height="100dp" android:orientation="vertical" android:layout_gravity="center" android:gravity="center" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="陸XX" android:textSize="26sp" /> <TextView android:layout_marginTop="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:text="系統(tǒng)運(yùn)行科科長" /> </LinearLayout> <LinearLayout android:background="@drawable/bottom_background" android:layout_width="300dp" android:layout_height="100dp" android:orientation="vertical" android:layout_gravity="center" android:gravity="center" > <TextView android:textColor="#fff" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="公司本部-信息中心-系統(tǒng)運(yùn)營科" android:textSize="20sp" /> <TextView android:layout_marginTop="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textColor="#fff" android:text="XXX有限公司" android:layout_marginBottom="10dp" /> </LinearLayout> </com.cloud.adapter.myview.MyLinearLayout>
使用到兩個(gè)背景shape
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:topLeftRadius="20dp" android:topRightRadius="20dp" /> <solid android:color="@color/colorPrimary"/> </shape> <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <corners android:bottomLeftRadius="20dp" android:bottomRightRadius="20dp" /> <solid android:color="#f44"/> </shape>
廣播中完整代碼
package com.cloud.adapter.myview; import android.app.Activity; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.graphics.PixelFormat; import android.os.Handler; import android.os.Looper; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.WindowManager; import android.widget.TextView; /** * Created by zhang on 2017/10/10. */ public class PhoneReceiver extends BroadcastReceiver { private Context mcontext; private WindowManager wm; @Override public void onReceive(Context context, Intent intent){ mcontext=context; System.out.println("action"+intent.getAction()); if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){ //如果是去電(撥出) Log.e("TAG","撥出"); }else{ //查了下android文檔,貌似沒有專門用于接收來電的action,所以,非去電即來電 Log.e("TAG","來電"); TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); //設(shè)置一個(gè)監(jiān)聽器 } } private TextView tv; private LayoutInflater inflate; private View phoneView; private PhoneStateListener listener=new PhoneStateListener(){ @Override public void onCallStateChanged(int state, final String incomingNumber) { // TODO Auto-generated method stub //state 當(dāng)前狀態(tài) incomingNumber,貌似沒有去電的API super.onCallStateChanged(state, incomingNumber); switch(state){ case TelephonyManager.CALL_STATE_IDLE: Log.e("TAG","掛斷"); wm.removeView(tv); break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.e("TAG","接聽"); wm.removeView(tv); break; case TelephonyManager.CALL_STATE_RINGING: inflate= LayoutInflater.from(mcontext); wm = (WindowManager)mcontext.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.type = WindowManager.LayoutParams.TYPE_PHONE; params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; params.gravity= Gravity.CENTER; params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = 600; params.format = PixelFormat.RGBA_8888; phoneView=inflate.inflate(R.layout.phone_alert,null); wm.addView(phoneView, params); Log.e("TAG","響鈴:來電號(hào)碼"+incomingNumber); Log.e("TAG","響鈴:======"+Thread.currentThread().getName()); //輸出來電號(hào)碼 break; } } }; };
效果圖
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android Java調(diào)用自己C++類庫的實(shí)例講解
今天小編就為大家分享一篇關(guān)于Android Java調(diào)用自己C++類庫的實(shí)例講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02Android邊框裁切的正確姿勢實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Android邊框裁切的正確姿勢實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02android 加載本地聯(lián)系人實(shí)現(xiàn)方法
在android開發(fā)過程中,有些功能需要訪問本地聯(lián)系人列表,本人搜集整理了一番,拿出來和大家分享一下,希望可以幫助你們2012-12-12Android studio無法創(chuàng)建類和接口和提示問題的完美解決辦法
這篇文章主要介紹了Android studio無法創(chuàng)建類和接口和提示問題解決辦法,內(nèi)容比較簡單,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04Android?Studio打包?aar實(shí)現(xiàn)步驟示例詳解
這篇文章主要為大家介紹了Android?Studio打包aar步驟示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Android studio升級(jí)4.1時(shí)遇到的問題記錄
這篇文章主要介紹了Android studio升級(jí)4.1時(shí)遇到的問題記錄,本文給大家介紹的非常詳細(xì),在大家的平時(shí)開發(fā)過程都是經(jīng)常遇到的問題,需要的朋友可以參考下2020-10-10EditText實(shí)現(xiàn)輸入限制和校驗(yàn)功能實(shí)例代碼
本文通過實(shí)例代碼給大家介紹EditText實(shí)現(xiàn)輸入限制和校驗(yàn)功能,感興趣的朋友參考下吧2017-08-08AndroidStudio kotlin配置詳細(xì)介紹
這篇文章主要介紹了AndroidStudio kotlin配置詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-05-05android上的一個(gè)網(wǎng)絡(luò)接口和圖片緩存框架enif簡析
android上的一個(gè)網(wǎng)絡(luò)接口和圖片緩存框架enif詳細(xì)介紹:底層網(wǎng)絡(luò)接口采用apache的httpclient連接池框架、圖片緩存采用基于LRU的算法等等,需要了解的朋友可以詳細(xì)參考下2012-12-12Android StickListView實(shí)現(xiàn)懸停效果
這篇文章主要介紹了Android StickListView實(shí)現(xiàn)懸停效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06