项目使用过程中难免会遇到分享功能的集成问题,系统自带功能足以满足大部分的简单需求,无需集成而增加apk包体,分享一篇文章,写的还不错,所以转载了。
原文http://blog.csdn.net/oudetu/article/details/78443826
下面是搬过来的内容》》
Android系统为我们提供了分享功能,只需要向startActivity传递一个Action为ACTION_SEND的Intent,系统会自动弹出一个应用程序列表,可以理解为从当前Activity跨越进程,发送数据到另一个Activity, 我们只需要指定数据以及类型,接受方会自动识别,并启动相应的Activity。
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain"); //分享的是文本类型
shareIntent.putExtra(Intent.EXTRA_TEXT, "文本内容");//分享出去的内容
startActivity(shareIntent); //注意这里的变化
//startActivity(Intent.createChooser(shareIntent, "对话框标题"));
假如你安装了过滤Action为ACTION_SEND,MIMEtype为“text/plain”的应用程序,这个系统就会启动,假如系统匹配到多个这样子的应用程序,他就会弹出一个Dialog列出所有的应用供用户选择(一个选择器),如下图所示。
但是这样写有一个问题,当我们的手机里面没有这种类型的应用程序,你执行startActivity方法,你的程序就会出现报错,所以我们需要先判断下系统是否有这类型的应用程序,代码如下:
public boolean hasApplication(Intent intent){
PackageManager packageManager = getPackageManager();
//查询是否有该Intent的Activity
List activities = packageManager.queryIntentActivities(intent, 0);
//activities里面不为空就有,否则就没有
return activities.size() > 0 ? true : false;
但是每次判断会觉得很烦?所以我们也可以使用Intent的Intent.createChooser方法
他有如下优点
1. 即使用户选择了默认的方式,选择器仍然会弹出来
2. 如果没有匹配到这样的应用程序,系统就会提示消息
3. 你可以指定选择器Dialog的标题
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, "文本内容");//分享出去的内容
startActivity(Intent.createChooser(shareIntent, "对话框标题"));
// startActivity(shareIntent); //注意这里的变化
效果如图:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*"); //设置MIME类型
intent.putExtra(Intent.EXTRA_STREAM, uri); //需要分享的文件URI
startActivity(Intent.createChooser(intent, "对话框标题"));
你可以使用MIME type为“* / *” ,他只会匹配处理一般数据流的Activity
MIME:多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。(摘自百度百科)
接收应用程序需要Uri指定数据的访问权限
//分享一张图片
private void shareImg(String dlgTitle, Uri uri) {
if (uri == null) {
return;
}
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, uri);
// 设置弹出框标题
startActivity(Intent.createChooser(intent, dlgTitle));
}
图
//分享多张图片
private void shareMultiImg(String dlgTitle, Uri uri) {
if (uri == null) {
return;
}
ArrayList imageUris = new ArrayList<>();
imageUris.add(uri);
imageUris.add(uri);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
startActivity(Intent.createChooser(shareIntent, dlgTitle));
}
在7.0以上系统的手机上,Android框架执行的StrictMode API政策禁止在应用外部公开file//URI;传递file://URI会报出FileUriExposedException异常。如果要在应用间共享文件,应发送一项content//URI,最简单的方式就是使用FileProvider类。下面我列出几个常用的MIME type类型
text/plain(纯文本)
text/html(HTML文档)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)【PHP中为:image/pjpeg】
image/png(PNG图像)【PHP中为:image/x-png】
video/mpeg(MPEG动画)
application/octet-stream(任意的二进制数据)
application/pdf(PDF文档)
application/msword(Microsoft Word文件)
message/rfc822(RFC 822形式)
multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)
配合 Intent.addFlags() 授权。 setFlags() == addflags()
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
示例代码:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
Uri data;
// 判断版本大于等于7.0
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
data = FileProvider.getUriForFile(context,"com.example.demo.fileprovider", file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
data = Uri.fromFile(file);
}
常见使用场景
1,自动安装文件
2,调用系统相机拍照
3,调用系统裁剪