Android切近實(shí)戰(zhàn)(九)

一個(gè)月前還是夏季,如今卻已是冬季,西安真的是沒(méi)有秋季和春季。OK,廢話不多說(shuō),今天要說(shuō)的是andriod內(nèi)部的撥電話broadcast以及提一下AsyncTask。

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、西城ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的西城網(wǎng)站制作公司

咱們?cè)诳催@篇博客之前,先看看我的那篇<<Windows Mobile 5 編程體驗(yàn)3>>。在那篇文章我提到了一個(gè)網(wǎng)站,可以獲取手機(jī)號(hào)碼歸屬地,天氣預(yù)報(bào)等等一些webservice。下圖是我當(dāng)時(shí)在windows mobile模擬器上實(shí)現(xiàn)的效果,說(shuō)到這個(gè)mobile,我本來(lái)是很想去學(xué)windows phone開(kāi)發(fā)的,誰(shuí)想還要交費(fèi)買(mǎi)賬號(hào),太麻煩了,我放棄了,還不如學(xué)android呢,寫(xiě)個(gè)程序隨便放上去了。不說(shuō)了,看下圖

Android切近實(shí)戰(zhàn)(九)

是不是這樣呢,我當(dāng)時(shí)說(shuō)了,這個(gè)號(hào)碼誰(shuí)隨便輸入的,如有雷同,純屬巧合。

OK,我們接下來(lái)看看這個(gè)網(wǎng)站W(wǎng)ebService網(wǎng)站,進(jìn)去之后,我們點(diǎn)擊國(guó)內(nèi)手機(jī)號(hào)碼歸屬地查詢WEB服務(wù)

Android切近實(shí)戰(zhàn)(九)

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

Android切近實(shí)戰(zhàn)(九)

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

Android切近實(shí)戰(zhàn)(九)

那OK,知道了這些,我們何愁調(diào)用呢,接下來(lái)就看我們的android客戶端如何調(diào)用它。

首先我們這次的設(shè)計(jì)是當(dāng)activity啟動(dòng)后,我們拿到本機(jī)的號(hào)碼。當(dāng)用戶播出電話的時(shí)候,先拿到本機(jī)號(hào)碼歸屬地,再拿到播出號(hào)碼的歸屬地,兩個(gè)號(hào)碼歸屬地進(jìn)行對(duì)比,如果歸屬地不一致,則加撥17951或者17911。

首先來(lái)看本機(jī)號(hào)碼的獲取,我們現(xiàn)在activity中定義一個(gè)公開(kāi)的變量

public String nativePhoneNumber;

在OnCreate方法中,我們拿到本機(jī)號(hào)碼

private String GetNativePhoneNumber(){
		TelephonyManager telephonyManager = (TelephonyManager)this
        .getSystemService(Context.TELEPHONY_SERVICE);
		
		return telephonyManager.getLine1Number();
	}

ok,拿到本機(jī)號(hào)碼后,我們來(lái)看撥打這塊的處理。我們知道,android有很多的內(nèi)部廣播,比如電池電量低,打電話,收短信,手機(jī)重啟等等。這些廣播我們都可以接收到,這樣我們就可以實(shí)現(xiàn)一些功能,比如IP撥號(hào),電池電量低自動(dòng)調(diào)整屏幕亮度,切斷網(wǎng)絡(luò)等一些手機(jī)管理軟件類(lèi)似于360上面的一些功能。

這里我們接收撥出電話廣播的代碼如下

public class IpDialBroadCastReceiver extends BroadcastReceiver {
	final String IPChinaMobilePrefix = "17951";
	final String IPChinaUnionPrefix = "17911";
	final String ChinaMobile="移動(dòng)";
	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)。當(dāng)我們接收到打電話的廣播之后,先拿到本機(jī)號(hào)碼的歸屬地和所播電話的歸屬地進(jìn)行對(duì)比,如果不一致,則加撥IP。這里主要是看一下punchinalarm.GetMobileAddress這個(gè)方法。

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è)置請(qǐng)求參數(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";

如果大家不知道這些變量該怎么取,看下面

Android切近實(shí)戰(zhàn)(九)

nameSpace知道了。

Android切近實(shí)戰(zhàn)(九)

soapAction知道了,URL也知道了,MethodName也知道了。

好了,我們給webservice傳入兩個(gè)參數(shù),userID不用傳,具體的參數(shù)如何傳看webservice中的描述。

拿到這兩個(gè)歸屬地之后,我們重新設(shè)置撥號(hào)號(hào)碼

setResultData(newIPPhoneNumber);

相當(dāng)于對(duì)當(dāng)前非IP撥號(hào)進(jìn)行攔截,再進(jìn)行IP撥號(hào)。我們先看看在模擬器中的效果。經(jīng)過(guò)調(diào)試,我們發(fā)現(xiàn)本機(jī)號(hào)碼是15555215554,歸屬地是安徽,運(yùn)營(yíng)商是聯(lián)通(如有雷同,純屬巧合)

Android切近實(shí)戰(zhàn)(九)Android切近實(shí)戰(zhàn)(九)

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

Android切近實(shí)戰(zhàn)(九)Android切近實(shí)戰(zhàn)(九)

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

Android切近實(shí)戰(zhàn)(九)

OK,我們?cè)倏纯丛谡鏅C(jī)中的情況。結(jié)果報(bào)錯(cuò),wifi連接著呢,為什么報(bào)錯(cuò)?找了半天原因,原來(lái)是我的這個(gè)APP沒(méi)有開(kāi)啟網(wǎng)絡(luò)權(quán)限。

Android切近實(shí)戰(zhàn)(九)

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

Android切近實(shí)戰(zhàn)(九)

看見(jiàn)了吧,自動(dòng)加撥了17951。最后我們?cè)倏匆幌庐惒降膶?shí)現(xiàn)

Android切近實(shí)戰(zhàn)(九)

代碼如下,在獲取通話廣播之后,我們開(kāi)啟一個(gè)異步task去檢測(cè)歸屬地

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)度條。得到歸屬地之后,我們判斷如果不是西安的號(hào)碼并且沒(méi)有加撥17951我們就加撥17951。此時(shí)會(huì)有一個(gè)號(hào)碼是hold狀態(tài)。

Android切近實(shí)戰(zhàn)(九)

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

Android切近實(shí)戰(zhàn)(九)

最后,別忘了這三個(gè)配置,前兩個(gè)是讀取手機(jī)信息和處理?yè)茈娫挋?quán)限,最后一個(gè)是靜態(tài)注冊(cè)廣播接收者。這個(gè)接受者就是上面提到的IpDialBroadCastReceiver,這個(gè)廣播接收者只接收android.intent.action.NEW_OUTGOING_CALL這個(gè)action發(fā)出的廣播。其中要注意的是這個(gè)receiver是注冊(cè)在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>

哥們博客貨真價(jià)實(shí),小米3測(cè)試機(jī),需要源碼的同學(xué)去下載×××

網(wǎng)頁(yè)名稱:Android切近實(shí)戰(zhàn)(九)
本文路徑:http://muchs.cn/article34/gdehpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)站導(dǎo)航、網(wǎng)站內(nèi)鏈、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、App開(kāi)發(fā)、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)