Android 来电归属地显示功能demo
2015-11-06 00:00
197 查看
需求:打进电话,用Toast显示来电归属地(注:说明系统的拨号不能改)
第一步:创建后台监听来电服务AddressService 并在功能清单文件注册;
所需权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
AddressService 代码如下:
第二步:在AddressService 服务里面注册来电状态(TelephoneManager)
3、自定义监听类MyPhoneStateListener
private class MyListenerPhone extends PhoneStateListener {
@Override
* 当呼叫状态发生改变的时候回调该方法
public void onCallStateChanged(int state, String incomingNumber) {
// state:状态,incomingNumber:来电号码
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:// 来电铃声响起
// 查询数据库的操作
String address = NumberAddressQueryUtils
.queryNumber(incomingNumber);
Toast.makeText(getApplicationContext(), address, Toast.LENGTH_LONG).show();
// myToast(address);
break;
case TelephonyManager.CALL_STATE_IDLE://电话的空闲状态:挂电话、来电拒绝
break;
default:
break;
}
}
}
AddressDao.getAddress(incomingNumber);
在onDestroy()被调用时取消监听:
4、在SettingActivity设置中心里配置设置,当点击开启的时候就启动服务,否则相反。然后演示;
布局文件:
<com.itheima.mobilesafe.ui.SettingItemView
android:id="@+id/siv_show_address"
itheima:title="设置号码归属地显示"
itheima:desc_on="号码归属地显示已经打开"
itheima:desc_off="号码归属地显示已经关闭"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
SettingActivity里的代码:
//设置号码归属地显示
siv_show_address = (SettingItemView) findViewById(R.id.siv_show_address);
showAddressIntent = new Intent(this, AddressService.class);
siv_show_address.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(siv_show_address.isCheck()){
siv_show_address.setCheck(false);
stopService(showAddressIntent);
//sp共享偏好去保存
}else{
startService(showAddressIntent);
siv_show_address.setCheck(true);
}
}
});
5、创建一个类ServiceStatusUtils 里面的方法isServiceRunning()校验检查一个服务是否开启;
/**
* 检验一个服务是否还运行,系统所有的
*/
public static boolean isServiceRunning(Context context,String serviceName){
ActivityManager am= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> infos = am.getRunningServices(100);
for(RunningServiceInfo info : infos){
String className = info.service.getClassName();
if(className.equals(serviceName)){
return true;
}
}
return false;
}
第一步:创建后台监听来电服务AddressService 并在功能清单文件注册;
所需权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
AddressService 代码如下:
package com.zaizai.safty.service; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.PixelFormat; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.view.View; import android.view.WindowManager; import android.widget.TextView; import android.widget.Toast; import com.zaizai.safty.R; import com.zaizai.safty.db.dao.NumberAddressQueryUtils; public class AddressService extends Service { /** * 电话 */ private TelephonyManager telephonyManager; private MyListenerPhone myListenerPhone; private class MyListenerPhone extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber) { // state:状态,incomingNumber:来电号码 super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_RINGING:// 来电铃声响起 // 查询数据库的操作 String address = NumberAddressQueryUtils .queryNumber(incomingNumber); Toast.makeText(getApplicationContext(), address, Toast.LENGTH_LONG).show(); // myToast(address); break; case TelephonyManager.CALL_STATE_IDLE://电话的空闲状态:挂电话、来电拒绝 7fe0 break; default: break; } } } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); //电话服务 telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); // 监听来电 myListenerPhone = new MyListenerPhone(); //注册服务去监听电话 telephonyManager.listen(myListenerPhone, PhoneStateListener.LISTEN_CALL_STATE); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); // 取消监听来电 telephonyManager.listen(myListenerPhone, PhoneStateListener.LISTEN_NONE); myListenerPhone = null; } }
第二步:在AddressService 服务里面注册来电状态(TelephoneManager)
//电话服务 telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); // 监听来电 myListenerPhone = new MyListenerPhone(); //注册服务去监听电话 telephonyManager.listen(myListenerPhone, PhoneStateListener.LISTEN_CALL_STATE);
3、自定义监听类MyPhoneStateListener
private class MyListenerPhone extends PhoneStateListener {
@Override
* 当呼叫状态发生改变的时候回调该方法
public void onCallStateChanged(int state, String incomingNumber) {
// state:状态,incomingNumber:来电号码
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:// 来电铃声响起
// 查询数据库的操作
String address = NumberAddressQueryUtils
.queryNumber(incomingNumber);
Toast.makeText(getApplicationContext(), address, Toast.LENGTH_LONG).show();
// myToast(address);
break;
case TelephonyManager.CALL_STATE_IDLE://电话的空闲状态:挂电话、来电拒绝
break;
default:
break;
}
}
}
AddressDao.getAddress(incomingNumber);
在onDestroy()被调用时取消监听:
@Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); // 取消监听来电 telephonyManager.listen(myListenerPhone, PhoneStateListener.LISTEN_NONE); myListenerPhone = null;
4、在SettingActivity设置中心里配置设置,当点击开启的时候就启动服务,否则相反。然后演示;
布局文件:
<com.itheima.mobilesafe.ui.SettingItemView
android:id="@+id/siv_show_address"
itheima:title="设置号码归属地显示"
itheima:desc_on="号码归属地显示已经打开"
itheima:desc_off="号码归属地显示已经关闭"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
SettingActivity里的代码:
//设置号码归属地显示
siv_show_address = (SettingItemView) findViewById(R.id.siv_show_address);
showAddressIntent = new Intent(this, AddressService.class);
siv_show_address.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(siv_show_address.isCheck()){
siv_show_address.setCheck(false);
stopService(showAddressIntent);
//sp共享偏好去保存
}else{
startService(showAddressIntent);
siv_show_address.setCheck(true);
}
}
});
5、创建一个类ServiceStatusUtils 里面的方法isServiceRunning()校验检查一个服务是否开启;
/**
* 检验一个服务是否还运行,系统所有的
*/
public static boolean isServiceRunning(Context context,String serviceName){
ActivityManager am= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningServiceInfo> infos = am.getRunningServices(100);
for(RunningServiceInfo info : infos){
String className = info.service.getClassName();
if(className.equals(serviceName)){
return true;
}
}
return false;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析