写在本章前
愈来愈多的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等文件
复制新生成文件夹Sample下面的全部内容到自己所建立的project下,同时需要对加入到libs的jar文件添加库依赖
Mob进入后台,申请分享使用权限,获取APP key和APP secret
将申请到的APP key替换
2. 配置AndroidManifest.xml
3. 添加必要的activity信息
备注:上述代码中,有关于微信和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, HashMaphashMap) { //分享完成 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
备注:分享成功后,会有响应提示,需自行添加,登录新浪微博,即可看到个人信息中的分享,因为未未上线,因此“来自未通过审核应用”,当点击“百度”,即可进行界面跳转
通过以上的核心部分的讲解,应该对新浪微博的分享有了基本的认识和使用能力。具体的细节,如如何创建界面,按钮,查询没有做过多的讲解。如果有需要,可以直接给我发简信,或者留言。
此外,针对上述的知识有不明白,异议,亦或是不正确的地方,还请帮忙指正,谢谢。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。