Android分享之Intent.ACTION_SEND分享(一)

今天项目需要修改需求,需要用到分享功能。因为只是简单的分享,没必要集成第三方,所以用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, "对话框标题"));
  1. 你可以使用MIME type为“* / *” ,他只会匹配处理一般数据流的Activity

    MIME:多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。(摘自百度百科)

  2. 接收应用程序需要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(同上,但主要用于表单提交时伴随文件上传的场合)

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2009-01-18 Android应用协调器------Intent 关键字: android intent实例 刚起步的时候经常困扰我们的是一些本来容易解决的问题,往往我们会花掉很大的力气去找解决的办法,最后才知道原来这么简单,这就是英文世界造成的。 IntentAndroid应用开发中,占有很大的分量,关于IntentAndroid中的作用在网络上已经有很多资料了,这里不再累赘,本人喜欢直来直去。在网上看到很多关于Intent的资料,说那么多,你也许还是一头雾水,到底如何使用Intent呢?这里总结一些重用的Intent使用,仅供参考。 下面直接给我学习的实例片段。 1,调用web浏览器 Uri myBlogUri = Uri.parse("http://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:[email protected]"); returnIt = new Intent(Intent.ACTION_SENDTO, emailUri); 9,发邮件 returnIt = new Intent(Intent.ACTION_SEND); String[] tos = { "[email protected]" }; String[] ccs = { "[email protected]" }; 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"); 11,直接发邮件 Uri smsToUri = Uri.parse("smsto://100861"); returnIt = new Intent(Intent.ACTION_SENDTO, smsToUri); returnIt.putExtra("sms_body", "shenrenkui"); 12,发彩信 Uri mmsUri = Uri.parse("content://media/external/images/media/23"); returnIt = new Intent(Intent.ACTION_SEND); returnIt.putExtra("sms_body", "shenrenkui"); returnIt.putExtra(Intent.EXTRA_STREAM, mmsUri); returnIt.setType("image/png"); 用获取到的Intent直接调用startActivity(returnIt)就ok了。 今天就说这么多,有更大需求的可以看源代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值