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));
                }
            }
        }