Android自定义系统分享面板

在Android中实现分享有一种比较方便的方式,调用系统的分享面板来分享我们的应用。最基本的实现如下:

	public Intent getShareIntent(){
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_SEND);
		intent.putExtra(Intent.EXTRA_TEXT, "这是测试分享面板, http://www.baidu.comss");
		intent.setType("text/plain");
		return intent;
	}

还有一种是实现在ActionBar上添加分享列表,实现代码如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_item_share"
        android:showAsAction="ifRoom"
        android:title="Share"
        android:actionProviderClass="android.widget.ShareActionProvider" />
</menu> 
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.actionbar_menu, menu);
		MenuItem item = menu.findItem(R.id.menu_item_share);
		shareActionProvider = (ShareActionProvider) item.getActionProvider();
		Intent shareIntent = getShareIntent();
		shareActionProvider.setShareIntent(shareIntent);
		return true;
	}

	public Intent getShareIntent(){
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_SEND);
		intent.putExtra(Intent.EXTRA_TEXT, "这是测试分享面板, http://www.baidu.comss");
		intent.setType("text/plain");
		return intent;
	}

系统默认会为我们找出所有支持seteType中类型的应用,同样我们可以实现自定义分享的平台。

	private void initShareIntent() {
		Intent intent = new Intent(Intent.ACTION_SEND);
		intent.setType("text/plain");
		List<ResolveInfo> resInfo = getPackageManager().queryIntentActivities(
				intent, 0);
		if (!resInfo.isEmpty()) {
			List<Intent> targetedShareIntents = new ArrayList<Intent>();
			for (ResolveInfo info : resInfo) {
				Intent targeted = new Intent(Intent.ACTION_SEND);
				targeted.setType("text/plain");
				ActivityInfo activityInfo = info.activityInfo;
				//在这里可以添加相应的平台,用 || 连接
				if (activityInfo.packageName.contains("com.tencent.mm")) {
					targeted.putExtra(Intent.EXTRA_TEXT, "分享内容");
					targeted.setPackage(activityInfo.packageName);
					targetedShareIntents.add(targeted);
				}
			}
			Intent chooserIntent = Intent.createChooser(
					targetedShareIntents.remove(0), "Select app to share");
			if (chooserIntent == null) {
				return;
			}
			chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
					targetedShareIntents.toArray(new Parcelable[] {}));
			try {
				startActivity(chooserIntent);
			} catch (android.content.ActivityNotFoundException ex) {
				Toast.makeText(this, "Can‘t find sharecomponent to share",
						Toast.LENGTH_SHORT).show();
			}
		}
	}

系统的分享面板存在一些缺陷,比如每个手机显示的面板的样式不同,不同手机上显示的分享平台种类和数目不同,会出现一些杂乱的应用。我们可以给上面的方法添加参数,让只能分享到一个平台就可以解决这个问题,这样我们就可以自定义一个分享面板,来添加我们想要的应用,代码如下:

	private void initShareIntent(String type) {
	      boolean found = false;
	      Intent share = new Intent(android.content.Intent.ACTION_SEND);
	      share.setType("image/*");
	      // gets the list of intentsthat can be loaded.
	      List<ResolveInfo> resInfo =getPackageManager().queryIntentActivities(
	           share, 0);
	      if (!resInfo.isEmpty()) {
	        for (ResolveInfo info : resInfo) {
	           if (info.activityInfo.packageName.toLowerCase().contains(type)
	                 || info.activityInfo.name.toLowerCase().contains(type)) {
	              share.putExtra(Intent.EXTRA_SUBJECT, "subject");
	              share.putExtra(Intent.EXTRA_TEXT, "your text");

	              //share.putExtra(Intent.EXTRA_STREAM,
	              // Uri.fromFile(newFile(myPath))); // Optional, just
	              // // if you wanna
	              // // share an
	              // // image.
	              share.setPackage(info.activityInfo.packageName);
	              found = true;
	              break;
	           }
	        }
	        if (!found)
	           return;
	        startActivity(Intent.createChooser(share, "Select"));
	      }
	   }
