跟Google学习Android开发-起始篇-共享内容(1)

来源:互联网 发布:火星时代怎么样 知乎 编辑:程序博客网 时间:2024/04/30 08:08

共享内容


Android应用程序的其中一个伟大之处是它们相互通信与集成的能力。当某个功能并不是您的应用程序的核心,且它已经在其他应用程序中存在时,为什么要重新发明它呢?

本课程涵盖了使用Intent APIActionProvider对象在应用程序之间发送和接收内容的一些常见的方式。


课程


将内容发送到其他应用程序

了解如何设置你的应用程序能够使用意图发送文本和二进制数据到其他应用程序

接收来自其他应用程序的内容

了解如何设置您的应用程序能够接收文本和二进制数据从意图

添加一个简单的分享操作

了解如何添加一个分享的操作项你的操作栏

 

7.1 将内容发送到其他应用程序


当你构建一个意图时,你必须指定你想意图触发的操作。Android定义了一些操作,其中包括ACTION_SEND,你大概可以猜到,它表明意图是把数据从一个活动发送到另一个,甚至跨进程边界。将数据发送到另一个活动,所有你需要做的就是,指定数据及其类型,系统将识别出兼容的接收活动,并把它们显示给用户(如果有多个选项),或立即启动活动(如果只有一个选项)。同样,你可以在你的mainfest文件中指定你的活动从其他应用程序能接收的数据类型。

通过意图在应用程序之间发送和接收数据的最常用于社交分享内容。意图允许用户使用他们最喜爱的应用程序快速简单地分享信息,。

注:添加一个分享操作项目到ActionBar的最好办法是使用ShareActionProvider,成为可在API级别14ShareActionProvider添加一个简单的分享操作的课程中讨论。


发送文本内容



1手机中ACTION_SEND意图选择器的截图。

ACTION_SEND 操作最直接和常见的用途是把文本内容从一个活动发送到另一个。例如,内置的浏览器应用程序可以把当前显示的页面的URL作为文字用任何应用程序分享。这对于通过电子邮件或社交网络与朋友分享一篇文章或网站是非常有用的。以下是以实现这种类型共享的代码:

Intent sendIntent = new Intent();sendIntent.setAction(Intent.ACTION_SEND);sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");sendIntent.setType("text/plain");startActivity(sendIntent);
 

如果有一个安装的应用程序用过滤器(filter)匹配ACTION_SENDMIME类型text / plainAndroid系统将运行它;如果有一个以上的应用程序匹配,系​​统会显示一个消歧(disambiguation)对话框(一个选择器),允许用户选择其中一个应用程序。如果你调用意图的Intent.createChooser()Android始终显示选择器。这样做有以下优势:

·      即使用户为意图选择了默认操作选择器将仍然可以显示

·      如果没有应用程序匹配Android会显示一条系统消息

·      您可以指定选择器对话框的标题


下面是更新后的代码:

Intent sendIntent=newIntent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT,"This is my text to send.");
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));


结果对话框如图1所示。


可选地,您可以对意图设置一些标准的附加信息(extras)EXTRA_EMAILEXTRA_CCEXTRA_BCCEXTRA_SUBJECT。但是,如果接收的应用程序并没有设计成使用它们,则什么都不会发生。您也可以使用自定义的附加信息,除非接收应用程序能理解,否则也没有任何效果。通常情况下,你会使用由接收应用程序本身所定义的自定义额外信息。

注:某些电子邮件应用程序,如Gmail,期望 String []作为额外信息,比如EXTRA_EMAILEXTRA_CC,可通过 putExtra(String, String[])添加它们到你的意图。


发送二进制内容


要使用ACTION_SEND操作共享二进制数据,要设置适当的MIME类型,并把数据的URI放在一个名为EXTRA_STREAM附加信息中 。这通常是用来共享一个图像,但也可以用来共享任何类型的二进制内容:

Intent shareIntent = new Intent();shareIntent.setAction(Intent.ACTION_SEND);shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);shareIntent.setType("image/jpeg");startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

请注意以下几点:

·      您可以使用MIME的类型为“*/*” 但这只会匹配能够处理一般的数据流的活动,。

·      接收应用程序需要权限访问URI指向的数据有很多方法来处理这个

o   把数据写入到所有的应用程序可以读取的外部/共享存储SD的一个文件上使用Uri.fromFile()来创建可以传递到共享意图的Uri但是请记住并不是所有的应用程序处理file://样式的Uri

o   MODE_WORLD_READABLE模式下使用openFileOutput()把数据写入到你自己的应用程序目录下的一个文件中然后用getFileStreamPath()返回一个File使用之前的选项Uri.fromFile()将为你的共享意图创建一个file://样式的Uri

o   可以使用scanFile()扫描图像视频和音频等媒体文件并添加到系统MediaStoreonScanCompleted()回调方法返回content://样式的Uri适用于包含在你的共享意图中

o   使用insertImage()可以把图像插入到系统MediaStore中,它将返回content://样式的Uri适用于包含在你的共享意图中

o   存储数据到你自己的ContentProvider确保其他应用程序有正确的权限访问您的provider或使用per-URI权限


发送多条内容


要分享多条内容,对指向内容的URI列表使用ACTION_SEND_MULTIPLE 操作MIME类型根据你要分享的混合内容而定。例如,如果你要分享3JPEG图像,类型仍是“image/jpeg”。对于混合的图像类型,它应该是用“image/*”匹配一个处理任何类型图像的活动。您应该只使用“*/*”如果你分享了各种各样的类型。如前所述,轮到要接收的应用程序来解析和处理您的数据。下面是一个例子:

ArrayList<Uri> imageUris=newArrayList<Uri>();
imageUris.add(imageUri1);// Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent,"Shareimages to.."));

像之前一样,确保所提供的URI指向接收应用程序能够访问的数据。

原创粉丝点击