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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏更流畅、简洁的软件开发方式

基于jQuery的ajax对WebApi和OData的封装我们还是先来看看要求在看看目标:思路封装方式

基于jQuery的ajax对WebApi和OData的封装   WebApi 的使用带来了一个显著的特点,对type有一定的要求。一般ajax的type无非就是...

22010
来自专栏游戏开发那些事

【Unity游戏开发】SDK接入与集成——小白入门篇

  通常一款游戏开发到后期,一般都会涉及到第三方SDK的接入与集成,对于不熟悉SDK接入的同学来说,接SDK每次都是云里雾里,而熟悉SDK接入的同学又觉得不断地...

1132
来自专栏Seebug漏洞平台

利用特殊协议加载本地文件, 绕过 HTML5 沙箱, 打开弹窗诸事

原文链接:https://www.brokenbrowser.com/abusing-of-protocols/ 原作者:Manuel Caballero 译:...

3088
来自专栏Seebug漏洞平台

TCTF/0CTF2018 XSS Writeup

刚刚4月过去的TCTF/0CTF2018一如既往的给了我们惊喜,其中最大的惊喜莫过于多道xss中Bypass CSP的题目,其中有很多应用于现代网站的防御思路。...

793
来自专栏IT开发技术与工作效率

VBA下载

1404
来自专栏ASP.NET MVC5 后台权限管理系统

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查

文章于2016-12-17日重写 在第八讲中,我们已经做到了怎么样分页。这一讲主要讲增删改查。第六讲的代码已经给出,里面包含了增删改,大家可以下载下来看下。 ...

3297
来自专栏一个会写诗的程序员的博客

Kotlin 使用 Spring WebFlux 实现响应式编程 Kotlin 使用 Spring WebFlux 实现响应式编程参考资料

IBM的研究称,整个人类文明所获得的全部数据中,有90%是过去两年内产生的。在此背景下,包括NoSQL,Hadoop, Spark, Storm, Kylin在...

854
来自专栏非著名程序员

Android 图片选择到裁剪之步步深坑

前言 最近在自己的项目里实现了一个头像选择的功能,就是先从相册里选取一张图片再调用系统的裁剪功能来制作头像,效果就像下面这样: ? 本以为很小的一个功能,却远远...

2678
来自专栏酷玩时刻

微信公众号开发之如何一键导出微信所有用户信息到Excel

在getOpenIds(Stirng next_openid) 方法中迭代(一次拉取调用最多拉取10000个关注者的OpenID)获取所有的openId并返回一...

913
来自专栏腾讯IVWEB团队的专栏

web - pwa

该库是应对当前 Google 提出的 PWA 概念而写的,以链式 API 来完成 PWA 相关的操作。本文从安装、DEMO到使用、SW 相近的介绍了 PWA 的...

2071

扫码关注云+社区