应用添加分享至微信、QQ和微博

Android应用添加分享至微信、QQ和微博


转载请保留: http://blog.csdn.net/lys211/article/details/52002687


        最近需要在应用里添加分享至微信、QQ和微博的功能,但是因为除了这些官方的*.jar包,项目中不希望加入其他的第三方sdk,于是只能自己参考官方文档进行添加。

正巧我们的需求只是分享网页链接而已,同时官方文档都讲得比较详细,所以总体感觉这个还是挺简单。


       要去腾讯开放平台 http://open.qq.com/ 去申请开发者账号,然后创建一个自己的应用(如果只是测试官方接口的使用,可以只创建并保存应用信息而不提交审核,这样就可以有一个临时可以使用的app id和app key可以使用)。

        同理,分享到微信和微博(微博也可以只申请,不提交审核)也需要申请app id。

        具体流程可以自行度娘。

        我也是参考了网上朋友的做法,侵删。


接着下载各个jar

微信

libammsdk.jar


腾讯qq

mta-sdk-1.6.2.jar

open_sdk_r5756_lite.jar


新浪微博

weiboSDKCore_3.1.4.jar


        把以上这些jar加入到工程中。

        注:因为开发环境为Android Studio,新浪微博的分享功能除了jar以外,还要在src/main下面新建一个jniLibs文件夹,把.so文件放到这个文件夹下



       为了方便添加到各个项目而不怎么影响别的代码,文件结构是这样的:



        为了方便,新建一个ShareUtils类

        添加变量:

<pre name="code" class="java">public static final String WX_APP_ID = "<span style="font-family: Arial, Helvetica, sans-serif;">你申请的tencent app id</span><span style="font-family: Arial, Helvetica, sans-serif;">";</span>
private static final String SINA_APP_KEY = "你申请的微博app id";
private static final String QQ_APP_ID = "<span style="font-family: Arial, Helvetica, sans-serif;">你申请的tencent app id</span><span style="font-family: Arial, Helvetica, sans-serif;">";</span>

 

<pre name="code" class="java"><pre name="code" class="java">private IWXAPI _iwxapi;
private Tencent _tencent;
private IWeiboShareAPI _iWeiboShareAPI;

 
 

添加注册方法:

    public void registerShareUtils(Context context) {
        Log.d(_TAG, "registerShareUtils");
        _context = context;
        registerToQQ(_context);
        registerToWechat(_context);
        registerToSinaWeibo(_context);
   <span style="font-family: Arial, Helvetica, sans-serif;"> }</span>


    public void registerToWechat(Context context) {
        _iwxapi = WXAPIFactory.createWXAPI(context, WX_APP_ID, true);
        _iwxapi.registerApp(WX_APP_ID);
    }

    public void registerToQQ(Context context) {
        _tencent = Tencent.createInstance(QQ_APP_ID, context);
    }

    public void registerToSinaWeibo(Context context) {
        _iWeiboShareAPI = WeiboShareSDK.createWeiboAPI(context, SINA_APP_KEY);
        _iWeiboShareAPI.registerApp();
    }


各自的分享实现:

1.分享至微信

        如果你在微信开放平台上注册的包名是 aaa.bb.ccc,那么你需要在此包下新建一个包 wxapi,结果是这样的(aaa.bb.ccc.wxapi),在此新包下新建一个activity,命名为 WXEntryActivity。

        AndroidManifest.xml同时添加:

        <activity
            android:name=".wxapi.WXEntryActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:exported="true"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

        方法实现

    <pre name="code" class="java">    private byte[] getBitmapBytes(Bitmap bitmap) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        return byteArrayOutputStream.toByteArray();
    }
 

    private byte[] getBitmapBytes(Bitmap bitmap) {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        return byteArrayOutputStream.toByteArray();
    }

    public void shareToWechatSceneSession(@NonNull ShareContentBody message) {
        WXWebpageObject webpageObject = new WXWebpageObject();
        webpageObject .webpageUrl = message.getLink();
        WXMediaMessage wxMediaMessage = new WXMediaMessage(webpageObject);
        wxMediaMessage.title = message.getTitle();
        wxMediaMessage.description = message.getDescription();
        Bitmap bitmap = BitmapFactory.decodeResource(_context.getResources(), R.drawable.app_icon);
        Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
        wxMediaMessage.thumbData = getBitmapBytes(thumbBitmap);
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = String.valueOf(System.currentTimeMillis());
        req.message = wxMediaMessage;
        req.scene = SendMessageToWX.Req.WXSceneSession;
        _iwxapi.sendReq(req);
    }

    public void shareToWechatSceneTimeline(@NonNull ShareContentBody message) {
        WXWebpageObject webpageObject = new WXWebpageObject();
        webpageObject.webpageUrl = message.getLink();
        WXMediaMessage mediaMessage = new WXMediaMessage(webpageObject);
        mediaMessage.title = message.getTitle();
        mediaMessage.description = message.getDescription();
        //Bitmap bitmap = BitmapFactory.decodeFile(message.getImageUrl());
        Bitmap bitmap = BitmapFactory.decodeResource(_context.getResources(), R.drawable.app_icon);
        Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
        mediaMessage.thumbData = getBitmapBytes(thumbBitmap);
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = String.valueOf(System.currentTimeMillis());
        req.message = mediaMessage;
        req.scene = SendMessageToWX.Req.WXSceneTimeline;
        _iwxapi.sendReq(req);
    }

    public void shareToWechatFavorite(@NonNull ShareContentBody message) {
        WXWebpageObject webpageObject = new WXWebpageObject();
        webpageObject.webpageUrl = message.getLink();
        WXMediaMessage wxMediaMessage = new WXMediaMessage(webpageObject);
        wxMediaMessage.title = message.getTitle();
        wxMediaMessage.description = message.getDescription();
        Bitmap bitmap = BitmapFactory.decodeResource(_context.getResources(), R.drawable.app_icon);
        Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 150, 150, true);
        wxMediaMessage.thumbData = getBitmapBytes(thumbBitmap);
        SendMessageToWX.Req req = new SendMessageToWX.Req();
        req.transaction = String.valueOf(System.currentTimeMillis());
        req.message = wxMediaMessage;
        req.scene = SendMessageToWX.Req.WXSceneFavorite;
        _iwxapi.sendReq(req);
    }




2.分享至QQ和QQ空间

        在AndroidManifest.xml中添加如下声明:

        <activity
            android:name="com.tencent.connect.common.AssistActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="tencent你的tencent id" />
            </intent-filter>
        </activity>

        对于上面代码中的这一行:

        <data android:scheme="tencent你的tencent id" /> 

        如果你申请到的tencent id是1234567890,那么这行就是这样的:

        <data android:scheme="tencent1234567890" />


        主要方法实现

    public void shareToQQ(@NonNull Activity activity, @NonNull ShareContentBody body, IUiListener iUiListener) {
        final Bundle bundle = new Bundle();
        bundle.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
        bundle.putString(QQShare.SHARE_TO_QQ_TARGET_URL, body.getLink());
        bundle.putString(QQShare.SHARE_TO_QQ_TITLE, body.getTitle());
        bundle.putString(QQShare.SHARE_TO_QQ_SUMMARY, body.getDescription());
        bundle.putString(QQShare.SHARE_TO_QQ_IMAGE_URL, body.getImageUrl());
        bundle.putString(QQShare.SHARE_TO_QQ_APP_NAME, activity.getString(R.string.app_name));
        _tencent.shareToQQ(activity, bundle, iUiListener);
    }

    public void shareToQQZone(@NonNull Activity activity, @NonNull ShareContentBody body, IUiListener iUiListener) {
        final Bundle bundle = new Bundle();
        bundle.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE, QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
        bundle.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, body.getLink());
        bundle.putString(QzoneShare.SHARE_TO_QQ_TITLE, body.getTitle());
        bundle.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, body.getDescription());
        ArrayList<String> imageUrlList = new ArrayList<>();
        imageUrlList.add(body.getImageUrl());
        bundle.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrlList);
        bundle.putString(QzoneShare.SHARE_TO_QQ_APP_NAME, activity.getString(R.string.app_name));
        _tencent.shareToQzone(activity, bundle, iUiListener);
    }

