Android实现新浪微博一键分享的实例代码
写在本章前
愈来愈多的app支持一键分享至qq空间、微信朋友圈、新浪微博的功能,同时支持第三方账号登录,如qq、微信、新浪微博等第三方平台的账号。本章结合当下流行的设计,兼顾免费的开源sharesdk,结合项目中的实际需求,整合出一套分享源码,版权所有,如需转载请注明转载地址。
1. 开发环境及sdk下载
开发工具:android studio2.1.3版本
sharesdk:mob官网()下载最新社会化分享sharesdk2.7.7版本,解压如图示
进入sharesdk for android文件,找到quickintegrater.jar文件,根据官网介绍双击打开,根据需求集成第三方平台,在某些情况如若双击无法打开,windows系统下,进入cmd找到quickintegrater.jar所在的当前目录,键入java -jar quickintegrater.jar,根据实际需求集成第三方平台,最后生成sample的文件夹,包括需要使用到的libs等文件
复制新生成文件夹sample下面的全部内容到自己所建立的project下,同时需要对加入到libs的jar文件添加库依赖
mob进入后台,申请分享使用权限,获取app key和app secret
将申请到的app key替换
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)登录,申请,填写账号,申请注册等信息,以个人为例,在申请结束后,获取“微连接”权限,点击“立即创建微连接”;
2)填写应用名称,勾选应用平台,以android为例;
3)确认提交即可获取app key和secret
4)新浪微博获取app的android包名和签名
5)通过进入申请的应用名称“android实例”app下的androidmanifest.xml中获取包名;
6)android签名的获取
通过4)中新浪微博提供的签名工具,github下载的“app_signatures.apk”,安装到手机,同时将app“android实例”安装到手机,输入android包名,即可生成对应的android签名
7)新浪微博测试权限
需要注意的是,此时并没有对app进行上线,并没有通过审核,暂时只有测试权限可以关联15个测试账号使用;
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(); } }
对话框如图示;
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后,点击新浪微博的图形按钮,会弹出如下图的图文分享框,输入文字即可完成。
如图示
备注:如若分享网址链接,必须加上“http://”, 否则分享出去的仅是www.baidu.com
登录
授权
分享成功
备注:分享成功后,会有响应提示,需自行添加,登录新浪微博,即可看到个人信息中的分享,因为未未上线,因此“来自未通过审核应用”,当点击“百度”,即可进行界面跳转
成功分享
通过以上的核心部分的讲解,应该对新浪微博的分享有了基本的认识和使用能力。具体的细节,如如何创建界面,按钮,查询没有做过多的讲解。如果有需要,可以直接给我发简信,或者留言。
此外,针对上述的知识有不明白,异议,亦或是不正确的地方,还请帮忙指正,谢谢。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。