Android应用开发之(数据共享)

Android Developer:

在Android应用开发中,我们会专注于应用本身的功能开发,像拍照,发送短信等功能系统已经提供,当应用中需要这些功能时,我们大可不必重复造车,通过Android数据共享接口可以很方便的使用这些功能;

下面给大家介绍一些应用程序之间通过IntentAPI 和ActionProvider对象实现数据共享的常用方法。

当构造一个Intent的时候,需要指定该Intent需要触发的动作。Android系统定义了一些常用的动作,例如ACTION_SEND— 顾名思义是用来在Activity之间发送数据的动作,也可以跨进程发送数据。要给其他程序发送数据,您只需要设置数据类型和数据内容即可,系统会检测可以接收数据的Activity并显示给用户(如果有多个可接收数据的Activity)或者直接显示接收数据的Activity(当只有一个Activity的时候)。同样,您也可以在Manifest文件中设置您的Activity可以接收的数据类型。

 

通过Intent在程序直接发送和接收数据通常用于分享社交内容。Intent可以让用户更快更容易的使用他们喜欢的程序来分享数据。

注意:ActionBar添加分享操作的最好方式是使用ShareActionProvider,该接口在 API level 14+系统中可用。 在添加一个简单的分享操作课程中会介绍ShareActionProvider

发送文本数据

使用ACTION_SEND通常用来在Activity之间发送文本数据。例如,Android系统内置的浏览器程序可以把当前页面的URL地址作为文本分享给其他程序。这对于通过Email或者社交程序来分享文章或者网站是非常有用的。下面是实现这种分享的示例代码:

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

如果系统只有一个能接受ACTION_SEND动作和 MIME 类型为 text/plain的程序,系统就直接运行该程序;如果有多个程序则会显示一个对话框让用户选择使用那个程序。如果您 使用一个Intent调用Intent.createChooser()函数,Android总会显示这个选择对话框。这样有几个好处:

  • 即使用户对这个动作已经设置了默认程序,调用createChooser函数仍然会显示这个选择对话框

  • 如果没有匹配的程序,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(<strong>Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)</strong>);

下图显示了打开的对话框截图。


 

另外您也可以在Intent中设置一些标准的附加信息:EXTRA_EMAILEXTRA_CCEXTRA_BCCEXTRA_SUBJECT。如果接收数据的程序不使用这些附加数据是没有任何影响的。您当然也可以使用自定义的附加数据,不过如果接收数据的程序不理解这些数据 ,那么这些附加数据就没用了。一般情况下您会使用接收数据程序定义的自定义附加数据。

注意:有些 e-mail 程序 — 例如Gmail — 需要一个String[]类型的附加数据,例如EXTRA_EMAIL
EXTRA_CC。使用putExtra(String, String[])函数来添加这种类型的附加数据。

发送二进制数据

一般通过使用ACTION_SEND动作和对应的MIME类型以及在名称为EXTRA_STREAM字段中提供的URI来分享二进制数据。通常用来分享图片,当然您也可以用来分享其他类型数据:

Intent shareIntent =newIntent();
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类型为 "*/*"只会匹配能处理通用数据流的Activity

  • 接收数据的程序需要能访问Uri指定类型数据的权限。有很多方法来处理这个问题:

    • 把数据写到外部存储卡或者共享存储中,这样所有的程序就可以读取数据了。使用Uri.fromFile()来创建一个Uri,然后把这个Uri设置到Intent中。不过要注意并不是所有的程序都能处理file:// 协议的Uri

    • 使用openFileOutput()— mode参数为MODE_WORLD_READABLE来保存数据到您程序的数据目录下;通过getFileStreamPath()可以返回一个File。和前面描述的一样,Uri.fromFile()会创建一个 file:// 类型的Uri数据。

    • 多媒体文件 例如图片、视频和音频文件可以被系统扫描并(使用scanFile()函数)且添加到MediaStore中。onScanCompleted()回调函数会返回一个 content:// 类型的Uri,可以添加到Intent中。

    • 使用insertImage()函数可以把图片添加到系统的MediaStore中,同样会返回一个content:// 类型的Uri

    • 把数据保存到您程序的ContentProvider中,访问您数据的程序需要使用您的权限 (或者使用href="http://developer.android.com/guide/topics/security/security.html#uri">预定义好的URI权限)。

     

发送多块数据

要分享多块数据可以使用ACTION_SEND_MULTIPLE动作和一些要分享数据的 URI。MIME类型为各种数据的类型。例如,如果您分享3张JPEG图片,可以设置类型为"image/jpeg";如果是类型不同的图片,需要设置类型为"image/*"–来匹配可以处理任何图片格式的Activity。只有当你分享很多种类型的数据的时候,您才可以选择使用"*/*"作为MIME类型。就像上面描述的一样,这样让接受程序来决定如何处理收到的数据。 下面是一个示例:

ArrayList<Uri> imageUris =newArrayList<Uri>();
imageUris.add(imageUri1);// Add your image URIs here
imageUris.add(imageUri2);
 
Intent shareIntent =newIntent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent,"Share images to.."));

确保接收数据的程序能访问URIs指定的数据。