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

来源:互联网 发布:高清网络硬盘播放器 编辑:程序博客网 时间:2024/05/21 09:07

第一章:构建内容共享的应用(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 hereimageUris.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
原创粉丝点击