上篇文章地址:
C#開發(fā)移動(dòng)應(yīng)用系列(1.環(huán)境搭建)
C#開發(fā)移動(dòng)應(yīng)用系列(2.使用WebView搭建WebApp應(yīng)用)
C#開發(fā)移動(dòng)應(yīng)用系列(3.使用照相機(jī)掃描二維碼+各種基礎(chǔ)知識(shí))
寫完這篇..本系列基本也就結(jié)束了.
看完這些,基本做個(gè)Webapp應(yīng)該是毫無問題的了..其實(shí)略微有點(diǎn)傷感,Xamarin確實(shí)是好東西..
奈何,生不逢時(shí)..等完善了. 開源了..社區(qū)化了..APP應(yīng)用(指的是安裝包類客戶端)已經(jīng)逐漸沒落了..
算了,話不多說.開始正文
確定一下本篇的學(xué)習(xí)目標(biāo):
1.學(xué)會(huì)調(diào)用各類系統(tǒng)應(yīng)用
2.學(xué)會(huì)調(diào)用相冊(cè)并取得選擇的照片
3.學(xué)會(huì)被調(diào)用(嗯..就是讓別人調(diào)用你..)..
效果圖:
正文
1.學(xué)會(huì)調(diào)用各類系統(tǒng)應(yīng)用
我們都知道,安卓有很多系統(tǒng)自帶的應(yīng)用..比如,打電話.發(fā)短信,相冊(cè),地圖.Email.等等..
今天我們就來一個(gè)個(gè)的調(diào)用,并傳值.
首先我們還是添加一個(gè)按鈕,來測(cè)試調(diào)用第三方的應(yīng)用.
如圖:
然后,我們編寫這個(gè)按鈕的點(diǎn)擊事件:
protected override void OnCreate(Bundle bundle) { //獲取按鈕 var btn3 = FindViewById<Button>(Resource.Id.button3); //添加點(diǎn)擊事件 btn3.Click += delegate { //do... } }
準(zhǔn)備工作搞定,我們來編寫相關(guān)調(diào)用代碼,來調(diào)用系統(tǒng)應(yīng)用
1.1調(diào)用電話
Android.Net.Uri uri = Android.Net.Uri.Parse(=
代碼很簡(jiǎn)單..就三句話.. tel后面調(diào)用你想撥打的電話.
1.2調(diào)用短信
// 發(fā)送短信 Android.Net.Uri uri = Android.Net.Uri.Parse("smsto:10010"); Intent it = new Intent(Intent.ActionSendto, uri); it.PutExtra("sms_body", "你妹妹,我沒欠費(fèi) 你給我停機(jī)!"); StartActivity(it);
嗯..你妹妹是你要發(fā)的短信.. smsto后面是你要發(fā)送給誰..
1.3調(diào)用地圖
Android.Net.Uri uri = Android.Net.Uri.Parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.ActionView, uri); StartActivity(it);
geo后面給坐標(biāo)
1.4調(diào)用Email
Android.Net.Uri uri = Android.Net.Uri.Parse("mailto:777@qq.com?cc=aa@qq.com&subject=標(biāo)題&body=內(nèi)容");var intent = new Intent(Intent.ActionView,uri); StartActivity(intent);
1.5調(diào)用通訊錄
//第一種(建議使用第一種) Android.Net.Uri uri = Android.Net.Uri.Parse("content://contacts/people"); Intent it = new Intent(Intent.ActionPick, uri); StartActivityForResult(it, 11);//第二種 Intent i = new Intent(); i.SetAction(Intent.ActionGetContent); i.SetType("vnd.android.cursor.item/phone"); StartActivityForResult(i, 11);
1.6.(暫時(shí)就這些..沒了 哈哈哈)
我們進(jìn)入下個(gè)環(huán)節(jié)..
2.學(xué)會(huì)調(diào)用相冊(cè)并取得選擇的照片
同樣,我們?cè)邳c(diǎn)擊事件中,修改代碼如下:
Intent i = new Intent(); i.SetType("image/*"); i.SetAction(Intent.ActionPick); StartActivityForResult(i,11);
細(xì)心的朋友已經(jīng)發(fā)現(xiàn)了..在1.4之前我們最后一句,都是StartActivity來打開應(yīng)用的,1.5我們則用到了StartActivityForResult
大家一看方法名就很明白了..這個(gè)是打開應(yīng)用之后,應(yīng)用會(huì)給你返回值的打開方式.
那么,我們?nèi)绾潍@得返回值呢?,其實(shí)前面一篇已經(jīng)提到過了..我們的OnActivityResult方法,就是獲取返回值的.
所以我們編寫代碼如下:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { //base.OnActivityResult(requestCode, resultCode, data); //如果當(dāng)初的發(fā)的requestCode =1 if (requestCode == 1 && resultCode == Result.Ok) { webView.LoadUrl(data.GetStringExtra("code")); Toast.MakeText(this, "掃描結(jié)果:" + data.GetStringExtra("code"), ToastLength.Short).Show(); } if(requestCode == 11 && resultCode == Result.Ok) { //獲得返回值 Android.Net.Uri uri = data.Data; //轉(zhuǎn)換返回值,得到文件地址 var sdCardPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath; var filePath = System.IO.Path.Combine(sdCardPath, data.DataString); ContentResolver resolver = this.ContentResolver; string[] pojo = { MediaStore.Images.Media.InterfaceConsts.Data }; var cursor = this.ContentResolver.Query(uri, pojo, null, null, null); int column_index = cursor.GetColumnIndex(MediaStore.Images.Media.InterfaceConsts.Data); cursor.MoveToFirst(); var path = cursor.GetString(column_index); //通過文件地址獲得文件流 FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read); BinaryReader r = new BinaryReader(fs); r.BaseStream.Seek(0, SeekOrigin.Begin); //將文件指針設(shè)置到文件開 byte[] pReadByte = r.ReadBytes((int)r.BaseStream.Length); ShowMessage("讀取到文件,字節(jié)長度:" + pReadByte.Length); } }
獲取照片的步驟分為3步.
1.獲取返回的值.(這是一個(gè)路徑,但是不能直接拿來用)
2.將返回值轉(zhuǎn)換成我們想要的文件路徑(重點(diǎn)~直接復(fù)制我代碼就好了..)
3.通過文件流讀取文件,并得到字節(jié)(和.NET的IO操作一模一樣)
這樣,我們就完成了整個(gè)讀取照片的過程..
3.學(xué)會(huì)被調(diào)用(嗯..就是讓別人調(diào)用你..)..
嗯..這里也許會(huì)比較難理解..
我們舉個(gè)栗子,大家都用windows系統(tǒng), 壓縮包肯定都知道..那打開壓縮包..其實(shí)有很多軟件.. rar zip 7z什么的..我們有的時(shí)候安裝多了..就會(huì)要選擇一個(gè)默認(rèn)的軟件打開..
安卓里面也是一樣,比如你碰到一個(gè)txt文件,你的APP不支持打開..那么就要選擇一個(gè)第三方的打開,正好你寫的APP是可以打開TXT的..所以 你要告訴別人,我可以打開..選我,.選我..
類似這樣 - - ,不知道講清楚沒有..
我們上代碼吧..
我們首先新建一個(gè)APP項(xiàng)目如下:
然后在MainActivity編寫意圖過濾特性,如下:
這里兩個(gè)屬性的意思是:Intent.ActionSend當(dāng)用戶的意圖是發(fā)送操作的時(shí)候,類別設(shè)置為默認(rèn)
這樣我們就稍微過濾了一下意圖..
然后,我們把這個(gè)APP部署在模擬器上,如圖:
然后我們編寫原來的點(diǎn)擊事件,來調(diào)用這個(gè)APP,代碼如下:
// 打開發(fā)送屬性的應(yīng)用 var ite = new Intent(Intent.ActionSend); ite.PutExtra(Intent.ExtraText, "發(fā)送數(shù)據(jù):XXXXX"); StartActivity(Intent.CreateChooser(ite, "選擇應(yīng)用程序"));
我們點(diǎn)擊按鈕,就會(huì)調(diào)用到APP3,如圖:
上圖中,我的APP3已經(jīng)獲取到WebApp測(cè)試發(fā)過來的數(shù)據(jù).,所以下面,我們講如何得到其他應(yīng)用發(fā)過來的數(shù)據(jù):
App3中的代碼如下:
if (Intent.ActionSend == action) { //得到發(fā)過來的數(shù)據(jù) var sendtext = this.Intent.Extras.GetString(Intent.ExtraText); //彈出顯示 Toast.MakeText(this, sendtext, ToastLength.Long).Show(); //顯示到文本控件 var textview = FindViewById<TextView>(Resource.Id.textView1); textview.Text = sendtext; }
好了,至此,我們整個(gè)C#開發(fā)移動(dòng)應(yīng)用系列就結(jié)束了..謝謝大家的支持
最后說一句
其實(shí),幾篇博文下來,大家可以發(fā)現(xiàn),我們的Xamarin已經(jīng)是相當(dāng)?shù)某墒炝?.代碼也沒什么難度,無非就是多理解一種新應(yīng)用的跳轉(zhuǎn),打開和相關(guān)概念..
嗯..本系列到此結(jié)束..下面開始研究Asp.net core了..
作者:顧振印 出處:http://www.cnblogs.com/GuZhenYin/ 如果您覺得閱讀本文對(duì)您有幫助,請(qǐng)點(diǎn)一下“推薦”按鈕,您的“推薦”將是我最大的寫作動(dòng)力!本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面
http://www.cnblogs.com/GuZhenYin/p/7127529.html