android项目手机卫士来电显示号码归属地

 更新时间:2016年10月22日 16:17:04   作者:陶士涵  
由于诈骗电话越来越猖狂,号码归属地显示越来越重要,本篇文章主要介绍了android手机卫士来电显示号码归属地,有要的朋友可以了解一下。

昨日实现了360手机卫士的来电显示归属地的功能,具体的功能就是当来电的时候,显示当前号码的归属地,学习之后发现操作

非常的简单,具体实现代码如下:

AddressService.java

 package com.qingguow.mobilesafe.service;

import com.qingguow.mobilesafe.utils.NumberQueryAddressUtil;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;

/**
 * 来电显示
 * 
 * @author taoshihan
 * 
 */
public class AddressService extends Service {
  private TelephonyManager tm;
  private MyPhoneStateListener phoneStateListener;

  @Override
  public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
  }
  /**
   * 服务创建
   */
  @Override
  public void onCreate() {
    super.onCreate();
    tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    phoneStateListener = new MyPhoneStateListener();
    tm.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
  }

  private class MyPhoneStateListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
      super.onCallStateChanged(state, incomingNumber);
      switch (state) {
      case TelephonyManager.CALL_STATE_RINGING:
        String info = NumberQueryAddressUtil
            .queryAddress(incomingNumber);
        Toast.makeText(getApplicationContext(), info, 1).show();
        break;
      default:
        break;
      }
    }
  }
  /**
   * 服务销毁
   */
  @Override
  public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    //取消监听
    tm.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
    phoneStateListener=null;
  }
}

设置中心,配置是否开启来电归属地显示

直接使用我们之前定义好的组合控件

<com.qingguow.mobilesafe.ui.SettingItemView
    tsh:title="设置显示号码归属地"
    tsh:desc_on="设置显示号码归属地已开启"
    tsh:desc_off="设置显示号码归属地已关闭"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/siv_show_address">
  </com.qingguow.mobilesafe.ui.SettingItemView>

获取到SettingItemView对象,我们自定义的控件,设置状态

调用SettingItemView对象的setOnClickListener()方法,设置点击事件,重写onClick方法

调用SettingItemView对象的isChecked()方法,得到当前是否选中

判断状态,调用SettingItemView对象的setChecked()方法,设置状态,参数:布尔值

调用startService()方法,开启监听手机状态的服务,参数:Intent对象,

调用stopService()方法,关闭服务

判断当前服务是否开启,设置控件的默认选中状态

新建一个工具类ServicesUtils.java

定义一个静态方法isServiceRunning(),传入参数:Context上下文,String服务名

调用Context对象的getSystemService()方法,获取ActivityManager对象,参数:Context.ACTIVITY_SERVICE

调用ActivityManager对象的getRunningServices()方法,得到运行的服务List集合,参数:int最大值

for循环List集合,每条是个RunningServiceInfo对象

调用RunningServiceInfo.servie.getClassName(),获取到String服务类名,判断一下如果相等返回true

SettingActivity.java

package com.qingguow.mobilesafe;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

import com.qingguow.mobilesafe.service.AddressService;
import com.qingguow.mobilesafe.ui.SettingItemView;
import com.qingguow.mobilesafe.utils.ServiceUtils;

public class SettingActivity extends Activity {
  private SettingItemView siv_item;
  private SharedPreferences sp;
  // 设置是否开启号码归属地
  private SettingItemView showAddressBtn;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_setting);

    // 设置号码归属地
    showAddressBtn = (SettingItemView) findViewById(R.id.siv_show_address);
    if (ServiceUtils.isRunningService(this,
        "com.qingguow.mobilesafe.service.AddressService")) {
      showAddressBtn.setChecked(true);
    } else {
      showAddressBtn.setChecked(false);
    }
    showAddressBtn.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View arg0) {
        if (showAddressBtn.isChecked()) {
          showAddressBtn.setChecked(false);
          stopService(new Intent(getApplicationContext(),
              AddressService.class));
        } else {
          showAddressBtn.setChecked(true);
          startService(new Intent(getApplicationContext(),
              AddressService.class));
        }
      }
    });

    siv_item = (SettingItemView) findViewById(R.id.siv_item);
    sp = getSharedPreferences("config", MODE_PRIVATE);
    // 根据保存的数据设置状态
    boolean update = sp.getBoolean("update", false);
    if (update) {
      siv_item.setChecked(true);
    } else {
      siv_item.setChecked(false);
    }

    // 自动更新的点击事件
    siv_item.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View arg0) {
        Editor editor = sp.edit();
        if (siv_item.isChecked()) {
          // 设置不选中
          siv_item.setChecked(false);
          editor.putBoolean("update", false);
        } else {
          // 设置选中
          siv_item.setChecked(true);
          editor.putBoolean("update", true);
        }
        editor.commit();
      }
    });
  }
}

ServicesUtils.java

package com.qingguow.mobilesafe.utils;

import java.util.List;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.content.Context;
/**
 * 服务工具类
 * @author taoshihan
 *
 */
public class ServiceUtils {
  /**
   * 判断某服务是否开启
   * @param context
   * @param serviceName
   * @return
   */
  public static boolean isRunningService(Context context,String serviceName){
    ActivityManager am=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningServiceInfo> infos=am.getRunningServices(100);
    for(RunningServiceInfo info:infos){
      String name=info.service.getClassName();
      if(name.equals(serviceName)){
        return true;
      }
    }
    return false;
  }
}

设置效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android 使用【AIDL】调用外部服务的解决方法

    Android 使用【AIDL】调用外部服务的解决方法

    本篇文章是对Android中使用AIDL调用外部服务的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Android 画中画模式的实现示例

    Android 画中画模式的实现示例

    这篇文章主要介绍了Android 画中画模式的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Android编程之Sdcard相关代码集锦

    Android编程之Sdcard相关代码集锦

    这篇文章主要介绍了Android编程之Sdcard相关代码集锦,包括Android针对sd卡的存取、检测、相关信息获取等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Android粒子线条效果实现过程与代码

    Android粒子线条效果实现过程与代码

    这篇文章主要介绍了Android粒子线条效果的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • Android实现微信朋友圈发本地视频功能

    Android实现微信朋友圈发本地视频功能

    这篇文章主要介绍了Android实现微信朋友圈发本地视频功能的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • Android Service控件用法实例分析

    Android Service控件用法实例分析

    这篇文章主要介绍了Android Service控件用法,较为详细的分析了Service控件的功能、定义、使用方法与注意事项,需要的朋友可以参考下
    2016-06-06
  • Android context源码详解及深入分析

    Android context源码详解及深入分析

    这篇文章主要介绍了Android context源码详解及深入分析的相关资料,这里对Android Context 如何使用进行了详细介绍,需要的朋友可以参考下
    2017-01-01
  • Android中关于相对布局RelativeLayout的技巧汇总

    Android中关于相对布局RelativeLayout的技巧汇总

    RelativeLayout是相对布局控件,以控件之间相对位置或相对父容器位置进行排列。下面这篇文章主要给大家介绍了关于Android中相对布局RelativeLayout的一些技巧,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • Android实现分享长图并且添加全图水印

    Android实现分享长图并且添加全图水印

    这篇文章主要介绍了Android实现分享长图并且添加全图水印的相关资料,需要的朋友可以参考下
    2017-03-03
  • Android开发之ViewSwitcher用法实例

    Android开发之ViewSwitcher用法实例

    这篇文章主要介绍了Android开发之ViewSwitcher用法,结合实例形式分析了ViewSwitcher的功能、使用方法与相关注意事项,需要的朋友可以参考下
    2016-02-02

最新评论