3.分享至微博

    private TextObject getTextObject(String shareText) {
        TextObject textObject = new TextObject();
        textObject.text = shareText;
        return textObject;
    }

    private ImageObject getImageObject(Drawable drawable) {
        ImageObject imageObject = new ImageObject();
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        imageObject.setImageObject(bitmapDrawable.getBitmap());
        return imageObject;
    }

    private WebpageObject getWebpageObject(ShareContentBody message) {
        WebpageObject webpageObject = new WebpageObject();
        webpageObject.identify = message.getDescription();
        webpageObject.title = message.getTitle();
        webpageObject.description = message.getDescription();
        webpageObject.actionUrl = message.getLink();
        webpageObject.defaultText = message.getTitle();
        Bitmap bitmap = BitmapFactory.decodeResource(_context.getResources(), R.drawable.app_icon);
        Bitmap thumbBitmap = Bitmap.createScaledBitmap(bitmap, 108, 108, true);
        webpageObject.setThumbImage(thumbBitmap);
        return webpageObject;
    }

    private void shareSinaWeiboSingleMessage(@NonNull Activity activity, ShareContentBody message, Drawable drawable) {
        Log.d(_TAG, "shareSinaWeiboSingleMessage ");
        WeiboMessage weiboMessage = new WeiboMessage();
        weiboMessage.mediaObject = getTextObject(message.getTitle());
        weiboMessage.mediaObject = getImageObject(drawable);
        SendMessageToWeiboRequest request = new SendMessageToWeiboRequest();
        request.transaction = String.valueOf(System.currentTimeMillis());
        request.message = weiboMessage;
        _iWeiboShareAPI.sendRequest(activity, request);
    }

    private void shareSinaWeiboMultiMessage(@NonNull Activity activity, ShareContentBody message, Drawable drawable) {
        Log.d(_TAG, "shareSinaWeiboMultiMessage ");
        WeiboMultiMessage weiboMultiMessage = new WeiboMultiMessage();
        weiboMultiMessage.textObject = getTextObject(message.getTitle());
        weiboMultiMessage.imageObject = getImageObject(drawable);
        weiboMultiMessage.mediaObject = getWebpageObject(message);
        SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
        request.transaction = String.valueOf(System.currentTimeMillis());
        request.multiMessage = weiboMultiMessage;
        _iWeiboShareAPI.sendRequest(activity, request);
    }

    public void shareToSinaWeibo(@NonNull Activity activity, ShareContentBody message, Drawable drawable) {
        if (drawable == null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                drawable = _context.getDrawable(R.mipmap.app_icon);
            } else {
                drawable = _context.getResources().getDrawable(R.mipmap.app_icon);
            }
        }
        if (_iWeiboShareAPI.isWeiboAppSupportAPI()) {
            int supportAPI = _iWeiboShareAPI.getWeiboAppSupportAPI();
            if (supportAPI >= 10351) {
                shareSinaWeiboMultiMessage(activity, message, drawable);
            } else {
                shareSinaWeiboSingleMessage(activity, message, drawable);
            }
        }
    }


        ShareContentBody是自己定义的一个消息结构类

public class ShareContentBody extends SharedMessage {
    private static final String _TAG = ShareContentBody.class.getSimpleName();

    private String _link;
    private String _title;
    private String _imageUrl;
    private String _description;

    public ShareContentBody(String link, String title, String description, String imageUrl) {
        Log.d(_TAG, "ShareContentBody");
        _link = link;
        _title = title;
        _imageUrl = imageUrl;
        _description = description;
    }

    public void setLink(String link) {
        _link = link;
    }

    public void setTitle(String title) {
        _title = title;
    }

    public void setImageUrl(String imageUrl) {
        _imageUrl = imageUrl;
    }

    public void setDescription(String description) {
        _description = description;
    }

    @Override
    public String getLink() {
        return _link;
    }

    @Override
    public String getTitle() {
        return _title;
    }

    @Override
    public String getImageUrl() {
        return _imageUrl;
    }

    @Override
    public String getDescription() {
        return _description;
    }

}

        在MainActivity里,想调用分享功能,只需要添加成员:

        private ShareUtils _shareUtils;

        然后在onCreate里添加

        _shareUtils = new ShareUtils();
        _shareUtils.registerShareUtils(getApplicationContext());

        接着在需要弹出分享窗的地方添加

        SharePopupWindow sharePopupWindow = new SharePopupWindow(this, body, _shareUtils, null);
        sharePopupWindow.showAtLocation(getWindow().getDecorView(), Gravity.CENTER | Gravity.CENTER_HORIZONTAL, 0, 0);


        以上是主要的分享实现代码了,看文档和各种朋友的分享文章,都很容易实现。跟着文档跑一下demo就可以比较容易的做出来。项目中只需要添加分享网页链接的功能,至于授权登录什么的,忽略了,反正项目里不需要...


        点击分享按钮,弹出的效果如下图:




完整工程请参考csdn下载链接:http://download.csdn.net/detail/lys211/9584596




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值