安卓集成友盟登陆分享(附带源码)
2017-08-02 11:37
253 查看
我知道没图你是不会看的:
下载友盟的登陆分享SDK,
http://dev.umeng.com/social/android/quick-integration
工程配置的步骤请参考友盟
大致为 申请友盟账号,获取友盟的appKey
然后根据需要把相应的activity 以及权限在清单文件中注册
然后在全局的application中
有些人分享的时候,底部可能会出现友盟社会化分享 ,这是因为你当前使用的这些各个平台的appid 和appsecret是友盟注册的,你替换成自己注册的appid 和appsecret就OK了
注意!!!涉及到微信 相关的。需要在微信开发者平台填写自己应用的包名和签名, 否则调不出来微信,一闪而过。应用签名可以用debug版本的 ,亲测。上线后,改成release 版本。 同理: 微博授权登陆也需要在微博平台填写应用的包名和签名。
友盟的分享一般采用两种方式:一种是带面板,一种是不带面板 ,带面板就是用他原生的分享界面,不带面板就是可以自定义分享界面的样式
打开分享面板的代码:
不带分享面板的代码:
我这里采用的是不带面板的方式,这样可以自定义分享的界面,比如我的这个分享界面就是仿照ios的
当用户点击一键分享的时候,弹出一个自定义的dialog ,并且给这dialog设置一个布局样式
以上。
这样一个自定义的dialog就完成了
因为dialog的布局 是gridView ,所以需要对gridView惊醒填充,可以通过网络获取需要填充的渠道,也可以写在本地,我这里是写在了本地对gridView进行填充
-------------------------------------------------------------分享更多--------------------------------------------------
这里是获取到手机的所有应用
-------------------------------------------------------------登陆--------------------------------------------------------
登陆其实就是一个授权的过程,拿微信举例,用户同意后, 会获取到一个code 根据code 可以获取到access_token 和refresh_token
然后根据token 可以获取用户的基本信息,反正第三方登陆的目的就是获取用户的基本信息 头像 昵称等,这里友盟封装好了一个方法直接获取用户的基本信息:
授权的回掉
退出登陆:就是取消授权的过程
--------------------------------------------------------------------------以上-------------------------------------------------------------------------
源码链接:https://github.com/zq019633/UMLogin
说完了,放松一下
下载友盟的登陆分享SDK,
http://dev.umeng.com/social/android/quick-integration
工程配置的步骤请参考友盟
大致为 申请友盟账号,获取友盟的appKey
<meta-data android:name="UMENG_APPKEY" android:value="597584ec8f4a9d059e00124e" > </meta-data>
然后根据需要把相应的activity 以及权限在清单文件中注册
然后在全局的application中
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); Config.DEBUG = true; UMShareAPI.get(this); } { PlatformConfig.setWeixin("wx214ad894fe5a2049", "d4624c36b6795d1d99dcf0547af5443d"); //豆瓣RENREN平台目前只能在服务器端配置 PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad", "http://sns.whalecloud.com"); PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba"); } }
有些人分享的时候,底部可能会出现友盟社会化分享 ,这是因为你当前使用的这些各个平台的appid 和appsecret是友盟注册的,你替换成自己注册的appid 和appsecret就OK了
注意!!!涉及到微信 相关的。需要在微信开发者平台填写自己应用的包名和签名, 否则调不出来微信,一闪而过。应用签名可以用debug版本的 ,亲测。上线后,改成release 版本。 同理: 微博授权登陆也需要在微博平台填写应用的包名和签名。
友盟的分享一般采用两种方式:一种是带面板,一种是不带面板 ,带面板就是用他原生的分享界面,不带面板就是可以自定义分享界面的样式
打开分享面板的代码:
new ShareAction(MainActivity.this) .withText("hello") .setDisplayList(SHARE_MEDIA.SINA,SHARE_MEDIA.QQ,SHARE_MEDIA.WEIXIN) .setCallback(umShareListener) .open();
不带分享面板的代码:
new ShareAction(MainActivity.this) .setPlatform(SHARE_MEDIA.QQ)//传入平台 .withText("hello")//分享内容 .setCallback(umShareListener)//回调监听器 .share();
我这里采用的是不带面板的方式,这样可以自定义分享的界面,比如我的这个分享界面就是仿照ios的
当用户点击一键分享的时候,弹出一个自定义的dialog ,并且给这dialog设置一个布局样式
private void showDialog() { d = new Dialog(MainActivity.this, R.style.customDialog); d.requestWindowFeature(Window.FEATURE_PROGRESS); d.setCanceledOnTouchOutside(true); d.setCancelable(true); d.setContentView(R.layout.dialog_share_app); Window dialogWindow = d.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); lp.width = ViewGroup.LayoutParams.MATCH_PARENT; dialogWindow.setGravity(Gravity.BOTTOM); dialogWindow.setAttributes(lp); initDialog(d); d.show(); } /** * 初始化分享的dialog * @param d */ private void initDialog(final Dialog d) { gridView = (GridView) d.findViewById(R.id.gridView); diss = (Button) d.findViewById(R.id.btn_dismiss); diss.setOnClickListener(this); ZQAdapter zqAdapter = new ZQAdapter(imageViews, list, MainActivity.this); gridView.setAdapter(zqAdapter); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (position == 0) { share(SHARE_MEDIA.WEIXIN); } else if (position == 1) { share(SHARE_MEDIA.WEIXIN_CIRCLE); } else if (position == 2) { share(SHARE_MEDIA.QQ); } else if (position == 3) { share(SHARE_MEDIA.QZONE); } else if (position == 4) { share(SHARE_MEDIA.SINA); } else if (position == 5) { showMoreDialog(); } } }); hideDialog(d); }
以上。
<?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright ©2016 Eli Lilly and Company. All rights reserved. --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp" android:background="#00ffffff"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/f_shape_light_gray_bg" android:padding="10dp"> <GridView android:layout_width="match_parent" android:layout_height="wrap_content" android:numColumns="3" android:id="@+id/gridView"/> </LinearLayout> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/btn_dismiss" android:layout_marginTop="10dp" android:background="@drawable/f_shape_light_gray_bg" android:text="取消分享" android:textColor="#1C86EE" /> </LinearLayout>还有自定义一个shape文件
<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- 填充的颜色 --> <solid android:color="#F9F9F9" /> <!-- 设置按钮的四个角为弧形 --> <!-- android:radius 弧形的半径 --> <corners android:topLeftRadius="6dp" android:bottomLeftRadius="6dp" android:topRightRadius="6dp" android:bottomRightRadius="6dp"/> <!-- padding:Button里面的文字与Button边界的间隔 --> <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" /> </shape>
这样一个自定义的dialog就完成了
因为dialog的布局 是gridView ,所以需要对gridView惊醒填充,可以通过网络获取需要填充的渠道,也可以写在本地,我这里是写在了本地对gridView进行填充
list = new ArrayList<>(); list.add("微信分享"); list.add("朋友圈分享"); list.add("QQ分享"); list.add("QQ空间分享"); list.add("微博分享"); list.add("更多"); imageViews = new ArrayList<>(); imageViews.add(R.drawable.umeng_socialize_wechat); imageViews.add(R.drawable.umeng_socialize_wxcircle); imageViews.add(R.drawable.umeng_socialize_qq); imageViews.add(R.drawable.umeng_socialize_qzone); imageViews.add(R.drawable.umeng_socialize_sina); imageViews.add(R.drawable.umeng_socialize_more);填充完成后,需要对每个条目设置点击事件,确保点击后分享到相应的渠道
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (position 4000 == 0) { share(SHARE_MEDIA.WEIXIN); } else if (position == 1) { share(SHARE_MEDIA.WEIXIN_CIRCLE); } else if (position == 2) { share(SHARE_MEDIA.QQ); } else if (position == 3) { share(SHARE_MEDIA.QZONE); } else if (position == 4) { share(SHARE_MEDIA.SINA); } else if (position == 5) { showMoreDialog(); } } });share 是我自定义的一个方法 ,把渠道名称传递过去。然后调用友盟分享的api , 我采用的是不带友盟系统面板的
private void share(SHARE_MEDIA zq) { UMWeb web = new UMWeb("http://www.ciweek.com"); web.setTitle("来自"); web.setDescription("来自..."); web.setThumb(new UMImage(MainActivity.this, R.mipmap.ic_launcher)); new ShareAction(MainActivity.this) .setPlatform(zq) .withMedia(web) .setCallback(umShareListener)//回调监听器 .share(); }回掉的监听器
//分享的回掉 private UMShareListener umShareListener = new UMShareListener() { @Override public void onStart(SHARE_MEDIA share_media) { } @Override public void onResult(SHARE_MEDIA platform) { if (platform.name().equals("WEIXIN_FAVORITE")) { Toast.makeText(MainActivity.this, " 收藏成功啦", Toast.LENGTH_SHORT).show(); } else { if (platform != SHARE_MEDIA.MORE && platform != SHARE_MEDIA.SMS && platform != SHARE_MEDIA.EMAIL && platform != SHARE_MEDIA.FLICKR && platform != SHARE_MEDIA.FOURSQUARE && platform != SHARE_MEDIA.TUMBLR && platform != SHARE_MEDIA.POCKET && platform != SHARE_MEDIA.PINTEREST && platform != SHARE_MEDIA.INSTAGRAM && platform != SHARE_MEDIA.GOOGLEPLUS && platform != SHARE_MEDIA.YNOTE && platform != SHARE_MEDIA.EVERNOTE) { Toast.makeText(MainActivity.this, " 分享成功啦", Toast.LENGTH_SHORT).show(); } } } @Override public void onError(SHARE_MEDIA platform, Throwable t) { if (platform != SHARE_MEDIA.MORE && platform != SHARE_MEDIA.SMS && platform != SHARE_MEDIA.EMAIL && platform != SHARE_MEDIA.FLICKR && platform != SHARE_MEDIA.FOURSQUARE && platform != SHARE_MEDIA.TUMBLR && platform != SHARE_MEDIA.POCKET && platform != SHARE_MEDIA.PINTEREST && platform != SHARE_MEDIA.INSTAGRAM && platform != SHARE_MEDIA.GOOGLEPLUS && platform != SHARE_MEDIA.YNOTE && platform != SHARE_MEDIA.EVERNOTE) { Toast.makeText(MainActivity.this, " 分享失败啦", Toast.LENGTH_SHORT).show(); if (t != null) { Log.d("throw", "throw:" + t.getMessage()); } } } @Override public void onCancel(SHARE_MEDIA platform) { Toast.makeText(MainActivity.this, " 分享取消了", Toast.LENGTH_SHORT).show(); } };这样 分享就完成了
-------------------------------------------------------------分享更多--------------------------------------------------
这里是获取到手机的所有应用
private ArrayList<AppInfo> getShareAppList() { ArrayList<AppInfo> shareAppInfos = new ArrayList<>(); PackageManager packageManager = getPackageManager(); List<ResolveInfo> resolveInfos = getShareApps(MainActivity.this); if (null == resolveInfos) { return null; } else { for (ResolveInfo resolveInfo : resolveInfos) { AppInfo appInfo = new AppInfo(); appInfo.setPkgName(resolveInfo.activityInfo.packageName); appInfo.setLaunchClassName(resolveInfo.activityInfo.name); appInfo.setAppName(resolveInfo.loadLabel(packageManager).toString()); appInfo.setAppIcon(resolveInfo.loadIcon(packageManager)); shareAppInfos.add(appInfo); } } return shareAppInfos; } //获取手机中所有能分享的app public List<ResolveInfo> getShareApps(Context context) { List<ResolveInfo> mApps; Intent intent = new Intent(Intent.ACTION_SEND, null); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setType("text/plain"); PackageManager pManager = context.getPackageManager(); mApps = pManager.queryIntentActivities(intent, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); return mApps; }然后存到集合中,在上边的gridView 点击 更多的时候,再次弹出一个一样的dialog 把集合中的应用填充到更多的 dialog中
-------------------------------------------------------------登陆--------------------------------------------------------
登陆其实就是一个授权的过程,拿微信举例,用户同意后, 会获取到一个code 根据code 可以获取到access_token 和refresh_token
然后根据token 可以获取用户的基本信息,反正第三方登陆的目的就是获取用户的基本信息 头像 昵称等,这里友盟封装好了一个方法直接获取用户的基本信息:
UMShareAPI.get(MainActivity.this).getPlatformInfo(MainActivity.this, zq, authListener);
授权的回掉
//获取授权的回掉 UMAuthListener authListener = new UMAuthListener() { /** * @desc 授权开始的回调 * @param platform 平台名称 */ @Override public void onStart(SHARE_MEDIA platform) { } /** * @desc 授权成功的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 * @param data 用户资料返回 */ @Override public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) { Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_LONG).show(); android.util.Log.e("Map", "=" + data); if (platform == SHARE_MEDIA.WEIXIN) { String name = data.get("screen_name"); String profile_image_url = data.get("profile_image_url"); String gender = data.get("gender"); sex.setText(gender); nickName.setText(name); Picasso.with(MainActivity.this).load(profile_image_url).into(headUrl); wx_ll.setVisibility(View.GONE); qq_ll.setVisibility(View.GONE); sina_ll.setVisibility(View.GONE); all_ll.setVisibility(View.VISIBLE); back_rl.setVisibility(View.VISIBLE); } else if (platform == SHARE_MEDIA.QQ) { String qqName = data.get("screen_name"); String profile_image_url = data.get("profile_image_url"); String gender = data.get("gender"); sex.setText(gender); Picasso.with(MainActivity.this).load(profile_image_url).into(headUrl); nickName.setText(qqName); wx_ll.setVisibility(View.GONE); qq_ll.setVisibility(View.GONE); sina_ll.setVisibility(View.GONE); all_ll.setVisibility(View.VISIBLE); back_rl.setVisibility(View.VISIBLE); } } /** * @desc 授权失败的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 * @param t 错误原因 */ @Override public void onError(SHARE_MEDIA platform, int action, Throwable t) { Toast.makeText(MainActivity.this, "失败:" + t.getMessage(), Toast.LENGTH_LONG).show(); } /** * @desc 授权取消的回调 * @param platform 平台名称 * @param action 行为序号,开发者用不上 */ @Override public void onCancel(SHARE_MEDIA platform, int action) { Toast.makeText(MainActivity.this, "取消了", Toast.LENGTH_LONG).show(); } };拿到基本信息后,再回掉中进行相应的设置
退出登陆:就是取消授权的过程
UMShareAPI.get(MainActivity.this).deleteOauth(MainActivity.this, SHARE_MEDIA.WEIXIN, outAuthListener);同样 在回掉中把之前设置的头像昵称等内容置空
--------------------------------------------------------------------------以上-------------------------------------------------------------------------
public void onClick(View v) { switch (v.getId()) { //-----------------------------登陆 先进行授权----------------------------- case R.id.wx_ll: login(SHARE_MEDIA.WEIXIN); break; case R.id.qq_ll: login(SHARE_MEDIA.QQ); break; case R.id.sina_ll: login(SHARE_MEDIA.SINA); break; //-----------------------------登陆 先进行授权----------------------------- //-------------退出登陆--------- case R.id.back_rl: out(); break; //-------------退出登陆--------- //------------------------------分享----------------------------------- case R.id.wx_share: share(SHARE_MEDIA.WEIXIN); break; case R.id.pyq_share: share(SHARE_MEDIA.WEIXIN_CIRCLE); break; case R.id.wx_fav: share(SHARE_MEDIA.WEIXIN_FAVORITE); break; case R.id.qq_share: share(SHARE_MEDIA.QQ); break; case R.id.qzone_share: share(SHARE_MEDIA.QZONE); break; case R.id.weibo_share: share(SHARE_MEDIA.SINA); break; //------------------------------分享----------------------------------- case R.id.all: shareAppList = getShareAppList(); for (int i = 0; i < shareAppList.size(); i++) { android.util.Log.e("app", "appName" + shareAppList.get(i).getAppName()); } break; case R.id.share: //弹出对话框 showDialog(); break;
源码链接:https://github.com/zq019633/UMLogin
说完了,放松一下
相关文章推荐
- 友盟第三方登陆,及分享,使用工具集成。
- 友盟集成登陆、分享、数据统计
- Android中集成QQ登陆和QQ好友分享及QQ空间分享
- 从零开始学新浪微博分享和第三方登陆(附源码下载)
- iOS集成友盟第三方分享
- Android- 友盟社会化分享【5.0版本集成文档】
- 通用社区登陆组件技术分享(开源)中篇:OAuth 登陆组件流程及组件集成方法
- 通用社区登陆组件技术分享(开源)中篇:OAuth 登陆组件流程及组件集成方法
- 安卓高级9 shareSDK 第三方登陆和分享Mob
- 分享一个高仿糗事百科APP的安卓源码 +服务端和数据库
- 安卓学习笔记---友盟分享的坑
- python模拟登陆csdn及其注意事项,附带源码
- 关于使用友盟第三方平台集成第三方分享
- 通用社区登陆组件技术分享(开源)下篇:OAuth 源码下载及原理解说
- android最全学习资料及路线整理分享 (安卓视频教程 从入门到大师 android开发环境搭建 windows和MAC 安卓源码大全4000套)
- 2017可赚钱的共享影院安卓APP源码分享
- 使用友盟来实现第三方的分享,登陆
- android登陆界面保存账号密码附带源码
- 安卓本地轻量级数据库操作框架 greenDao3.2.2 详细教程附带Demo①——集成环境,开辟难题。
- 友盟的常见使用----三方登陆、分享和“埋点”(友盟统计)