Android实现分享到微博,微信等功能,大概有两个实现方向
1、集成官方SDK,无论微信还是微博等平台,都有自己的开发者后台,可以去申请帐号,下载sdk,集成。
也可以利用例如ShareSDK这样的平台来继承。
2、就是我本文要介绍的方式了,用系统的Intent来实现分享。
先来简单介绍一下分享功能,分享功能,在几乎所有的app中都有实现,原由就是通过分享来传播自己的软件,
也可以通过分享来实现简单社交的功能。
我最近做的APP当然也有这个功能,我是继承官方sdk做的,但是有这么几个缺点。
第一、会导致最终的apk变大
第二、集成代码量大
第三、需要在各个平台的官方后台申请appkey等东西,工作量大,审核时间不受控制
第四、就是我遇到的情况,被官方平台封了……
当然,集成官方sdk好处也很多,最重要的就是用Intent分享,只能分享图文,其他功能无法实现,而官方则有
更多的分享功能
好了,我们还是来看一下怎么用Intent实现分享吧
Android SDK在启动Activity的时候,给我们提供了两种方式,第一种就是平时都在用的
Intent in = new Intent(this, ShareActivity.class);
startActivity(in);
我们也称之为显示启动,这种启动方式,只能在自己的应用里启动,无法启动其他应用的Activity
而我们要实现的分享功能,一定是启动别的应用,比如微信,微博等的Activity了
所以,我们需要用隐式启动
隐式启动,就是不指定具体的启动的Activity,而是通过指定action来实现启动Activity的功能,
action 就是目标Activity在Manifest中定义的Action,比如
<span style="white-space:pre"> </span><activity android:name=".ShareActivity" android:exported="true"<span style="font-family: Arial, Helvetica, sans-serif; color: rgb(169, 183, 198);">></span>
<intent-filter>
<action android:name="com.by.test.shareactivity"/>
</intent-filter>
</activity>
这样,action就是其他应用启动我这个Activity时的Action, android:exported="true"表示允许被其他应用启动
那么,怎么从别的应用启动这个Activity呢
<span style="white-space:pre"> </span>Intent in = new Intent();
in.setAction("com.by.test.shareactivity");
startActivity(in);
很简单,这就可以了,如果有多个activity定义了同一个Action,则在启动Action时会出现选择界面,让用户来选择
启动哪个,比如在通过应用跳转到浏览器的时候,如果手机安装了多个浏览器,就会弹出选择界面。
/**
* 分享文本到全平台
* @param context 上下文关系
* @param text 要分享的文本
*/
public static void shareTextToAll(Context context, String text) {
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, text);
context.startActivity(Intent.createChooser(intent, "请选择"));
}
/**
* 分享单张图片到全平台
* @param context 上下文关系
* @param text 文本内容,并非所有平台在分享图片时候都支持此参数
* @param img 图片uri地址
*/
public static void shareImgToAll(Context context, String text, Uri img) {
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_TEXT, text);
intent.putExtra(Intent.EXTRA_STREAM, img);
context.startActivity(Intent.createChooser(intent, "请选择"));
}
/**
* 分享多张图片到全平台
* @param context 上下文关系
* @param text 文本内容
* @param images 图片Uri地址的集合
*/
public static void shareImgsToAll(Context context, String text, ArrayList<Uri> images) {
Intent intent=new Intent(Intent.ACTION_SEND_MULTIPLE);
intent.setType("image/*");
intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, images);
intent.putExtra(Intent.EXTRA_TEXT, text);
context.startActivity(Intent.createChooser(intent, "请选择"));
}
setType是设置类型,putxxx是设置Intent参数,目标Activity会接受到。
这是分享到全平台,调用这个代码,会显示手机上所有满足的应用让用户选择。
如果想分享到某个固定平台,可以多添加一个条件
intent.setPackage("target packageName");
而如果某个应用里,还有多个满足,想指定固定的某个,比如微信分享有好友和朋友圈之分
可以这样设置
<span style="white-space:pre"> </span>ComponentName comp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI");
intent.setComponent(comp);
这个设置的就是微信朋友圈,第一个参数是微信的包名,第二个参数是微信朋友圈的Activity
以上是,调用分享,可以分享图文。
如果想在自己的应用里集成分享,使其他应用在分享的时候,我们的应用可以出现在用户的选择列表中
需要我们自己在需要集成分享的activity里添加一下filter
<span style="white-space:pre"> </span><activity android:name=".ShareActivity" android:exported="true">
<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"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
</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都是一个选择器,想要启动我这个activity,需要满足这三个选择器中的至少一个。
其实这三个选择器,分别对应的就是纯文本消息,图文消息和多图文消息。
定义好这个后,在有痛过Intent启动分享的功能时,我们的应用也添加到了用户的选择当中
当用户选择我们时,我们通过Intent来获取用户传递给我们的消息,并实现自己的逻辑功能
<span style="white-space:pre"> </span>TextView textView = (TextView) findViewById(R.id.textView);
Intent intent = getIntent();
String text = intent.getStringExtra(Intent.EXTRA_TEXT);
String type = intent.getType();
String action = intent.getAction();
textView.setText(text + "\n" + type + "\n" + action);
if (type.equals("image/*")) {
ImageView imageView = (ImageView) findViewById(R.id.imageView);
if (action.equals(Intent.ACTION_SEND)) {
Uri img = intent.getParcelableExtra(Intent.EXTRA_STREAM);
imageView.setImageURI(img);
} else if (action.equals(Intent.ACTION_SEND_MULTIPLE)) {
ArrayList<Uri> list = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
if (list.size() > 0) {
imageView.setImageURI(list.get(0));
}
}
}