Android監(jiān)聽系統(tǒng)來電并彈出提示窗口
1.問題
項(xiàng)目中有自己企業(yè)的通訊錄,但是在應(yīng)用中撥打公司通訊錄的聯(lián)系人,由于手機(jī)通訊錄中沒有相應(yīng)的信息,只顯示一串電話號
2 .目的
監(jiān)聽系統(tǒng)來電,獲取到電話號碼,通過調(diào)用接口,查詢出來相應(yīng)電話號碼的詳細(xì)信息,并彈出系統(tǒng)懸浮框,給用戶提示。
3.實(shí)現(xiàn)
首先 注冊廣播監(jiān)聽系統(tǒng)來電。監(jiān)聽系統(tǒng)來電需要、注冊相應(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:
//輸出來電號碼
Log.e("TAG","響鈴:來電號碼"+incomingNumber);
Log.e("TAG","響鈴:======"+Thread.currentThread().getName());
break;
}
}
};
};
需要靜態(tài)注冊廣播
<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>
其次在注冊完,廣播之后我們需要在監(jiān)聽到系統(tǒng)的來電之后,后獲取到電話號之后去請求接口,獲取數(shù)據(jù)。并彈出系統(tǒng)懸浮框。
注意:在彈出系統(tǒng)懸浮框的時(shí)候需要注冊權(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","響鈴:來電號碼"+incomingNumber);
Log.e("TAG","響鈴:======"+Thread.currentThread().getName());
//輸出來電號碼
break;
}
}
};
};
效果圖

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android仿XListView支持下拉刷新和上劃加載更多的自定義RecyclerView
這篇文章主要介紹了仿XListView支持下拉刷新和上劃加載更多的自定義RecyclerView的實(shí)例代碼,非常不錯,具有參考價(jià)值,感興趣的朋友可以參考下2016-05-05
Android中AsyncTask異步任務(wù)使用詳細(xì)實(shí)例(一)
AsyncTask是Android提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實(shí)現(xiàn)異步操作,并提供接口反饋當(dāng)前異步執(zhí)行的程度(可以通過接口實(shí)現(xiàn)UI進(jìn)度更新),最后反饋執(zhí)行的結(jié)果給UI主線程,通過本文給大家介紹Android中AsyncTask異步任務(wù)使用詳細(xì)實(shí)例(一),需要的朋友參考下2016-02-02
Android程序開發(fā)之手機(jī)APP創(chuàng)建桌面快捷方式
這篇文章主要介紹了Android程序開發(fā)之手機(jī)APP創(chuàng)建桌面快捷方式 的相關(guān)資料,需要的朋友可以參考下2016-04-04
Android 自定義view實(shí)現(xiàn)TopBar效果
這篇文章主要為大家詳細(xì)介紹了Android 自定義view實(shí)現(xiàn)TopBar效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Android下通過httpClient發(fā)送GET和POST請求的實(shí)例代碼
這篇文章介紹了Android下通過httpClient發(fā)送GET和POST請求的實(shí)例代碼,有需要的朋友可以參考一下2013-08-08

