当前位置: 代码迷 >> Android >> 上官网学android之9(Building Apps with Content Sharing)
  详细解决方案

上官网学android之9(Building Apps with Content Sharing)

热度:213   发布时间:2016-04-28 06:35:46.0
上官网学android之九(Building Apps with Content Sharing)

官网地址

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 说实话这个还没有调通,打个标记先。

?

  相关解决方案