Android新浪微博一键分享的实现

写在本章前


愈来愈多的APP支持一键分享至QQ空间、微信朋友圈、新浪微博的功能,同时支持第三方账号登录,如QQ、微信、新浪微博等第三方平台的账号。本章结合当下流行的设计,兼顾免费的开源ShareSDK,结合项目中的实际需求,整合出一套分享源码,版权所有,如需转载请注明转载地址。


1. 开发环境及SDK下载


  • 开发工具:Android studio2.1.3版本
  • ShareSDK:Mob官网(www.mob.com)下载最新社会化分享ShareSDK2.7.7版本,解压如图示
解压
  • 进入ShareSDK for Android文件,找到QuickIntegrater.jar文件,根据官网介绍双击打开,根据需求集成第三方平台,在某些情况如若双击无法打开,windows系统下,进入cmd找到QuickIntegrater.jar所在的当前目录,键入java -jar QuickIntegrater.jar,根据实际需求集成第三方平台,最后生成Sample的文件夹,包括需要使用到的libs等文件
Paste_Image.png
Paste_Image.png
  • 复制新生成文件夹Sample下面的全部内容到自己所建立的project下,同时需要对加入到libs的jar文件添加库依赖
Paste_Image.png
Paste_Image.png
  • Mob进入后台,申请分享使用权限,获取APP key和APP secret
Paste_Image.png
  • 将申请到的APP key替换
Paste_Image.png

2. 配置AndroidManifest.xml


<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<!-- 蓝牙分享所需的权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

3. 添加必要的activity信息


<activity
     android:name="com.mob.tools.MobUIShell"
     android:theme="@android:style/Theme.Translucent.NoTitleBar"
     android:configChanges="keyboardHidden|orientation|screenSize"
     android:screenOrientation="portrait"
     android:windowSoftInputMode="stateHidden|adjustResize" >
<!-- 调用新浪原生SDK,需要注册的回调activity -->
    <intent-filter>
        <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
<!--
     <intent-filter>
         <data android:scheme="tencent100371282" />
         <action android:name="android.intent.action.VIEW" />
         <category android:name="android.intent.category.BROWSABLE" />
         <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>
-->    
 </activity>

<!--微信分享回调
 <activity
     android:name="cn.sharesdk.demo.wxapi.WXEntryActivity"
     android:theme="@android:style/Theme.Translucent.NoTitleBar"
     android:configChanges="keyboardHidden|orientation|screenSize"
     android:exported="true"
     android:screenOrientation="portrait" />
 -->

备注:上述代码中,有关于微信和QQ的分享回调,本文只讲述新浪微博的分享使用,QQ和微信的activity添加可供参考


4. 替换mob后台申请的Appkey与各个平台申请的key


更换aseests下面的ShareSDK.xml中的APPkey,以及需要添加第三方应用需要的APPkey和AppSecret,以新浪微博为例.

4.1 新浪微博key申请

1)登录新浪微博,申请,填写账号,申请注册等信息,以个人为例,在申请结束后,获取“微连接”权限,点击“立即创建微连接”;

Paste_Image.png

2)填写应用名称,勾选应用平台,以Android为例;

Paste_Image.png

3)确认提交即可获取APP Key和Secret

Paste_Image.png

4)新浪微博获取APP的Android包名和签名

Paste_Image.png

5)通过进入申请的应用名称“Android实例”APP下的AndroidManifest.xml中获取包名;

Paste_Image.png

6)Android签名的获取
通过4)中新浪微博提供的签名工具,github下载的“app_signatures.apk”,安装到手机,同时将APP“Android实例”安装到手机,输入Android包名,即可生成对应的Android签名

Paste_Image.png
Paste_Image.png

7)新浪微博测试权限
需要注意的是,此时并没有对APP进行上线,并没有通过审核,暂时只有测试权限可以关联15个测试账号使用;

Paste_Image.png

5. 正式编程


