欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android TelephonyManager详解及实现代码

程序员文章站 2024-03-05 22:52:43
java的反射机制,探秘telephonymanager在framework里包含却在sdk隐藏的几项功能。先来看看本文程序运行的效果图:   本文程序演示...

java的反射机制,探秘telephonymanager在framework里包含却在sdk隐藏的几项功能。先来看看本文程序运行的效果图:

Android TelephonyManager详解及实现代码

  本文程序演示了以下功能:

       1.所有来电自动接听;

       2.所有来电自动挂断;

       3.开启/关闭radio;

       4.开启/关闭数据连接(wap or net的连接)。

       调用telephonymanager的隐藏api是先参考framework的/base/telephony/java/com/android/internal/telephony/itelephony.aidl,然后自己实现一个itelephony.aidl,最后在telephonymanager中通过反射机制实例化自定义的itelephony,实例化之后就可以调用itelephony里面的函数了。

       本文程序需要在androidmanifest.xml添加以下两行代码,以获得权限:

xml/html代码:

<uses-permission android:name="android.permission.call_phone" /> 
<uses-permission android:name="android.permission.modify_phone_state" /> 

  main.xml源码如下:

<?xml version="1.0" encoding="utf-8"?> 
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:orientation="vertical" android:layout_width="fill_parent" 
  android:layout_height="fill_parent"> 
  <radiogroup android:layout_height="wrap_content" 
    android:layout_width="fill_parent" android:id="@+id/rgrpselect"> 
    <radiobutton android:layout_height="wrap_content" 
      android:layout_width="fill_parent" android:id="@+id/rbtnautoaccept" 
      android:text="所有来电自动接听"></radiobutton> 
    <radiobutton android:layout_height="wrap_content" 
      android:layout_width="fill_parent" android:id="@+id/rbtnautoreject" 
      android:text="所有来电自动挂断"></radiobutton> 
  </radiogroup> 
  <togglebutton android:layout_height="wrap_content" 
    android:layout_width="fill_parent" android:id="@+id/tbtnradioswitch" 
    android:texton="radio已经启动" android:textoff="radio已经关闭" 
    android:textsize="24dip" android:textstyle="normal"></togglebutton> 
  <togglebutton android:layout_height="wrap_content" 
    android:layout_width="fill_parent" android:id="@+id/tbtndataconn" 
    android:textsize="24dip" android:textstyle="normal" android:texton="允许数据连接" 
    android:textoff="禁止数据连接"></togglebutton> 
</linearlayout> 

 phoneutils.java是手机功能类,从telephonymanager中实例化itelephony并返回,源码如下:

package com.testtelephony; 
 
import java.lang.reflect.field; 
import java.lang.reflect.method; 
import com.android.internal.telephony.itelephony; 
import android.telephony.telephonymanager; 
import android.util.log; 
 
public class phoneutils { 
  /** 
   * 从telephonymanager中实例化itelephony,并返回 
   */ 
  static public itelephony getitelephony(telephonymanager telmgr) throws exception { 
    method getitelephonymethod = telmgr.getclass().getdeclaredmethod("getitelephony"); 
    getitelephonymethod.setaccessible(true);//私有化函数也能使用 
    return (itelephony)getitelephonymethod.invoke(telmgr); 
  } 
   
  static public void printallinform(class clsshow) {  
    try {  
      // 取得所有方法  
      method[] hidemethod = clsshow.getdeclaredmethods();  
      int i = 0;  
      for (; i < hidemethod.length; i++) {  
        log.e("method name", hidemethod[i].getname());  
      }  
      // 取得所有常量  
      field[] allfields = clsshow.getfields();  
      for (i = 0; i < allfields.length; i++) {  
        log.e("field name", allfields[i].getname());  
      }  
    } catch (securityexception e) {  
      // throw new runtimeexception(e.getmessage());  
      e.printstacktrace();  
    } catch (illegalargumentexception e) {  
      // throw new runtimeexception(e.getmessage());  
      e.printstacktrace();  
    } catch (exception e) {  
      // todo auto-generated catch block  
      e.printstacktrace();  
    }  
  }  
} 

testtelephony.java是主类,使用phonestatelistener监听通话状态,以及实现上述4种电话控制功能,源码如下:

package com.testtelephony; 
 
import android.app.activity; 
import android.os.bundle; 
import android.telephony.phonestatelistener; 
import android.telephony.telephonymanager; 
import android.util.log; 
import android.view.view; 
import android.widget.radiogroup; 
import android.widget.togglebutton; 
 
public class testtelephony extends activity { 
  /** called when the activity is first created. */ 
  radiogroup rg;//来电操作单选框 
  togglebutton tbtnradioswitch;//radio开关 
  togglebutton tbtndataconn;//数据连接的开关 
  telephonymanager telmgr; 
  callstatelistener statelistner; 
  int checkedid=0; 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.main); 
     
    telmgr= (telephonymanager)getsystemservice(telephony_service); 
    telmgr.listen(new callstatelistener(), callstatelistener.listen_call_state); 
     
    phoneutils.printallinform(telephonymanager.class); 
     
    rg = (radiogroup)findviewbyid(r.id.rgrpselect); 
    rg.setoncheckedchangelistener(new checkevent()); 
    tbtnradioswitch=(togglebutton)this.findviewbyid(r.id.tbtnradioswitch); 
    tbtnradioswitch.setonclicklistener(new clickevent()); 
    try { 
      tbtnradioswitch.setchecked(phoneutils.getitelephony(telmgr).isradioon()); 
    } catch (exception e) { 
      log.e("error",e.getmessage()); 
    } 
    tbtndataconn=(togglebutton)this.findviewbyid(r.id.tbtndataconn); 
    tbtndataconn.setonclicklistener(new clickevent()); 
    try { 
      tbtndataconn.setchecked(phoneutils.getitelephony(telmgr).isdataconnectivitypossible()); 
    } catch (exception e) { 
      log.e("error",e.getmessage()); 
    } 
  } 
   
  /** 
   * 来电时的操作 
   * @author gv 
   * 
   */ 
  public class checkevent implements radiogroup.oncheckedchangelistener{ 
 
    @override 
    public void oncheckedchanged(radiogroup group, int checkedid) { 
      testtelephony.this.checkedid=checkedid; 
    } 
  } 
   
  /** 
   * radio和数据连接的开关 
   * @author gv 
   * 
   */ 
  public class clickevent implements view.onclicklistener{ 
 
    @override 
    public void onclick(view v) { 
      if (v == tbtnradioswitch) { 
        try { 
          phoneutils.getitelephony(telmgr).setradio(tbtnradioswitch.ischecked()); 
        } catch (exception e) { 
          log.e("error", e.getmessage()); 
        } 
      } 
      else if(v==tbtndataconn){ 
        try { 
          if(tbtndataconn.ischecked()) 
            phoneutils.getitelephony(telmgr).enabledataconnectivity(); 
          else if(!tbtndataconn.ischecked()) 
            phoneutils.getitelephony(telmgr).disabledataconnectivity(); 
        } catch (exception e) { 
          log.e("error", e.getmessage()); 
        }   
      } 
    } 
  } 
   
  /** 
   * 监视电话状态 
   * @author gv 
   * 
   */ 
  public class callstatelistener extends phonestatelistener { 
    @override 
    public void oncallstatechanged(int state, string incomingnumber) { 
      if(state==telephonymanager.call_state_idle)//挂断 
      { 
        log.e("idle",incomingnumber); 
      } 
      else if(state==telephonymanager.call_state_offhook)//接听 
      { 
        log.e("offhook",incomingnumber); 
      } 
      else if(state==telephonymanager.call_state_ringing)//来电 
      { 
        if(testtelephony.this.checkedid==r.id.rbtnautoaccept) 
        { 
          try { 
            //需要<uses-permission android:name="android.permission.modify_phone_state" />  
            phoneutils.getitelephony(telmgr).silenceringer();//静铃 
            phoneutils.getitelephony(telmgr).answerringingcall();//自动接听 
             
          } catch (exception e) { 
            log.e("error",e.getmessage()); 
          }   
        } 
        else if(testtelephony.this.checkedid==r.id.rbtnautoreject) 
        { 
          try { 
            phoneutils.getitelephony(telmgr).endcall();//挂断 
            phoneutils.getitelephony(telmgr).cancelmissedcallsnotification();//取消未接显示 
          } catch (exception e) { 
            log.e("error",e.getmessage());  
          } 
        } 
      } 
      super.oncallstatechanged(state, incomingnumber); 
    } 
  } 
} 

以上就是android telephonymanager的介绍和简单示例,希望能帮助有需要的同学,谢谢大家对本站的支持!