Android分享之Intent.ACTION_SEND分享(一)
来源:互联网 发布:无线网限速软件 编辑:程序博客网 时间:2024/06/06 01:00
今天项目需要修改需求,需要用到分享功能。因为只是简单的分享,没必要集成第三方,所以用Intent.ACTION_SEND就足够了。之前只是了解过Intent.ACTION_SEND而并没有使用过。趁着今天使用的机会做一下记录。
声明:本文基于本人手机Android5.1编辑,如遇7.0及以上出现 FileUriExposedException 错误,请及时做适配,可以参考本人之前博客 传送门–>
概述
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<ResolveInfo> 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); //注意这里的变化
效果如图:
- 发送二进制内容
二进制内容的共享使用Action为ACTION_SEND,在设置适当的MIME类型,并且添加putExtra(Intent.EXTRA_STREAM, URI),下面是一个常用的共享图片的代码,也可以共享任何类型的二进制内容
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指定数据的访问权限
- 在SD卡的文件,我们使用File file = new File(filePath); Uri.fromFile(file),然后把他传递给Intent
- 在应用程序的目录中,openFileOutput的模式为MODE_WORLD_READABLE,然后我们可以使用getFileStreamPath()返回一个File,然后利用Uri.fromFile(file)传递给Intent
- 可以扫描图像,视频和音频等媒体文件,添加到系统MediaStore使用SCANFILE()来扫描文件,扫描完成后会调用 onScanCompleted()回调方法来返回一个Uri
- 图片使用insertImage()方法插入到系统MediaStore也会返回一个图片的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<Uri> 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)); }
下面我列出几个常用的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(同上,但主要用于表单提交时伴随文件上传的场合)
- Android分享之Intent.ACTION_SEND分享(一)
- Android分享之Intent.ACTION_SEND分享(二)
- Intent.ACTION_SEND分享程序过滤
- 用Intent.ACTION_SEND进行分享
- 利用Intent.ACTION_SEND进行分享
- 利用Intent.ACTION_SEND进行分享
- 利用Intent.ACTION_SEND进行分享
- android利用Intent.ACTION_SEND实现简单分享功能
- 完美实现同时分享图片和文字(Intent.ACTION_SEND)
- 完美实现同时分享图片和文字(Intent.ACTION_SEND)
- 完美实现同时分享图片和文字(Intent.ACTION_SEND)
- Android:新浪微博拉起客户端分享——完美实现同时分享图片和文字(Intent.ACTION_SEND)
- Android 自定义分享列表ACTION_SEND
- Android 自定义分享列表ACTION_SEND
- Android 自定义分享列表ACTION_SEND
- android 使用Intent.ACTION_SEND分享图片和文字内容(新浪微博,短信等)
- 使用Intent.ACTION_SEND分享图片和文字内容(新浪微博,短信等)
- Android 利用Intent实现分享
- 在android开发板上测试neon加速实验
- I Hate It (线段树点更新)
- org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException
- Linux 命令大全
- 机器学习PRML--第一章学习问题总结
- Android分享之Intent.ACTION_SEND分享(一)
- 修改并显示inp文件内容
- 201711月04日普及组 Array
- linux之chown, chgrp, chmod命令
- JAVA的静态代理与动态代理比较
- 意甲的一些历史
- 本地调用腾讯地图
- 组合控件,点击接口回调到阶梯矩阵页面,点击按钮进度条100%到扫描二维码页面,
- NOIP2017模拟 轰炸 强连通分量