对于某些应用,需要为其添加一个“分享”功能菜单,如通过Email或蓝牙分享给别人。
此时可以直接调用系统内置的服务,而不需要自己实现。
且看测试程序截图(将一指定文件通过蓝牙或Email分享给别人):

布局main.xml就一个button,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:text="Test Email"
android:id="@+id/btnEmail"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
然后就是程序代码EmailTest.java:
package com.ucrobotics.emailtest;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class EmailTest extends Activity {
private Button btnEmail = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnEmail = (Button) this.findViewById(R.id.btnEmail);
btnEmail.setOnClickListener(new ClickEvent());
}
class ClickEvent implements View.OnClickListener {
public void onClick(View v) {
Intent it = new Intent(Intent.ACTION_SEND);
//it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
//it.putExtra(Intent.EXTRA_STREAM, "[url=]file:///sdcard/sprt.txt[/url]");
it.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + "/sdcard/test.jpg"));
//it.setType("plain/text");
it.setType("text/html");
startActivity(Intent.createChooser(it, "选择分享方式"));
}
}
}
主要就是调用系统的Intent.ACTION_SEND服务。虽然设置的是"text/html"类型,但发送文件或是图片都是可以的。然后选择不同的客户端就会调用各自的服务进行文件发送操作。
关于选取不同的intent和type会有如下测试结论:
Intent.ACTION_SEND + plain/text ---> 列表里仅有Gmail和系统默认Email两个客户端
Intent.ACTION_SEND + text/html ---> 除了两个email客户端,还有蓝牙客户端
Intent.ACTION_SEND_MULTIPLE + * ---> 此时会显示两个email客户端和短信服务
Intent.ACTION_SENDTO + * ---> 没有应用显示
由于都是调用系统自带的服务,所以无需在manifest.xml里添加权限之类的设置及<activity>声明!
================
还有其它相关的Intent调用:(未测试)
1,调web浏览器
uri mybloguri = uri.parse("kuikui.javaeye.com");
returnit = new intent(intent.action_view, mybloguri);
2,地图
uri mapuri = uri.parse("geo:38.899533,-77.036476");
returnit = new intent(intent.action_view, mapuri);
3,调拨打电话界面
uri teluri = uri.parse("tel:100861");
returnit = new intent(intent.action_dial, teluri);
4,直接拨打电话
uri calluri = uri.parse("tel:100861");
returnit = new intent(intent.action_call, calluri);
5,卸载
uri uninstalluri = uri.fromparts("package", "xxx", null);
returnit = new intent(intent.action_delete, uninstalluri);
6,安装
uri installuri = uri.fromparts("package", "xxx", null);
returnit = new intent(intent.action_package_added, installuri);
7,播放
uri playuri = uri.parse("file:///sdcard/download/everything.mp3");
returnit = new intent(intent.action_view, playuri);
8,调用发邮件
uri emailuri = uri.parse("mailto:shenrenkui@gmail.com");
returnit = new intent(intent.action_sendto, emailuri);
9,发邮件
returnit = new intent(intent.action_send);
string[] tos = { "shenrenkui@gmail.com" };
string[] ccs = { "shenrenkui@gmail.com" };
returnit.putextra(intent.extra_email, tos);
returnit.putextra(intent.extra_cc, ccs);
returnit.putextra(intent.extra_text, "body");
returnit.putextra(intent.extra_subject, "subject");
returnit.settype("message/rfc882");
intent.createchooser(returnit, "choose email client");
10,发短信
uri smsuri = uri.parse("tel:100861");
returnit = new intent(intent.action_view, smsuri);
returnit.putextra("sms_body", "shenrenkui");
returnit.settype("vnd.android-dir/mms-sms");
还可以参见这里:apps.hi.baidu.com/share/detail/33356980
测试发现,如果将上面的:
it.setType("text/html");
改成:
it.setType("text/plain");
就会出现更多的应用选择,如新浪微博,彩信等等。
但因为测试的是.txt文本文件,微博提示说无法识别的格式。
但如果将前面的 Intent.EXTRA_STREAM 改成 Intent.EXTRA_TEXT,则邮件客户端选中后没附件了,蓝牙分享也工作的不正常。