安卓系统本身可以很简便的实现分享功能,因为我们只需向startActivity传递一个ACTION_SEND的Intent,系统就为我们弹出一个应用程序列表。其实在系统的文件管理器中,这应该是我们常用的功能(包括文件的打开Intent.ACTION_VIEW)。

下面列出一个简单的分享方式

Intent shareIntent = new Intent();

shareIntent.setAction(Intent.ACTION_SEND);

sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");

sendIntent.setType("text/plain");

startActivity(sendIntent);

前两行代码不用说了,就是一个简单的Action Intent,第三行的Intent.EXTRA_TEXT,是文本类型,还有EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC, EXTRA_SUBJECT等等,这些看字面意思就可以理解。
重点说一下Intent.EXTRA_STREAM。
设置合适的MIME类型,并且在附件数据中的EXTRA_STREAM中放一个指向数据的URI,就可以来分享二进制数据。这个通常用来分享图片,但是也可以用来分享任何类型的二进制内容,比如视频,文件等等。

Intent shareIntent = newIntent();

shareIntent.setAction(Intent.ACTION_SEND);

shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);

shareIntent.setType("image/jpeg");

startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

下面说一下Intent.setType这个方法:
参数有很多种,简单列出几个,”text/plain”、”image/jpeg”、”audio/mp4a-latm”、”audio/x-mpeg”、 “video/mp4”还有很多很多…
这里给出一个获取类型的方法

/**
* 根据文件后缀名获得对应的MIME类型。
*

@param filePath
*/

public static String getMimeType(String filePath)

{
MediaMetadataRetriever mmr = new MediaMetadataRetriever();

String mime = "text/plain";

if (filePath != null)

{
try

{

mmr.setDataSource(filePath);

mime = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_MIMETYPE);

}

catch (IllegalStateException e)

{
return mime;
}

catch (IllegalArgumentException e)

{
return mime;
}

catch (RuntimeException e)

{
return mime;
}

}

return mime;
}

我们可以**同时发送多条内容**,要发送多条数据,使用ACTION_SNED_MULTIPLE和一个指向数据的URI list。MIME类型根据分享的内容不同而不同。例如,如果分享3张JPEG图片,那么类型为"image/jpeg"。如果有不同的图片类型,那么就应该用"image/*"来匹配处理不同类型图片的activity。如果要处理各种不同的类型就应该用"*/*"了。正如前面提到的,分析和处理分享是数据是接收程序的事情了。

但是需要明确的一点是,**要确保URI指向的数据要可以被接收程序访问到**。

另外一个知识点就是,我们可以对分享的App进行筛选,比如我只想分享到QQ和微信平台,不关心人人网,迅雷这样的App
可通过Intent.createChooser方法实现,
首先我们定义一个Action Intent

String type = getMimeType(path);

Intent shareIntent = new Intent();

shareIntent.setAction(Intent.ACTION_SEND);

shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));

shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

shareIntent.setType(getMimeType(path));

然后获取可以用来发送该类型文件的ResolveInfo列表,也就是可以发送这种文件的应用列表信息

List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(shareIntent, 0);

通过包名筛选出我们想要的应用

  1. ArrayList<Intent> targetIntents = new ArrayList<Intent>();
  2. for (ResolveInfo info : resInfo) {
  3. ActivityInfo activityInfo = info.activityInfo;
  4. if (activityInfo.packageName.contains("com.tencent.mobileqq")
  5. ||activityInfo.packageName.contains("com.tencent.mm")) {
  6. Intent intent = new Intent(Intent.ACTION_SEND);
  7. intent.setPackage(activityInfo.packageName);
  8. intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
  9. intent.setClassName(activityInfo.packageName, activityInfo.name);
  10. targetIntents.add(intent);
  11. }
  12. }

最后用Intent.createChooser打开

  1. Intent chooser = Intent.createChooser(targetIntents.remove(0), "Send mail...");
  2. chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{}));
  3. context.startActivity(chooser);
  • 1
  • 2

到此,利用Intent.ACTION_SEND进行分享就差不多介绍完了,是不是比申请友盟以及各个平台要方便的多…

附上源码,以作备用

  1. /**
  2. * 发送文件
  3. * @param context
  4. * @param path
  5. */
  6. public static void sendFileByOtherApp(Context context, String path) {
  7. File file = new File(path);
  8. if (file.exists()) {
  9. String type = getMimeType(path);
  10. Intent shareIntent = new Intent();
  11. shareIntent.setAction(Intent.ACTION_SEND);
  12. shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
  13. shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  14. shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  15. shareIntent.setType(getMimeType(path));
  16. List<ResolveInfo> resInfo = context.getPackageManager().queryIntentActivities(shareIntent, 0);
  17. if (!resInfo.isEmpty()) {
  18. ArrayList<Intent> targetIntents = new ArrayList<Intent>();
  19. for (ResolveInfo info : resInfo) {
  20. ActivityInfo activityInfo = info.activityInfo;
  21. if (activityInfo.packageName.contains("com.tencent.mobileqq")
  22. ||activityInfo.packageName.contains("com.tencent.mm")) {
  23. Intent intent = new Intent(Intent.ACTION_SEND);
  24. intent.setPackage(activityInfo.packageName);
  25. intent.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(file));
  26. intent.setClassName(activityInfo.packageName, activityInfo.name);
  27. targetIntents.add(intent);
  28. }
  29. }
  30. Intent chooser = Intent.createChooser(targetIntents.remove(0), "Send mail...");
  31. chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetIntents.toArray(new Parcelable[]{}));
  32. context.startActivity(chooser);
  33. }
  34. }
  35. }
  1. 当然,我们也可以做一个Activity,像QQ微信一样,来接收文件或者wen z,只要会使用intentfilter就可以了

<intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter>

然后在oncreate方法中

if (Intent.ACTION_SEND.equals(action) && type != null) { if ("text/plain".equals(type)) { handleSendText(intent); // 处理发送来的文字 } else if (type.startsWith("image/")) { handleSendImage(intent); // 处理发送来的图片 } } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { if (type.startsWith("image/")) { handleSendMultipleImages(intent); // 处理发送来的多张图片 } } else { // 处理其他intents,比如由主屏启动 }

这样基本用法就介绍完了,基本的分享功能差不多可以完成,但是想要分享图文内容,或者自定义分享界面,可能就需要再深度挖掘了。

利用Intent.ACTION_SEND进行分享的更多相关文章

  1. 完美实现同时分享图片和文字(Intent.ACTION_SEND)

    private void share(String content, Uri uri){ Intent shareIntent = new Intent(Intent.ACTION_SEND); if ...

  2. android Intent.ACTION_SEND

    ACTION_SEND intent 可以把自己的应用添加到系统的发送(分享)列表中. <intent-filter> <action android:name="andr ...

  3. Android利用Intent与其他应用交互

    前言: 上一篇博客给大家聊了Intent的定义,分类.属性和功能,相信大家对于Intent在Android中的作用已经清楚,这一篇博客将会给大家聊Intent的用法. Android系统的一个重要特性 ...

  4. Android利用Intent与其它应用交互

    前言: 上一篇博客给大家聊了Intent的定义.分类.属性和功能,相信大家对于Intent在Android中的作用已经清楚,这一篇博客将会给大家聊Intent的使用方法. Android系统的一个重要 ...

  5. Android开发探秘之四:利用Intent实现数据传递

    在Android开发过程中,很多人都熟悉Intent,这是个用于在多个View之间共享数据的类.本节主要是继承上节,通过点选ListView中的文本,把文本中的URL加载到一个新的页面上,并且打印出来 ...

  6. 【Android基础】利用Intent在Activity之间传递数据

    前言: 上一篇文章给大家聊了Intent的用法,如何用Intent启动Activity和隐式Intent,这一篇文章给大家聊聊如何利用Intent在Activity之间进行沟通.   从一个Activ ...

  7. 008 Android activity实现多个界面的相互跳转(主要利用Intent)

    1.activity介绍 一个activity就把他理解成一个页面 2.新建activity流程 如图所示在com.lucky.test06的目录下,右击new--->Activity---&g ...

  8. Android开发利用shareSDK等第三方分享,弹出的是英文名称。例如Genymotion模拟器

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 Android开发利用shareSDK等第三方分享,弹出的是英文名称.例如Genymotion模拟器就 ...

  9. Android中,利用Intent传递对象值

    在很多情况下,调用startActivity(Intent) 方法,跳转到另外一个Activity或其他component,需要传递一个对象给它. 可以让这个要传递的对象所属类实现Serializab ...

随机推荐

  1. Vue 组件 生命周期函数mounted

    生命周期函数mounted:页面刷新触发mounted(){ console.log('我在页面刷新时触发');} Tips:使用export default function Add(){},与ex ...

  2. ASP.NET网页动态添加数据行

    一看到这标题<ASP.NET网页动态添加数据行>,想起来似乎有点难实现.因为网页的周期性原因,往往在PostBack之后,状态难于有所保留.但Insus.NET又想实现这样的效果,用户点击 ...

  3. java 学习第零篇JDK安装和记事本编辑JAVA(2)

    上面说了如何安装JDK那么这把就是来说怎么用记事本编写java 桌面上新建一个记事本 之后编写: public class a{    public static void main(String [ ...

  4. iOS开发进制转换

    1.十进制转换为二进制 /** 十进制转换为二进制 @param decimal 十进制数 @return 二进制数 */ + (NSString *)getBinaryByDecimal:(NSIn ...

  5. CI框架源码学习笔记7——Utf8.php

    愉快的清明节假期结束了,继续回到CI框架学习.这一节我们来看看Utf8.php文件,它主要是用来做utf8编码,废话不多说,上代码. class CI_Utf8 { /** * Class const ...

  6. tomcat跨域(亲测可用)

    首先下载cors-filter-2.5.jar(版本不要求)和java-property-utils-1.9.1 1.把这两个jar包放在tomcat的lib下. 2.在conf文件夹下找到web.x ...

  7. P3167 [CQOI2014]通配符匹配 题解

    题目 题目大意 给出一个字符串,其中包含两种通配符 ‘?’和 ‘*’ ,‘?’可以代替一个字符,‘*’可以代替一个字符串(长度可以为0) 然后给出几个字符转,判断能否用给出的字符串表示出来 样例解释 ...

  8. 图像标注工具labelImg安装记录

    这里仅记载下labelImg的安装过程,因为有坑. 我的安装方式是从源码编译,环境ubuntu16.04,一开始是使用python2安装,从github上下载好源码,然后执行安装命令 sudo apt ...

  9. 百度地图 api bug 解决.......

    百度地图 遇到了一个默明奇妙的bug.....  调用后中心点 不再 point(标注的点上...)这是需要执行一次(仅一次) 当 地图 加载完后 执行(这个方法你每次改地图 都会执行...所以让他执 ...

  10. CodeForces - 359C-Prime Number

    Simon has a prime number x and an array of non-negative integers a1, a2, ..., an. Simon loves fracti ...