官网地址
http://developer.android.com/training/building-content-sharing.html
?
看看左边的目录,前面9篇文章完成了官网的Getting Started系列的内容。
(革命尚未成功,同志仍需努力)
现在继续往下看。
这篇文章学习,如何在两个apps和设备(devices)之间分享数据。
?
一、分享简单的数据
这个简单,上篇文章就写到通过Intent分享数据。
1.1 发送简单的数据给其它的apps
1.1.1 文本类型的数据
?
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);
?如果有多个Activity可以处理ACTION_SEND和类型是text/plain的情况下,系统会弹出一个app的选择框。
?
我们可以通过Intent.createChosser()的方法来让系统总是显示选择框。
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) 即使用户之前选择了默认的Action来处理这个Intent,选择框仍然会出现。
2) 如果没有可以匹配的,可以给出系统消息。
3) 可以为你的选择框设置一个标题。
?
1.1.2 分享二进制内容的数据
比如说一张图片
?
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.1.3 ?分享多份数据
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.."));
?例子很简单,我们用到的了一个数组来存放多份数据而已。
?
?
1.2 从其他apps接收简单数据
内容和上一节有很多重复的地方。简单成列下了。
1.2.1 修改你的Manifest
告诉你的Activity可以处理那些类型的Intent
?
<activity android:name=".ui.MyActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter></activity>
?1.2.2 处理过滤过来的Intent
void onCreate (Bundle savedInstanceState) { ... // Get intent, action and MIME type Intent intent = getIntent(); String action = intent.getAction(); String type = intent.getType(); if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // Handle text being sent } else if (type.startsWith("image/")) { handleSendImage(intent); // Handle single image being sent } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // Handle multiple images being sent } } else { // Handle other intents, such as being started from the home screen } ...}void handleSendText(Intent intent) { String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); if (sharedText != null) { // Update UI to reflect text being shared }}void handleSendImage(Intent intent) { Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); if (imageUri != null) { // Update UI to reflect image being shared }}void handleSendMultipleImages(Intent intent) { ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); if (imageUris != null) { // Update UI to reflect multiple images being shared }}
?代码完全的从官网拷贝过来的,从Intent得到动作(Action)和类型,然后根据不同的情况分别处理。
?
?
1.3 添加一个简单的分享动作(adding an easy share action)
可以在ActionBar上加上一个键分享的功能。当然也是基于Intent的,只是方式不一样而已。
1.3.1 更改Menu Declarations
比如修改如下menu的资源文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_item_share" android:showAsAction="ifRoom" android:title="Share" android:actionProviderClass= "android.widget.ShareActionProvider" /> ...</menu>
?重要的是最后项,actionProviderClass.
1.3.2 设置Share Intent
private ShareActionProvider mShareActionProvider;...@Overridepublic boolean onCreateOptionsMenu(Menu menu) { // Inflate menu resource file. getMenuInflater().inflate(R.menu.share_menu, menu); // Locate MenuItem with ShareActionProvider MenuItem item = menu.findItem(R.id.menu_item_share); // Fetch and store ShareActionProvider mShareActionProvider = (ShareActionProvider) item.getActionProvider(); // Return true to display menu return true;}// Call to update the share intentprivate void setShareIntent(Intent shareIntent) { if (mShareActionProvider != null) { mShareActionProvider.setShareIntent(shareIntent); }}
?//TODO 说实话这个还没有调通,打个标记先。
?