此部分包括一键底部弹出对话框,按钮操作,第三方分享等操作;

5.1 自定义dialog

参考了多个博客,总结出自己所需要的dialog。

/**
 * Created by user on 2016/10/18.
 */
public class ShareDialog extends Dialog{
    private Dialog dialog;
    private Context context;
    private LayoutInflater inflater;
    private ImageView iv_share_sina, iv_share_qqzone, iv_share_wxfriend;

    public ShareDialog(Context context){
        super(context);
        init(context);
    }
    private void init(Context context){
        View view = inflater.from(context).inflate(R.layout.bottom_share_dialog, null);
        dialog = new Dialog(context, R.style.shareDialog_style);
        dialog.setContentView(view);

        RelativeLayout rl_dialog_bg = (RelativeLayout)view.findViewById(R.id.rl_dialog_bg);
        rl_dialog_bg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        //设置铺满
        Window dialogWindow = dialog.getWindow();
        dialogWindow.setGravity(Gravity.BOTTOM);//设置显示位置
        WindowManager.LayoutParams lp = dialogWindow.getAttributes(); // 获取对话框当前的参数值
//        lp.x = 0; // 新位置X坐标
//        lp.y = -20; // 新位置Y坐标

        lp.width = WindowManager.LayoutParams.MATCH_PARENT; // 宽度
      lp.height = WindowManager.LayoutParams.WRAP_CONTENT; // 高度
      lp.alpha = 9f; // 透明度
        dialogWindow.setAttributes(lp);
       /* //设置铺满
        Window window = dialog.getWindow();
        WindowManager.LayoutParams wl = window.getAttributes();
        wl.x = 0;
        wl.y = ((Activity) context).getWindowManager().getDefaultDisplay()
                .getHeight();
        wl.width = ViewGroup.LayoutParams.MATCH_PARENT;
        wl.height = ViewGroup.LayoutParams.WRAP_CONTENT;
        // 设置显示位置
        dialog.onWindowAttributesChanged(wl);*/

        iv_share_sina = (ImageView) view.findViewById(R.id.iv_share_sina);
        iv_share_qqzone = (ImageView) view.findViewById(R.id.iv_share_qqzone);
        iv_share_wxfriend = (ImageView) view.findViewById(R.id.iv_share_wxfriend);
    }

    /**
     * 设置新浪微博监听事件
     */
    public void setSinaClickListener(View.OnClickListener clickListener){
        iv_share_sina.setOnClickListener(clickListener);
    }
    /**
     * 设置QQ空间监听事件
     */
    public void setQQZoneClickListener(View.OnClickListener clickListener){
        iv_share_qqzone.setOnClickListener(clickListener);
    }
    /**
     * 设置微信朋友圈监听事件
     */
    public void setWXFriendClickListener(View.OnClickListener clickListener){
        iv_share_wxfriend.setOnClickListener(clickListener);
    }
    public void show(){
        dialog.show();
    }
    public void dismiss(){
        dialog.dismiss();
    }
}

对话框如图示;

Paste_Image.png

5.2 ShareSDK初始化

在需要activity分享界面,或者在MainActivity的OnCreate()函数中进行初始化

//ShareSDK初始化
ShareSDK.initSDK(mActivity);

5.3 获取和保存当前屏幕的截图,用以第三方的分享

作为第三方分享的一个点,如何将屏幕的截图,通过新浪微博一键分享到微博中。

/**
 * 获取和保存当前屏幕的截图
 * 用以第三方分享
 */
private Bitmap GetandSavaCurrentImage(Activity activity) {
    // 1.获取windows中最顶层的view
    View view = activity.getWindow().getDecorView();
    view.buildDrawingCache();

    // 2.获取状态栏高度
    Rect rect = new Rect();
    view.getWindowVisibleDisplayFrame(rect);
    int statusBarHeights = rect.top;
    Display display = activity.getWindowManager().getDefaultDisplay();

    // 3.获取屏幕宽和高
    int widths = display.getWidth();
    int heights = display.getHeight();

    // 4.允许当前窗口保存缓存信息
    view.setDrawingCacheEnabled(true);

    // 5.去掉状态栏
    Bitmap bmp = Bitmap.createBitmap(view.getDrawingCache(), 0,
            statusBarHeights, widths, heights - statusBarHeights);

    // 销毁缓存信息
    view.destroyDrawingCache();

    return bmp;
}

