一個月前還是夏季,如今卻已是冬季,西安真的是沒有秋季和春季。OK,廢話不多說,今天要說的是andriod內(nèi)部的撥電話broadcast以及提一下AsyncTask。
我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、西城ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的西城網(wǎng)站制作公司
咱們在看這篇博客之前,先看看我的那篇<<Windows Mobile 5 編程體驗(yàn)3>>。在那篇文章我提到了一個網(wǎng)站,可以獲取手機(jī)號碼歸屬地,天氣預(yù)報等等一些webservice。下圖是我當(dāng)時在windows mobile模擬器上實(shí)現(xiàn)的效果,說到這個mobile,我本來是很想去學(xué)windows phone開發(fā)的,誰想還要交費(fèi)買賬號,太麻煩了,我放棄了,還不如學(xué)android呢,寫個程序隨便放上去了。不說了,看下圖

是不是這樣呢,我當(dāng)時說了,這個號碼誰隨便輸入的,如有雷同,純屬巧合。
OK,我們接下來看看這個網(wǎng)站W(wǎng)ebService網(wǎng)站,進(jìn)去之后,我們點(diǎn)擊國內(nèi)手機(jī)號碼歸屬地查詢WEB服務(wù)

進(jìn)去之后,我們查看如下方法getMobileCodeInfo

OK,我們看到了該WebService得request請求參數(shù)和response返回結(jié)果。

