文件分享功能实现

对于某些应用,需要为其添加一个“分享”功能菜单,如通过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,则邮件客户端选中后没附件了,蓝牙分享也工作的不正常。

原文地址:https://www.cnblogs.com/wzc0066/p/2948336.html