上篇文章地址:
C#開發移動應用系列(2.使用WebView搭建WebApp應用)
C#開發移動應用系列(3.使用照相機掃描二維碼+各種基礎知識)
寫完這篇..本系列基本也就結束了.
看完這些,基本做個Webapp應該是毫無問題的了..其實略微有點傷感,Xamarin確實是好東西..
奈何,生不逢時..等完善了. 開源了..社區化了..APP應用(指的是安裝包類客戶端)已經逐漸沒落了..
算了,話不多說.開始正文
確定一下本篇的學習目標:
1.學會調用各類系統應用
2.學會調用相冊並取得選擇的照片
3.學會被調用(嗯..就是讓別人調用你..)..
效果圖:
1.學會調用各類系統應用
我們都知道,安卓有很多系統自帶的應用..比如,打電話.發短信,相冊,地圖.Email.等等..
今天我們就來一個個的調用,並傳值.
首先我們還是添加一個按鈕,來測試調用第三方的應用.
如圖:
然后,我們編寫這個按鈕的點擊事件:
protected override void OnCreate(Bundle bundle) { //獲取按鈕 var btn3 = FindViewById<Button>(Resource.Id.button3); //添加點擊事件 btn3.Click += delegate { //do... } }
准備工作搞定,我們來編寫相關調用代碼,來調用系統應用
1.1調用電話
Android.Net.Uri uri = Android.Net.Uri.Parse("tel:18678445447");
Intent it = new Intent(Intent.ActionDial, uri); StartActivity(it);
代碼很簡單..就三句話.. tel后面調用你想撥打的電話.
1.2調用短信
// 發送短信 Android.Net.Uri uri = Android.Net.Uri.Parse("smsto:10010"); Intent it = new Intent(Intent.ActionSendto, uri); it.PutExtra("sms_body", "你妹妹,我沒欠費 你給我停機!"); StartActivity(it);
嗯..你妹妹是你要發的短信.. smsto后面是你要發送給誰..
1.3調用地圖
Android.Net.Uri uri = Android.Net.Uri.Parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.ActionView, uri); StartActivity(it);
geo后面給坐標
1.4調用Email
Android.Net.Uri uri = Android.Net.Uri.Parse("mailto:777@qq.com?cc=aa@qq.com&subject=標題&body=內容"); var intent = new Intent(Intent.ActionView,uri); StartActivity(intent);
1.5調用通訊錄
//第一種(建議使用第一種) 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.(暫時就這些..沒了 哈哈哈)
我們進入下個環節..
2.學會調用相冊並取得選擇的照片
同樣,我們在點擊事件中,修改代碼如下:
Intent i = new Intent(); i.SetType("image/*"); i.SetAction(Intent.ActionPick); StartActivityForResult(i,11);
細心的朋友已經發現了..在1.4之前我們最后一句,都是StartActivity來打開應用的,1.5我們則用到了StartActivityForResult
大家一看方法名就很明白了..這個是打開應用之后,應用會給你返回值的打開方式.
那么,我們如何獲得返回值呢?,其實前面一篇已經提到過了..我們的OnActivityResult方法,就是獲取返回值的.
所以我們編寫代碼如下:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { //base.OnActivityResult(requestCode, resultCode, data); //如果當初的發的requestCode =1 if (requestCode == 1 && resultCode == Result.Ok) { webView.LoadUrl(data.GetStringExtra("code")); Toast.MakeText(this, "掃描結果:" + data.GetStringExtra("code"), ToastLength.Short).Show(); } if(requestCode == 11 && resultCode == Result.Ok) { //獲得返回值 Android.Net.Uri uri = data.Data; //轉換返回值,得到文件地址 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); //將文件指針設置到文件開 byte[] pReadByte = r.ReadBytes((int)r.BaseStream.Length); ShowMessage("讀取到文件,字節長度:" + pReadByte.Length); } }
獲取照片的步驟分為3步.
1.獲取返回的值.(這是一個路徑,但是不能直接拿來用)
2.將返回值轉換成我們想要的文件路徑(重點~直接復制我代碼就好了..)
3.通過文件流讀取文件,並得到字節(和.NET的IO操作一模一樣)
這樣,我們就完成了整個讀取照片的過程..
3.學會被調用(嗯..就是讓別人調用你..)..
嗯..這里也許會比較難理解..
我們舉個栗子,大家都用windows系統, 壓縮包肯定都知道..那打開壓縮包..其實有很多軟件.. rar zip 7z什么的..我們有的時候安裝多了..就會要選擇一個默認的軟件打開..
安卓里面也是一樣,比如你碰到一個txt文件,你的APP不支持打開..那么就要選擇一個第三方的打開,正好你寫的APP是可以打開TXT的..所以 你要告訴別人,我可以打開..選我,.選我..
類似這樣 - - ,不知道講清楚沒有..
我們上代碼吧..
我們首先新建一個APP項目如下:
然后在MainActivity編寫意圖過濾特性,如下:
這里兩個屬性的意思是:Intent.ActionSend當用戶的意圖是發送操作的時候,類別設置為默認
這樣我們就稍微過濾了一下意圖..
然后,我們把這個APP部署在模擬器上,如圖:
然后我們編寫原來的點擊事件,來調用這個APP,代碼如下:
// 打開發送屬性的應用 var ite = new Intent(Intent.ActionSend); ite.PutExtra(Intent.ExtraText, "發送數據:XXXXX"); StartActivity(Intent.CreateChooser(ite, "選擇應用程序"));
我們點擊按鈕,就會調用到APP3,如圖:
上圖中,我的APP3已經獲取到WebApp測試發過來的數據.,所以下面,我們講如何得到其他應用發過來的數據:
App3中的代碼如下:
if (Intent.ActionSend == action) { //得到發過來的數據 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; }
好了,至此,我們整個C#開發移動應用系列就結束了..謝謝大家的支持
其實,幾篇博文下來,大家可以發現,我們的Xamarin已經是相當的成熟了..代碼也沒什么難度,無非就是多理解一種新應用的跳轉,打開和相關概念..
嗯..本系列到此結束..下面開始研究Asp.net core了..