当前位置: 移动技术网 > IT编程>移动开发>Android > Android TelephonyManager详解及实现代码

Android TelephonyManager详解及实现代码

2019年07月24日  | 移动技术网IT编程  | 我要评论

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

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

       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的介绍和简单示例,希望能帮助有需要的同学,谢谢大家对本站的支持!

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网