C#開發移動應用系列(4.調用系統應用,以及第三方應用(調用與被調用))


前言

上篇文章地址:

C#開發移動應用系列(1.環境搭建)

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM