中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android切近實戰(九)

發布時間:2020-08-02 08:15:55 來源:網絡 閱讀:1239 作者:BruceAndLee 欄目:移動開發

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


咱們在看這篇博客之前,先看看我的那篇<<Windows Mobile 5 編程體驗3>>。在那篇文章我提到了一個網站,可以獲取手機號碼歸屬地,天氣預報等等一些webservice。下圖是我當時在windows mobile模擬器上實現的效果,說到這個mobile,我本來是很想去學windows phone開發的,誰想還要交費買賬號,太麻煩了,我放棄了,還不如學android呢,寫個程序隨便放上去了。不說了,看下圖

Android切近實戰(九)

是不是這樣呢,我當時說了,這個號碼誰隨便輸入的,如有雷同,純屬巧合。


OK,我們接下來看看這個網站WebService網站,進去之后,我們點擊國內手機號碼歸屬地查詢WEB服務

Android切近實戰(九)

進去之后,我們查看如下方法getMobileCodeInfo

Android切近實戰(九)

OK,我們看到了該WebService得request請求參數和response返回結果。

Android切近實戰(九)

那OK,知道了這些,我們何愁調用呢,接下來就看我們的android客戶端如何調用它。


首先我們這次的設計是當activity啟動后,我們拿到本機的號碼。當用戶播出電話的時候,先拿到本機號碼歸屬地,再拿到播出號碼的歸屬地,兩個號碼歸屬地進行對比,如果歸屬地不一致,則加撥17951或者17911。

首先來看本機號碼的獲取,我們現在activity中定義一個公開的變量

public String nativePhoneNumber;

在OnCreate方法中,我們拿到本機號碼

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

ok,拿到本機號碼后,我們來看撥打這塊的處理。我們知道,android有很多的內部廣播,比如電池電量低,打電話,收短信,手機重啟等等。這些廣播我們都可以接收到,這樣我們就可以實現一些功能,比如IP撥號,電池電量低自動調整屏幕亮度,切斷網絡等一些手機管理軟件類似于360上面的一些功能。


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

public class IpDialBroadCastReceiver extends BroadcastReceiver {
	final String IPChinaMobilePrefix = "17951";
	final String IPChinaUnionPrefix = "17911";
	final String ChinaMobile="移動";
	final String ChinaUnion="聯通";
	
	@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);
		}
	}
}

在這里我們區分了聯通和移動。當我們接收到打電話的廣播之后,先拿到本機號碼的歸屬地和所播電話的歸屬地進行對比,如果不一致,則加撥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);// 設置請求參數

		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切近實戰(九)

nameSpace知道了。

Android切近實戰(九)

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

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

拿到這兩個歸屬地之后,我們重新設置撥號號碼

setResultData(newIPPhoneNumber);

相當于對當前非IP撥號進行攔截,再進行IP撥號。我們先看看在模擬器中的效果。經過調試,我們發現本機號碼是15555215554,歸屬地是安徽,運營商是聯通(如有雷同,純屬巧合)

Android切近實戰(九)Android切近實戰(九)

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

Android切近實戰(九)Android切近實戰(九)


所以兩個歸屬地不一樣,而且本機是聯通,所以加撥17911。

Android切近實戰(九)

OK,我們再看看在真機中的情況。結果報錯,wifi連接著呢,為什么報錯?找了半天原因,原來是我的這個APP沒有開啟網絡權限。

Android切近實戰(九)

就是這個個人理財APP,我們看一下效果

Android切近實戰(九)

看見了吧,自動加撥了17951。最后我們再看一下異步的實現

Android切近實戰(九)

代碼如下,在獲取通話廣播之后,我們開啟一個異步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中我們得到歸屬地并模擬進度條。得到歸屬地之后,我們判斷如果不是西安的號碼并且沒有加撥17951我們就加撥17951。此時會有一個號碼是hold狀態。

Android切近實戰(九)

OK,最后看一下真機效果

Android切近實戰(九)

最后,別忘了這三個配置,前兩個是讀取手機信息和處理撥電話權限,最后一個是靜態注冊廣播接收者。這個接受者就是上面提到的IpDialBroadCastReceiver,這個廣播接收者只接收android.intent.action.NEW_OUTGOING_CALL這個action發出的廣播。其中要注意的是這個receiver是注冊在Application節點中的。

<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>

哥們博客貨真價實,小米3測試機,需要源碼的同學去下載×××

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

林甸县| 塔河县| 太和县| 开原市| 亚东县| 鄂州市| 芒康县| 瑞丽市| 大悟县| 霸州市| 芦山县| 合阳县| 汕尾市| 松江区| 云南省| 桐乡市| 神木县| 安溪县| 巴塘县| 正定县| 理塘县| 吉木萨尔县| 淅川县| 黄浦区| 海原县| 保康县| 潍坊市| 安康市| 和田县| 鲁甸县| 盘锦市| 延边| 富蕴县| 河西区| 甘德县| 正宁县| 怀柔区| 广河县| 海口市| 虎林市| 西宁市|