/**
 * 将截取的图片保存到sdcard中并且命名
 */
private void saveToSD(Bitmap bmp, String fileName) {
    //判断SD卡是否存在
    if (hasSdcard()){
        Log.i("wzl", "存储卡存在,可以调用。");
        try {
            File file = new File(fileName);
            if (!file.exists()){
                file.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(file);
            if (null != fos){
                // 第一参数是图片格式,第二个是图片质量,第三个是输出流
                bmp.compress(Bitmap.CompressFormat.PNG, 100, fos);
                // 用完关闭
                fos.flush();
                fos.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

/**
 * @return 检查是否存在SDcard
 */
public static boolean hasSdcard(){
    String sdcardstate = Environment.getExternalStorageState();
    if (sdcardstate.equals(Environment.MEDIA_MOUNTED)) {
        //有存储的SDCard
        return true;
    } else {
        Log.i("wzl", "没有检测到SDCard!");
        return false;
    }
}

5.4 监听事件

点击新浪微博,直接弹出图文分享界面,所需要的图片为对于当前屏幕的截图,同时加载自己添加的文字以及网址链接,这部分可以作为APP分享的网址下载链接,下列代码也给出了新浪微博分享的一些其他使用案例,可以根据个人喜好或者项目的实际需求进行更改;

/**
  *
  * 在弹出的9宫格分享页面中,会有很多平台,如果有些平台不希望显示,可以有两种方法,
    1.删除项目引用的两个工程之一的MainLibs目录下的libs里面对应的平台的jar包,删除九格宫不要的平台,只要删除对应平台的jar就行
    2.配置ShareSDK.conf文件,不想显示的平台设置Enable="false"
  */
    /**
     * ShareSDK集成方法有两种

     * 1、第一种是引用方式,例如引用onekeyshare项目,onekeyshare项目再引用mainlibs库

     * 2、第二种是把onekeyshare和mainlibs集成到项目中,本例子就是用第二种方式
     请看“ShareSDK
     * 使用说明文档”,SDK下载目录中
     或者看网络集成文档
     * http://wiki.sharesdk.cn/Android_%E5%BF%AB
     * %E9%80%9F%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97
     * 3、混淆时,把sample或者本例子的混淆代码copy过去,在proguard-project.txt文件中
     *
     * 平台配置信息有三种方式: 1、在我们后台配置各个微博平台的key
     * 2、在代码中配置各个微博平台的key,http://sharesdk.cn/androidDoc
     * /cn/sharesdk/framework/ShareSDK.html
     * 3、在配置文件中配置,本例子里面的assets/ShareSDK.xml,
     */

    private void showShare() {
        //实例化一个OnekeyShare对象
        OnekeyShare oks = new OnekeyShare();
        // 分享时Notification的图标和文字  2.5.9以后的版本不调用此方法
        //oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
        //关闭sso授权
        oks.disableSSOWhenAuthorize();
        //指定微博平台,如果不添加这行,则弹出9宫格供用户选择
        oks.setPlatform(SinaWeibo.NAME);
        //分享内容的标题
        // title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
//        oks.setTitle("新浪微博分享");
        // titleUrl是标题的对应的网址链接,仅在人人网和QQ空间使用,如果没有可以不设置
//        oks.setTitleUrl("http://sharesdk.cn");
        //分享网络图片,新浪微博分享网络图片需要通过审核后申请高级写入接口,否则请注释掉测试新浪微博
        //分享网络图片,新浪分享网络图片,需要申请高级权限,否则会报10014的错误
        //权限申请:新浪开放平台-你的应用中-接口管理-权限申请-微博高级写入接口-statuses/upload_url_text
        //注意:本地图片和网络图片,同时设置时,只分享本地图片
        //oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
        oks.setImagePath(fileName);
        //是否直接分享(true则直接分享),false是有九格宫,true没有
        oks.setSilent(false);
        //Platform.ShareParams sina_weibo = new Platform.ShareParams();
        //sina_weibo.setText("第一次分享" + " " + "www.baidu.com");
        //imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
        //sina_weibo.setImagePath("/sdcard/share_pic.jpg");//确保SDcard下面存在此张图片
        /*oks.setShareContentCustomizeCallback(new ShareContentCustomizeCallback() {
            @Override
            public void onShare(Platform platform, Platform.ShareParams paramsToShare) {
                if(SinaWeibo.NAME.equals(platform.getName())) {
                    paramsToShare.setText("初始使用" + " " + "http://www.baidu.com");
                    paramsToShare.setUrl(null);
                }
            }
        });*/
        //设置分享的文本内容,所有平台都需要这个字段
        oks.setText("新浪微博第一次分享" + " " + "http://www.baidu.com");
        //url仅在微信(包括好友和朋友圈)中使用
//        oks.setUrl("http://sharesdk.cn");
        // comment是我对这条分享的评论,仅在人人网和QQ空间使用
        //oks.setComment("我是测试评论文本");
        // site是分享此内容的网站名称,仅在QQ空间使用
        //oks.setSite("ShareSDK");
        // siteUrl是分享此内容的网站地址,仅在QQ空间使用
        //oks.setSiteUrl("http://sharesdk.cn");

        /*oks.setShareContentCustomizeCallback(new ShareContentCustomizeCallback() {
            @Override
            public void onShare(Platform platform, Platform.ShareParams paramsToShare) {
                if (SinaWeibo.NAME.equals(platform.getName())) {
                    paramsToShare.setText("分享文本" + " " + "www.baidu.com");
                    paramsToShare.setUrl(null);
                }
            }
        });*/
        oks.setCallback(new PlatformActionListener() {
            @Override
            public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
                //分享完成
                Message msg = new Message();
                msg.what = MSG_ACTION_CCALLBACK;
                msg.arg1 = 1;
                msg.obj = platform;
                handler.sendMessage(msg);
            }

            @Override
            public void onError(Platform platform, int i, Throwable throwable) {
                //分享失败
                throwable.printStackTrace();
                Message msg = new Message();
                msg.what = MSG_ACTION_CCALLBACK;
                msg.arg1 = 2;
                msg.obj = throwable;
                handler.sendMessage(msg);
            }

            @Override
            public void onCancel(Platform platform, int i) {
                //分享取消
                Message msg = new Message();
                msg.what = MSG_ACTION_CCALLBACK;
                msg.arg1 = 3;
                msg.obj = platform;
                handler.sendMessage(msg);
            }
        });
        oks.show(mActivity);
    }

6. 新浪微博实例分享


在正确使用shareSDK后,点击新浪微博的图形按钮,会弹出如下图的图文分享框,输入文字即可完成。
如图示

Paste_Image.png

备注:如若分享网址链接,必须加上“http://”, 否则分享出去的仅是www.baidu.com

登录
授权
分享成功

备注:分享成功后,会有响应提示,需自行添加,登录新浪微博,即可看到个人信息中的分享,因为未未上线,因此“来自未通过审核应用”,当点击“百度”,即可进行界面跳转

成功分享

通过以上的核心部分的讲解,应该对新浪微博的分享有了基本的认识和使用能力。具体的细节,如如何创建界面,按钮,查询没有做过多的讲解。如果有需要,可以直接给我发简信,或者留言。

此外,针对上述的知识有不明白,异议,亦或是不正确的地方,还请帮忙指正,谢谢。

如果觉得本文对你有帮助,请不要吝啬你的赞赏

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容