Android应用中使用及实现系统“分享”接口

转载:http://blog.csdn.net/xyz_lmn/article/details/16856843

 为了应用的推广、传播,很多的应用中都有“分享”功能,一个按钮,点击后会出现短信、微博等等一切实现了分享功能的应用列表。这一篇文章主要介绍怎么调用分享功能和怎么实现分享接口让自己应用出现分享列表中。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);
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
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 sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
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_EMAIL, EXTRA_CC, EXTRA_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)));
Intent shareIntent = new Intent();
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)));

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.."));
ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");
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>
 <activity
            android:name="com.example.sharedemo.ShareActivity"
            android:label="@string/app_name" >
            <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>
        </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. }
public class ShareActivity extends Activity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		// Get intent, action and MIME type
	    Intent intent = getIntent();
	    String action = intent.getAction();
	    String type = intent.getType();

	    if (Intent.ACTION_SEND.equals(action) && type != null) {
	        if ("text/plain".equals(type)) {
	            handleSendText(intent); // Handle text being sent
	        } else if (type.startsWith("image/")) {
	            handleSendImage(intent); // Handle single image being sent
	        }
	    } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
	        if (type.startsWith("image/")) {
	            handleSendMultipleImages(intent); // Handle multiple images being sent
	        }
	    } else {
	        // Handle other intents, such as being started from the home screen
	    }
	}

	void handleSendText(Intent intent) {
	    String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
	    String sharedTitle = intent.getStringExtra(Intent.EXTRA_TITLE);
	    if (sharedText != null) {
	        // Update UI to reflect text being shared
	    }
	}

	void handleSendImage(Intent intent) {
	    Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
	    if (imageUri != null) {
	        // Update UI to reflect image being shared
	    }
	}

	void handleSendMultipleImages(Intent intent) {
	    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
	    if (imageUris != null) {
	        // Update UI to reflect multiple images being shared
	    }
	}
}

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


更多

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



示例下载

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

参考:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值