那OK,知道了這些,我們何愁調(diào)用呢,接下來就看我們的android客戶端如何調(diào)用它。
首先我們這次的設(shè)計(jì)是當(dāng)activity啟動后,我們拿到本機(jī)的號碼。當(dāng)用戶播出電話的時候,先拿到本機(jī)號碼歸屬地,再拿到播出號碼的歸屬地,兩個號碼歸屬地進(jìn)行對比,如果歸屬地不一致,則加撥17951或者17911。
首先來看本機(jī)號碼的獲取,我們現(xiàn)在activity中定義一個公開的變量
public String nativePhoneNumber;
在OnCreate方法中,我們拿到本機(jī)號碼
private String GetNativePhoneNumber(){
TelephonyManager telephonyManager = (TelephonyManager)this
.getSystemService(Context.TELEPHONY_SERVICE);
return telephonyManager.getLine1Number();
}ok,拿到本機(jī)號碼后,我們來看撥打這塊的處理。我們知道,android有很多的內(nèi)部廣播,比如電池電量低,打電話,收短信,手機(jī)重啟等等。這些廣播我們都可以接收到,這樣我們就可以實(shí)現(xiàn)一些功能,比如IP撥號,電池電量低自動調(diào)整屏幕亮度,切斷網(wǎng)絡(luò)等一些手機(jī)管理軟件類似于360上面的一些功能。
這里我們接收撥出電話廣播的代碼如下
public class IpDialBroadCastReceiver extends BroadcastReceiver {
final String IPChinaMobilePrefix = "17951";
final String IPChinaUnionPrefix = "17911";
final String ChinaMobile="移動";
final String ChinaUnion="聯(lián)通";
@Override
public void onReceive(Context context, Intent intent) {
String callNumber = getResultData();
//ProgressDialog pg=punchinalarm.owner.progressDialog;
//new MobileAdressTask(pg,callNumber).execute(callNumber);
String nativePhoneNumber = punchinalarm.owner.nativePhoneNumber;
String nativeAddress= punchinalarm.GetMobileAddress(nativePhoneNumber).toString();
String callAddress = punchinalarm.GetMobileAddress(callNumber).toString();
String newIPPhoneNumber="";
if(!nativeAddress.equalsIgnoreCase(callAddress)){
if(nativeAddress.contains(ChinaMobile))
{
newIPPhoneNumber = IPChinaMobilePrefix.concat(callNumber);
}
else
{
newIPPhoneNumber = IPChinaUnionPrefix.concat(callNumber);
}
setResultData(newIPPhoneNumber);
}
}
}在這里我們區(qū)分了聯(lián)通和移動。當(dāng)我們接收到打電話的廣播之后,先拿到本機(jī)號碼的歸屬地和所播電話的歸屬地進(jìn)行對比,如果不一致,則加撥IP。這里主要是看一下punchinalarm.GetMobileAddress這個方法。
public static SoapObject GetMobileAddress(String mobileNumber) {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo pi = new PropertyInfo();
pi.setName("mobileCode");
pi.setType(String.class);
pi.setValue(mobileNumber);
request.addProperty(pi);
pi=new PropertyInfo();
pi.setName("userID");
pi.setType(String.class);
pi.setValue("");
request.addProperty(pi);
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
soapEnvelope.dotNet = true;
HttpTransportSE httpTS = new HttpTransportSE(URL);
soapEnvelope.bodyOut = request;
soapEnvelope.setOutputSoapObject(request);// 設(shè)置請求參數(shù)
try {
httpTS.call(SOAP_ACTION, soapEnvelope);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SoapObject result = (SoapObject) soapEnvelope.bodyIn;
return result;
}我們需要注意的就是NAMESPACE,METHOD_NAME,URL,SOAPACTION等。
final static String NAMESPACE = "http://WebXml.com.cn/"; final static String METHOD_NAME = "getMobileCodeInfo"; final static String SOAP_ACTION = "http://WebXml.com.cn/getMobileCodeInfo"; final static String URL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";
如果大家不知道這些變量該怎么取,看下面

nameSpace知道了。

soapAction知道了,URL也知道了,MethodName也知道了。
好了,我們給webservice傳入兩個參數(shù),userID不用傳,具體的參數(shù)如何傳看webservice中的描述。
拿到這兩個歸屬地之后,我們重新設(shè)置撥號號碼
setResultData(newIPPhoneNumber);
相當(dāng)于對當(dāng)前非IP撥號進(jìn)行攔截,再進(jìn)行IP撥號。我們先看看在模擬器中的效果。經(jīng)過調(diào)試,我們發(fā)現(xiàn)本機(jī)號碼是15555215554,歸屬地是安徽,運(yùn)營商是聯(lián)通(如有雷同,純屬巧合)


撥打的號碼是13555556666,歸屬地是黑龍江,運(yùn)營商是移動(如有雷同,純屬巧合)


所以兩個歸屬地不一樣,而且本機(jī)是聯(lián)通,所以加撥17911。

OK,我們再看看在真機(jī)中的情況。結(jié)果報錯,wifi連接著呢,為什么報錯?找了半天原因,原來是我的這個APP沒有開啟網(wǎng)絡(luò)權(quán)限。

就是這個個人理財(cái)APP,我們看一下效果

看見了吧,自動加撥了17951。最后我們再看一下異步的實(shí)現(xiàn)

代碼如下,在獲取通話廣播之后,我們開啟一個異步task去檢測歸屬地
ProgressDialog pg=punchinalarm.owner.progressDialog; new MobileAdressTask(pg,callNumber).execute(callNumber);
public class MobileAdressTask extends AsyncTask<String, Integer, String> {
final String IPPrefix = "17951";
String callNumber;
ProgressDialog progressDialog;
public MobileAdressTask(ProgressDialog progressDialog, String callNumber) {
this.progressDialog = progressDialog;
this.callNumber = callNumber;
}
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
protected String doInBackground(String... params) {
publishProgress(5);
String s = params[0];
SoapObject soapObjValue = punchinalarm.GetMobileAddress(params[0]);
publishProgress(100);
return soapObjValue == null ? "" : soapObjValue.toString();
}
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (!result.contains("西安") && !callNumber.startsWith(IPPrefix)) {
String newnumber = IPPrefix.concat(callNumber);
Intent dialIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
+ newnumber));
punchinalarm.owner.startActivity(dialIntent);
}
progressDialog.dismiss();
}
}在doInBackGroud中我們得到歸屬地并模擬進(jìn)度條。得到歸屬地之后,我們判斷如果不是西安的號碼并且沒有加撥17951我們就加撥17951。此時會有一個號碼是hold狀態(tài)。

OK,最后看一下真機(jī)效果

最后,別忘了這三個配置,前兩個是讀取手機(jī)信息和處理撥電話權(quán)限,最后一個是靜態(tài)注冊廣播接收者。這個接受者就是上面提到的IpDialBroadCastReceiver,這個廣播接收者只接收android.intent.action.NEW_OUTGOING_CALL這個action發(fā)出的廣播。其中要注意的是這個receiver是注冊在Application節(jié)點(diǎn)中的。
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> <receiver android:name="bruce.broadcastor.IpDialBroadCastReceiver"> <intent-filter android:priority="1"> <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver>
哥們博客貨真價實(shí),小米3測試機(jī),需要源碼的同學(xué)去下載×××
網(wǎng)頁名稱:Android切近實(shí)戰(zhàn)(九)
本文路徑:http://chinadenli.net/article34/gdehpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站內(nèi)鏈、營銷型網(wǎng)站建設(shè)、App開發(fā)、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)