为了应用的推广、传播,很多的应用中都有“分享”功能,一个按钮,点击后会出现短信、微博等等一切实现了分享功能的应用列表。这一篇文章主要介绍怎么调用分享功能和怎么实现分享接口让自己应用出现分享列表中。Android应用中能很方便的完成这些功能,这也正是Android的伟大之处,他能很简单的完成应用之间的沟通以相互整合。

调用分享功能

1、分享文本

分享功能使用的隐式启动Activity的方法,这里的Action使用的是 ACTION_SEND 

  1. Intent sendIntent = new Intent();
  2. sendIntent.setAction(Intent.ACTION_SEND);
  3. sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
  4. sendIntent.setType("text/plain");
  5. startActivity(sendIntent);

效果如下图的图一。

2、改变分享列表标题

使用上面的分享方式分享列表标题为“使用一下内容完成操作”,Android中提供了Intent.createChooser() ,这样能一直显示分享选择列表,并且修改了分享列表标题内容。

  1. Intent sendIntent = new Intent();
  2. sendIntent.setAction(Intent.ACTION_SEND);
  3. sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
  4. sendIntent.setType("text/plain");
  5. startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));

使用Intent.createChooser()的好处:

If you callIntent.createChooser() for the intent, Android will always display the chooser. This has some advantages:

  • Even if the user has previously selected a default action for this intent, the chooser will still be displayed.
  • If no applications match, Android displays a system message.
  • You can specify a title for the chooser dialog.

                    

分享功能不只是Intent.EXTRA_TEXT,还可以 EXTRA_EMAILEXTRA_CCEXTRA_BCC,EXTRA_SUBJECT. 只需要接受方完成响应数据接受。

3、分享图片

分享功能还支持二进制内容(Binary Content),但是多数是处理的图片,因为shareIntent.setType("image/jpeg")这一项设置了内容类型。可也以是其他类型,需要接受方支持。

  1. Intent shareIntent = new Intent();
  2. shareIntent.setAction(Intent.ACTION_SEND);
  3. shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
  4. shareIntent.setType("image/jpeg");
  5. startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

4、分享图片列表

分享功能不仅支持单张图片,还支持图片列表,这里还是说的范围太窄了,应该声明不仅仅是图片。

  1. ArrayList<Uri> imageUris = new ArrayList<Uri>();
  2. imageUris.add(imageUri1); // Add your image URIs here
  3. imageUris.add(imageUri2);
  4. Intent shareIntent = new Intent();
  5. shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
  6. shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
  7. shareIntent.setType("image/*");
  8. startActivity(Intent.createChooser(shareIntent, "Share images to.."));

实现分享功能

上面说的都是怎么调用分享功能,以下就开始写怎么实现分享功能,让我们的应用也出现在分享列表中。前面也说了分享功能是使用隐式调用Activtiy实现的,Activity需要声明 <intent-filter> 。

声明intent-filter

  1. <activity
  2. android:name="com.example.sharedemo.ShareActivity"
  3. android:label="@string/app_name" >
  4. <intent-filter>
  5. <action android:name="android.intent.action.SEND" />
  6. <category android:name="android.intent.category.DEFAULT" />
  7. <data android:mimeType="image/*" />
  8. </intent-filter>
  9. <intent-filter>
  10. <action android:name="android.intent.action.SEND" />
  11. <category android:name="android.intent.category.DEFAULT" />
  12. <data android:mimeType="text/plain" />
  13. </intent-filter>
  14. <intent-filter>
  15. <action android:name="android.intent.action.SEND_MULTIPLE" />
  16. <category android:name="android.intent.category.DEFAULT" />
  17. <data android:mimeType="image/*" />
  18. </intent-filter>
  19. </activity>

上面声明了三种intent-filter,当然可以更多,这里只是举个例子,

处理接收数据

声明了intent-filter,响应的Activity就要处理响应的数据,示例如下:

  1. public class ShareActivity extends Activity{
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. // TODO Auto-generated method stub
  5. super.onCreate(savedInstanceState);
  6. // Get intent, action and MIME type
  7. Intent intent = getIntent();
  8. String action = intent.getAction();
  9. String type = intent.getType();
  10. if (Intent.ACTION_SEND.equals(action) && type != null) {
  11. if ("text/plain".equals(type)) {
  12. handleSendText(intent); // Handle text being sent
  13. } else if (type.startsWith("image/")) {
  14. handleSendImage(intent); // Handle single image being sent
  15. }
  16. } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
  17. if (type.startsWith("image/")) {
  18. handleSendMultipleImages(intent); // Handle multiple images being sent
  19. }
  20. } else {
  21. // Handle other intents, such as being started from the home screen
  22. }
  23. }
  24. void handleSendText(Intent intent) {
  25. String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
  26. String sharedTitle = intent.getStringExtra(Intent.EXTRA_TITLE);
  27. if (sharedText != null) {
  28. // Update UI to reflect text being shared
  29. }
  30. }
  31. void handleSendImage(Intent intent) {
  32. Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
  33. if (imageUri != null) {
  34. // Update UI to reflect image being shared
  35. }
  36. }
  37. void handleSendMultipleImages(Intent intent) {
  38. ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
  39. if (imageUris != null) {
  40. // Update UI to reflect multiple images being shared
  41. }
  42. }
  43. }

