Android 来电归属地显示功能demo

需求:打进电话,用Toast显示来电归属地(注:说明系统的拨号不能改)

第一步:创建后台监听来电服务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://电话的空闲状态:挂电话、来电拒绝
                 


                    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;  
}  
}  
 
}  

&#160;

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;

}

转载于:https://my.oschina.net/zaizaiangels/blog/526918

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值