亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Android提高第十四篇之探秘TelephonyManager

系統 1879 0
上次介紹了如何使用JAVA的反射機制來調用 藍牙的隱藏API ,這次繼續練習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添加以下兩行代碼,以獲得權限:
    
<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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久草草 | 久久久伊人影院 | 永久免费的啪啪免费的网址 | 亚洲精品久久久久综合网 | 欧美 亚洲 另类 热图 | 天天插天天射 | 最好看的毛片 | 奇米狠狠干 | 成人影院欧美大片免费看 | 年级的后妈妈2中文翻译 | 人.成午夜 | 久久大香伊蕉在人线观看热2 | 四虎影视最新2019百度 | 91视频免费观看高清观看完整 | 久久伊 | 色综合久久九月婷婷色综合 | 国产高清久久 | 欧美一级看片a免费视频 | 国产综合亚洲欧美日韩一区二区 | 久草视频中文 | 国产日产久久高清欧美一区 | 自拍亚洲午夜伦li片影院 | 欧美aⅴ| 亚洲精品国产一区二区三区四区 | 久久青青草视频 | 亚洲精品国产一区二区三区四区 | 欧美美女xnxx | 99久久免费精品视频 | 日本日韩欧美 | 成人精品视频 成人影院 | 久久综合日韩亚洲精品色 | 国产做国产爱免费视频 | 亚洲欧美在线视频 | 亚洲小视频在线 | 久cao在线观看视频 久re这里只有精品最新地址 | 深夜福利国产精品亚洲尤物 | 伊人成年综合网 | 久久精品人人做人人看最新章 | 久久午夜网| 天天躁日日躁成人字幕aⅴ 天天躁日日躁狠狠躁黑人躁 | 午夜影院欧美 |