通过声明intent-filter,处理接受到的数据就能完成分享的接收功能。

更多

上面只做了分享功能简单的说明,伴随着Android api的升级,也出现了一些新的完成“分享”功能的方法,比如 ShareActionProvider ,更多请参考。

示例下载

/**
* @author 张兴业
*  iOS入门群:83702688
*  android开发进阶群:241395671
*  我的新浪微博:@张兴业TBOW
*/

参考:

http://developer.android.com/training/sharing/index.html

Android应用中使用及实现系统“分享”接口的更多相关文章

  1. Android应用中实现系统“分享”接口

    在android下各种文件管理器中,我们选择一个文件,点击分享可以看到弹出一些app供我们选择,这个是android系统分享功能,我们做的app也可以出现在这个列表中. 第一步:在Manifest.x ...

  2. 在Android Studio中使用shareSDK进行社会化分享(图文教程)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. Android Intent和IntentFilter详解与使用及实现系统“分享”接口

    Intent Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到 ...

  4. Android开发中Parcelable接口的使用方法

    在网上看到很多Android初入门的童鞋都在问Parcelable接口的使用方法,小编参考了相关Android教程,看到里面介绍的序列化方法主要有两种分别是实现Serializable接口和实现Par ...

  5. android - 调用系统分享功能分享图片

    step1: 编写分享代码, 将Uri的生成方式改为由FileProvider提供的临时授权路径,并且在intent中添加flag 注意:在Android7.0之后,调用系统分享,传入URI的时候可能 ...

  6. 我的Android进阶之旅------>如何获取系统中定义了那些权限

    在Window控制台中输入如下命令可以看到Android系统中列出的所有权限(如果自定义权限注册成功,在这里也会找到这些自定义的权限) adb shell pm list permissions C: ...

  7. android开发中系统自带语音模块的使用

    android开发中系统自带语音模块的使用需求:项目中需要添加语音搜索模块,增加用户体验解决过程:在网上搜到语音搜索例子,参考网上代码,加入到了自己的项目,完成产品要求.这个问题很好解决,网上能找到很 ...

  8. Android开发中怎样调用系统Email发送邮件(多种调用方式)

    在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...

  9. unity3d开发的android应用中增加AD系统的详细步骤

    unity3d开发的android应用中增加AD系统的详细步骤 博客分类: Unity3d unity3d  Unity3d已经支持android,怎样在程序里增加admob?  试了一下,确实能够, ...

随机推荐

  1. [Python爬虫] Selenium获取百度百科旅游景点的InfoBox消息盒

    前面我讲述过如何通过BeautifulSoup获取维基百科的消息盒,同样可以通过Spider获取网站内容,最近学习了Selenium+Phantomjs后,准备利用它们获取百度百科的旅游景点消息盒(I ...

  2. Maven学习总结(一)——Maven入门——转载

    一.Maven的基本概念 Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1. ...

  3. AndroidStudio的一些坑

    以下环境为Android Studio 1.3.2,Gradle 2.7(as自带2.4,另下载的2.7) 编译时提示Multiple dex files define: Lcom/sina/weib ...

  4. Android组件Spinner使用

    Spinner组件是Android当中非常常用的一种用于下拉选择的组件. 本blog当中主要解决的几个问题: 如何在XML中初始化Spinner选项 如何使用代码的方式初始化Spinner选项 一个A ...

  5. php: zend server 安装及相关配置

    运行安装文件(ZendServer-CE-php-5.3.2-5.0.1-Windows_x86.exe)开始安装,选项请参照我的选择. 这里不做改动,维持默认选择即可 点击Browse按钮更改安装目 ...

  6. GET请求中URL的最大长度限制总结

    由于jsonp跨域请求只能通过get请求,url长度根据浏览器及服务器的不同而有不同限制. 若要支持IE的话,最大的长度为2083字符,若是中文字符的话只有2083/9=231个字符. 若是Chrom ...

  7. django文件上传下载

    views: def mgmt_files(request): #列出树形目录,上传文件页面 if request.method == 'POST': path_root = "D:\\py ...

  8. [转]如果我有jQuery背景,我应该如何切换到AngularJS的思维模式?

    导言 stackoverflow上有一个人问了一个问题:如果我有jQuery背景,我应该如何切换到AngularJS的思维模式? 有一个回复非常经典,获得了两千多票. 为了让国内开发者也能领略到其中的 ...

  9. 【Cocos2d-x】VS2012开发2dx无法解析的外部符号解决记录(第一篇)【转】

    come from http://acoder.me/cocos2d-unresolved-external-symbol.html 看到cocos2d-x带了扩展包,心动的想尝试下,以下分享下我使用 ...

  10. Android酷炫实用的开源框架——UI框架(转)

    转载别人整理好的文章,列出了很多炫酷的UI开源设计 原文地址:http://www.androidchina.net/1992.html 1.Side-Menu.Android分类侧滑菜单,Yalan ...