欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Android提高第十四篇之探秘TelephonyManager

系統(tǒng) 1945 0
上次介紹了如何使用JAVA的反射機(jī)制來(lái)調(diào)用 藍(lán)牙的隱藏API ,這次繼續(xù)練習(xí)JAVA的反射機(jī)制,探秘TelephonyManager在Framework里包含卻在SDK隱藏的幾項(xiàng)功能。先來(lái)看看本文程序運(yùn)行的效果圖:

Android提高第十四篇之探秘TelephonyManager
本文程序演示了以下功能:

1.所有來(lái)電自動(dòng)接聽(tīng);

2.所有來(lái)電自動(dòng)掛斷;

3.開(kāi)啟/關(guān)閉Radio;

4.開(kāi)啟/關(guān)閉數(shù)據(jù)連接(WAP or NET的連接)。

調(diào)用TelephonyManager的隱藏API是先參考Framework的\base\telephony\java\com\android\internal\telephony\ITelephony.aidl,然后自己實(shí)現(xiàn)一個(gè)ITelephony.aidl,最后在TelephonyManager中通過(guò)反射機(jī)制實(shí)例化自定義的ITelephony,實(shí)例化之后就可以調(diào)用ITelephony里面的函數(shù)了。

本文程序需要在AndroidManifest.xml添加以下兩行代碼,以獲得權(quán)限:
    
<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="所有來(lái)電自動(dòng)接聽(tīng)"></RadioButton>  
        <RadioButton android:layout_height="wrap_content"  
            android:layout_width="fill_parent" android:id="@+id/rbtnAutoReject"  
            android:text="所有來(lái)電自動(dòng)掛斷"></RadioButton>  
    </RadioGroup>  
    <ToggleButton android:layout_height="wrap_content"  
        android:layout_width="fill_parent" android:id="@+id/tbtnRadioSwitch"  
        android:textOn="Radio已經(jīng)啟動(dòng)" android:textOff="Radio已經(jīng)關(guān)閉"  
        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="允許數(shù)據(jù)連接"  
        android:textOff="禁止數(shù)據(jù)連接"></ToggleButton>  
</LinearLayout>  

  

PhoneUtils.java是手機(jī)功能類,從TelephonyManager中實(shí)例化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中實(shí)例化ITelephony,并返回 
     */  
    static public ITelephony getITelephony(TelephonyManager telMgr) throws Exception {  
        Method getITelephonyMethod = telMgr.getClass().getDeclaredMethod("getITelephony");  
        getITelephonyMethod.setAccessible(true);//私有化函數(shù)也能使用  
        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監(jiān)聽(tīng)通話狀態(tài),以及實(shí)現(xiàn)上述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;//來(lái)電操作單選框  
    ToggleButton tbtnRadioSwitch;//Radio開(kāi)關(guān)  
    ToggleButton tbtnDataConn;//數(shù)據(jù)連接的開(kāi)關(guān)  
    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());  
        }  
    }  
      
    /** 
     * 來(lái)電時(shí)的操作 
     * @author GV 
     * 
     */  
    public class CheckEvent implements RadioGroup.OnCheckedChangeListener{  
  
        @Override  
        public void onCheckedChanged(RadioGroup group, int checkedId) {  
            testTelephony.this.checkedId=checkedId;  
        }  
    }  
      
    /** 
     * Radio和數(shù)據(jù)連接的開(kāi)關(guān) 
     * @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());  
                }     
            }  
        }  
    }  
      
    /** 
     * 監(jiān)視電話狀態(tài) 
     * @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)//接聽(tīng)  
            {  
                Log.e("OFFHOOK",incomingNumber);  
            }  
            else if(state==TelephonyManager.CALL_STATE_RINGING)//來(lái)電  
            {  
                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();//自動(dòng)接聽(tīng)  
                          
                    } 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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 激情五月婷婷色 | 大片毛片 | 久久蜜桃亚洲一区二区 | 色www 永久免费网站 | 成片免费观看视频在线网 | 久久久久久av | 亚洲人人精品 | 在线观看高清免费 | 激情国产视频 | 日韩一级a毛片欧美一级 | 91精品视频免费 | 国产福利福利视频 | 日本在线观看视频网站 | 一级黄色大片视频 | 久久久国产99久久国产一 | 亚洲毛片视频 | 天天亚洲 | 婷婷综合网站 | 久久91精品国产91久久小草 | 一级做a爰片久久毛片人呢 达达兔午夜起神影院在线观看麻烦 | 亚洲国产成人va在线观看网址 | 大毛片 | 天天拍天天干天天操 | 欧美高清性色生活片免费观看 | 婷婷免费视频 | 国产精品成在线观看 | 欧美三级不卡 | 中国大陆高清aⅴ毛片 | 精品久久久久久中文 | 久久久国产99久久国产一 | 国产一级一区 | 一级毛片aaaaaa视频免费看 | 国产精品久久久久久久久久大牛 | 欧美成人全部费免网站 | 狠狠操狠狠操 | 欧美大片一区二区三区 | 亚洲一区播放 | 91亚洲精品成人一区 | 亚洲精品久久久一二三区 | 一区二区三区亚洲 | 亚洲AV久久无码精品九号 |