您的位置:首页 > 大数据 > 人工智能

Develop -- Training(九) -- 分享简单数据

2016-02-23 23:58 351 查看

发送简单的数据给其他应用程序

发送文本内容

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);


如果你的设备上安装的应用能够匹配到的行为是 ACTION_SEND 和MIME 类型是 text/plain,Android 系统就会打开这个应用。

如果有多个应用程序匹配它,Android 系​​统会显示一个对话框,让用户去选择想要打开的应用程序。

注意:如果没有任何应用程序可以匹配的话,也就是没有相应的 Intent,你的应用程序就会报错,所以,我们最好加上系统中有没有这个 Intent 的判断。

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)));


如果你调用 Intent.createChooser() 方法,会出现一个显示选择器。

- 即使用户已经选择了默认操作,仍然会显示选择器。

- 如果没有应用程序匹配,Android 会显示一个系统消息。

- 可以指定选择器对话框的标题。

发送二进制内容

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)));


发送二进制数据,需要使用的 Action 为 Intent.ACTION_SEND

携带参数的 URI 数据名称为: Intent.EXTRA_STREAM

如果共享图像数据,MIME 类型为:image/jpeg

如果共享任何类型的数据,MIME 类型为: * / *

发送多件内容

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.."));


发送多个内容,需要使用 Action 为 Intent.ACTION_SEND_MULTIPLE

如果是单个类型的多个数据,如图像类型,MIME 类型为:image/jpeg

如果是图像的类型的混合数据,MIME 类型为:image/*

从其他的应用程序接收简单的数据

更新你的 Manifest

为了接收前面所创建的 intent,我们需要在 Manifest 清单文件中做一些配置操作。 需要在 < activity >元素节点 里添加 intent 过滤器,使用< intent-filter > 。

例如,如果你的应用程序可以处理任何类型的单个图像,接收文本内容,或任何类型的多个图像。

<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>


处理传入的内容

通过 getIntent() 方法得到需要处理的 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
}
}


注意:如果是处理二进制数据的话,需要在子线程中处理,而不是在 UI 线程中。

添加一个简单的分享动作

更新菜单声明

ShareActionProvider:在API等级14及更高版本。



这个就是 ShareActionProvider 的使用效果。

在 res\menu 资源目录下创建一个 menu 的 xml 文件,在< item >里添加 android:actionProviderClass 属性。

<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>


设置分享意图

private ShareActionProvider mShareActionProvider;
...

@Override
public 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 intent
private void setShareIntent(Intent shareIntent) {
if (mShareActionProvider != null) {
mShareActionProvider.setShareIntent(shareIntent);
}
}


通过 MenuItem.getActionProvider() 得到 ShareActionProvider 实例,然后调用 mShareActionProvider.setShareIntent(shareIntent) 发送意图。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: