Android Developers -- Building Apps With Content Sharing(第一章)

第一章:构建内容共享的应用(Building Apps With Content Sharing)

参考官方文档:http://developer.android.com/training/sharing/send.html

章节目录:

                                                        

第一节:共享简单数据(Sharing Simple Data)  有Intent 和 IntentFileter基础

1.向其他应用发送简单的数据(文本、二进制、多片段) Sending Simple Data to Other Apps(Text、Binary and Multiple Pieces of Content)

当构造了一个Intent,必须为其指定一个让这个Intent触发的Action。Android已经为Intent定义了一些Action,其中就包括ACTION_SEND(表示Intent可以将数据从一个activity发送到其他的activity,甚至还可以跨进程发送),而所要做的紧紧是指定data和该数据的type系统则会根据这些描述兼容性地鉴定出可接受的activities并把它们呈现给用户,如果只有一个activity,则会立即启动activity(start activity),同样地,可以在manifest文件中通过IntentFilter指定自己应用程序的所有activity能处理的数据类型,如此公布来接收和处理来自其他应用程序的Intent请求。

注意:最佳实践方式是通过使用ShareActionProvider向ActionBar添加一个share action item(在API 14以上才可用).

        1.1 发送文本内容 (Send Text Content)

最直接通用的方式是通过使用ACTION_SENDaction 从一个activity发送文本内容(Text Content)数据到其他activity.

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_SEND和  MIME type text/plain,Android 系统则会运行它。如果有多个应用匹配到了,系统则会呈现一个选择对话框让用户选择一个应用。

但是,如果调用 Intent.createChooser(), 那么总是会显示一个选择器(chooser),这样使用有一些优点:

1)即使用户之前为这个Intent选择了一个默认的action,该选择器(chooser)依然会显示

2)如果没有匹配到应用,Android系统会显示一个系统消息(message)

3)   你可以为选择器对话框(chooser dialog)指定一个标题

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(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));
1.2  发送二进制数据(Send Binary Content)

共享二进制数据是通过使用ACTION_SEND和设置适当的MIME type以及在一个名为EXTRA_STREAM的属性中放置一个指向数据的URI。这通常用于共享图片数据,当然也可以共享任意的二进制数据。

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)));
注意以下几点:

1)你可以使用*/*的MIME类型,但是这将只能匹配到那些能处理通用数据流(generic data streams)的activities。

2)接受的应用需要有访问指向数据URI的权限,推荐使用如下方式:

① 在你自己的ContentProvider中存储数据,并确保其他应用有正确的访问你的Provider的权限。这首选机制是使用per-URI permissions(这是临时地而且只为接受的应用授予访问权限)来提供访问权限。一个简单的方式是使用FileProvider 辅助类(helper classes) 来创建一个这样的ContentProvider。
② 使用系统媒体存储MediaStore.  这MediaStore 旨在存储video(视频)、audeo(音频)以及Image(图片) MIME 类型数据,Android 3.0(API 11) 开始可以存储非媒体类型数据

注意一旦插入到系统MediaStore中的内容(content)能被设备上任何应用所访问。

1.3 发送多块内容(Send Multiple Pieces of Content)

使用ACTION_SEND_MUILTIPLEaction以及一个指向内容的 URIs 列表。MIME 类型则根据混合的内容进行变化。比如要共享3张jpg 图片,MIME 类型依然是“image/jpg

,如果有多重混合的图片类型,则类型是“ image/* ” 以匹配一个能处理任意图片类型的activity。如果你要共享各种各样的类型,仅需使用 “*/*” 。按照之前的阐述,由接受的应用自行决定解析和处理你的数据。

ArrayList<Uri> imageUris = new ArrayList<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, "Share images to.."));
之前一样,确保那些指向数据的URIs 可以被接受的应用所访问。

As before, make sure the provided URIs point to data that a receiving application can access.

未完待续。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值