时间: 2024-10-09 18:59:37

Android自定义系统分享面板的相关文章

Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博

原文:Android 调用系统分享文字.图片.文件,可直达微信.朋友圈.QQ.QQ空间.微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本.图片.文件到第三方APP,如:微信.QQ.微博等 因为偷懒,可直达微信.朋友圈.QQ.QQ空间.微博的分享仅写了图片分享的,其他的文本.文件分享不常用到,就不写了. 具体图片分享区分单张图片分享和多张图片分享,详情请看代码: import android.content.ComponentName; import android.content

Android调用系统分享分享内容到其他应用,不使用系统的ActionBar的弹窗,完全自定义

Android分享内容到其他应用,调用系统的Dialog或者ActionBar的弹窗都不太自由,限制太大,这里我提供一个完全自定界面的,可以弹窗,也可以直接在Activity或者Fragment里边自定义界面.这里展示一个关键类的代码,做了封装处理,我写两个一个Demo,免费源码在:http://download.csdn.net/detail/yanzhenjie1003/8565449 /** * @author YOLANDA * @Time 2015年4月5日 下午1:03:11 */

android 集成系统分享和第三方分享案例

现在很多的应用基本都会集成分享这个功能,该功能包括系统分享(比如邮件,短信)和第三方分享(比如QQ和微信).其中有些公司会选择使用第三方的库来简化这些操作,加快开发,用的比较多的比如友盟社会化分享SDK,缺点就是自由度太低,因为可能你仅仅只是需要QQ和微信,其他的公司就会选择自己导入所需要的第三方SDK来自定义分享功能,自由度高,于是这篇博客主要来介绍后一种自定义分享功能的案例demo,下图是demo的运行效果: 具体分析一下源码,由于分享的内容根据需求的不同而不同,为了简单起见,我们就以最常用

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

step1: 编写分享代码, 将Uri的生成方式改为由FileProvider提供的临时授权路径,并且在intent中添加flag 注意:在Android7.0之后,调用系统分享,传入URI的时候可能会导致程序闪退崩溃.这是由于7.0的新的文件权限导致的.下面的代码对其做了处理 public static int sharePic(Context context, String picFilePath) { File shareFile = new File(picFilePath); if (

android 调用系统分享图片及文字

调用系统分享文字:public static void shareText(Context context, String extraText) {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_SUBJECT, "连接分享");intent.putExtra(Intent.EXTRA_TEXT, extr

Android调用系统分享功能以及createChooser的使用

工程结构 //效果图 点击测试分享                                                                                                          点击createChoose妙用       主要是看右边的,可不是用什么Dialog来搞的哦,而是你Activity程序,可以激活进去了 提示:这个东西可以延伸到一个音频文件,打开时,可以调用你的音乐播放器来播放哦,视频,图片,也是类似,可以调用你自己

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

在android下各种文件管理器中,我们选择一个文件,点击分享可以看到弹出一些app供我们选择,这个是android系统分享功能,我们做的app也可以出现在这个列表中.   第一步:在Manifest.xml进行配置,比普通的activity中多增加一个Intent过滤器 <activity android:name="com.example.share.MainActivity" android:label="@string/app_name" > &

Android调用系统相机、自定义相机、处理大图片

Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人SurfaceView出现黑屏的原因. Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果.    知识点: 一.调用系统自带的相机应用 二.自定义我们自己的拍照界面 三.关于计算机解析图片原理(如何正确加载图片到Android应用中) 所需

android调用系统的分享功能实现分享到短信,邮件和其他

之前写过一篇文章利用友盟等第三方实现分享到微信,微博和豆瓣等第三方社交站点.本次我们利用系统自带的分享功能去做,虽然简单,但对于以前类似友盟等第三方社交分享组件还没做的成熟的时候,也是一种好的选择.所以这里直接上代码对系统分享做个记录,代码有必要注释,所以就不做啥说明了: /** * 弹出分享列表 */ private void showShareDialog(){ AlertDialog.Builder builder = new AlertDialog.Builder(Thread_Cont