zoukankan      html  css  js  c++  java
  • 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了..

  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/GuZhenYin/p/7127529.html
Copyright © 2011-2022 走看看