在这里我用的是友盟的登录,需要的请参考本文,直接撸代码,
提示:微信登录在一段时间内,只授权一次(只能调起一次登录页面),除非更换用户,才可以再调起登录页面。
0、本文需要导入jar包导完后鼠标右键Add Library,之后再build gradle中应该是这样的
jar包的地址
https://download.csdn.net/download/jing_80/10768648
//友盟
compile 'com.umeng.sdk:common:latest.integration'//可能的自己添加
implementation files('libs/SocialSDK_Sina_Simplify.jar')
implementation files('libs/SocialSDK_QQ_Simplify.jar')
implementation files('libs/SocialSDK_WeChat_Simplify.jar')
implementation files('libs/umeng_social_api.jar')
implementation files('libs/umeng_social_net.jar')
implementation files('libs/umeng_social_shareview.jar')
implementation files('libs/umeng_social_tool.jar')
1、添加权限(还是老样子,缺什么权限,自己添加呢)
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
2、manifest中添加
<!--基本信息配置-->
<meta-data
android:name="UMENG_APPKEY"
android:value="友盟APPKey" />
<meta-data
android:name="UMENG_CHANNEL"
android:value="可甜可盐(如果无多渠道打包,可不填)" />
<!--微信-->
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!--新浪-->
<activity
android:name="com.umeng.socialize.media.WBShareCallBackActivity"
android:configChanges="keyboardHidden|orientation"
android:exported="false"
android:theme="@android:style/Theme.Translucent.NoTitleBar"></activity>
<activity
android:name="com.sina.weibo.sdk.web.WeiboSdkWebActivity"
android:configChanges="keyboardHidden|orientation"
android:exported="false"
android:windowSoftInputMode="adjustResize" />
<activity
android:name="com.sina.weibo.sdk.share.WbShareTransActivity"
android:launchMode="singleTask"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen">
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!--QQ-->
<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" />
<!--填应用的Appid-->
<data android:scheme="tencentxxxxxxxx" />
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
3、在application中注册自己的App(像这样)
<application
android:name=".utils.App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
4、App中的内容
public class App extends Application {
public static AppCompatActivity context;
@Override
public void onCreate() {
super.onCreate();
// 友盟分享
UMConfigure.init(this, "友盟Appkey", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, null);
}
{
//这些值在各个开发平台注册应用时,会提供的,去相应的开发平台找就可以了
PlatformConfig.setWeixin("Appid微信平台有", "secret找项目经理要");
PlatformConfig.setQQZone("id", "key值");
PlatformConfig.setSinaWeibo("key", "secret", "http://sns.whalecloud.com");
}
}
5、在wxapi包下建类WXEntryActivity,一定得是wxapi包下,类中什么都不用写,umeng帮我们封装好了
import com.umeng.weixin.callback.WXCallbackActivity;
public class WXEntryActivity extends WXCallbackActivity {
}
6、动态权限,手机大于6.0可能需要用到,
if (Build.VERSION.SDK_INT >= 23) {
String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CALL_PHONE, Manifest.permission.READ_LOGS, Manifest.permission.READ_PHONE_STATE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.SET_DEBUG_APP, Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.GET_ACCOUNTS, Manifest.permission.WRITE_APN_SETTINGS};
ActivityCompat.requestPermissions(this, mPermissionList, 123);
}
登录
7、在哪个页面实现登录,就在哪里写这些代码
private UMAuthListener umAuthListener = new UMAuthListener() {
@Override
public void onStart(SHARE_MEDIA platform) {
//授权开始的回调
}
@Override
public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> map) {
Toast.makeText(getApplicationContext(), "Authorize succeed", Toast.LENGTH_SHORT).show();
// String uid = map.get("uid");//获取用户id
// String name = map.get("name");//获取用户昵称
// String gender = map.get("gender");//获取用户性别
// String iconurl = map.get("iconurl");//获取用户头像地址
String openid = map.get("openid");
Log.d("ThirdActivity", openid);
}
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show();
}
};
//这个方法的作用 当第一次登录成功时 第二次就不会跳入登录页面
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
if (requestCode == 123) {
Toast.makeText(this, "授权成功", Toast.LENGTH_SHORT).show();
}
}
8、接下来实现登录功能
switch (view.getId()) {
//微信
case R.id.mThird_WeChat:
UMShareAPI.get(this).getPlatformInfo(this, SHARE_MEDIA.WEIXIN, umAuthListener);
break;
//QQ
case R.id.mThird_QQ:
UMShareAPI.get(this).getPlatformInfo(this, SHARE_MEDIA.QQ, umAuthListener);
break;
//微博
case R.id.mThird_Weibo:
UMShareAPI.get(this).getPlatformInfo(this, SHARE_MEDIA.SINA, umAuthListener);
break;
}
}
好了,这样就实现登录功能了。
8、附上效果图:
分享(我写了一些工具类,直接分享出来吧)
1、value的styles文件中:
<style name="AlertDialogStyle" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowFrame">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
2、res的drawable中sk_bg_image_dialog
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/white" />
<corners android:radius="14dp" />
</shape>
3、布局文件sk_view_share
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_dialog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:background="@drawable/sk_bg_image_dialog"
android:gravity="center_horizontal"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="18dp"
android:layout_marginBottom="14dp"
android:text="分享至"
android:textColor="#FF3F4A54"
android:textSize="14sp" />
<LinearLayout
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_marginRight="13dp"
android:orientation="horizontal"
android:weightSum="3">
<TextView
android:id="@+id/tv_weChat"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_weight="1"
android:drawableTop="@mipmap/icon_wechat"
android:drawablePadding="4dp"
android:gravity="center_horizontal"
android:text="微信"
android:textColor="#333333"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_circle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_weight="1"
android:drawableTop="@mipmap/icon_circle"
android:drawablePadding="4dp"
android:gravity="center_horizontal"
android:text="朋友圈"
android:textColor="#333333"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_qq"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_weight="1"
android:drawableTop="@mipmap/icon_qq"
android:drawablePadding="4dp"
android:gravity="center_horizontal"
android:text="QQ"
android:textColor="#333333"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_marginTop="20dp"
android:layout_marginRight="13dp"
android:layout_marginBottom="21dp"
android:orientation="horizontal"
android:weightSum="3">
<TextView
android:id="@+id/tv_weibo"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_weight="1"
android:drawableTop="@mipmap/icon_weibo"
android:drawablePadding="4dp"
android:gravity="center_horizontal"
android:text="新浪微博"
android:textColor="#333333"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_space"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_weight="1"
android:drawableTop="@mipmap/icon_space"
android:drawablePadding="4dp"
android:gravity="center_horizontal"
android:text="QQ空间"
android:textColor="#333333"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_link"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_weight="1"
android:drawableTop="@mipmap/icon_link"
android:drawablePadding="4dp"
android:gravity="center_horizontal"
android:text="复制链接"
android:textColor="#333333"
android:textSize="12sp" />
</LinearLayout>
<include layout="@layout/include_view_line" />
<TextView
android:id="@+id/tv_cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:paddingLeft="16dp"
android:paddingTop="11dp"
android:paddingRight="16dp"
android:paddingBottom="11dp"
android:text="取消分享"
android:textColor="#888888"
android:textSize="17sp" />
</LinearLayout>
4、防止快速点击的工具类NoFastClickUtils
public class NoFastClickUtils {
private static long lastClickTime = 0;//上次点击的时间
private static int spaceTime = 500;//时间间隔
public static boolean isFastClick() {
long currentTime = System.currentTimeMillis();//当前系统时间
boolean isAllowClick;//是否允许点击
if (currentTime - lastClickTime > spaceTime) {
isAllowClick = false;
} else {
isAllowClick = true;
}
lastClickTime = currentTime;
return isAllowClick;
}
public static boolean isFastClick(int time) {
long currentTime = System.currentTimeMillis();//当前系统时间
boolean isAllowClick;//是否允许点击
if (currentTime - lastClickTime > time) {
isAllowClick = false;
} else {
isAllowClick = true;
}
lastClickTime = currentTime;
return isAllowClick;
}
}
5、分享的View(ShareDialog)
public class ShareDialog implements View.OnClickListener {
private Context context;
private Dialog dialog;
private Display display;
private LinearLayout ll_dialog;
private TextView tv_weChat;
private TextView tv_circle;
private TextView tv_qq;
private TextView tv_weibo;
private TextView tv_space;
private TextView tv_link;
private TextView tv_cancel;
private String title, contentUrl, content;
private UMImage image;
public ShareDialog(Context context) {
this.context = context;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
display = windowManager.getDefaultDisplay();
}
public ShareDialog builder() {
View view = LayoutInflater.from(context).inflate(R.layout.sk_view_share, null);
ll_dialog = view.findViewById(R.id.ll_dialog);
tv_weChat = view.findViewById(R.id.tv_weChat);
tv_circle = view.findViewById(R.id.tv_circle);
tv_qq = view.findViewById(R.id.tv_qq);
tv_weibo = view.findViewById(R.id.tv_weibo);
tv_space = view.findViewById(R.id.tv_space);
tv_link = view.findViewById(R.id.tv_link);
tv_cancel = view.findViewById(R.id.tv_cancel);
tv_weChat.setOnClickListener(this);
tv_circle.setOnClickListener(this);
tv_qq.setOnClickListener(this);
tv_weibo.setOnClickListener(this);
tv_space.setOnClickListener(this);
tv_link.setOnClickListener(this);
tv_cancel.setOnClickListener(this);
dialog = new Dialog(context, R.style.AlertDialogStyle);
dialog.setContentView(view);
ll_dialog.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
return this;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.tv_cancel:
dialog.dismiss();
break;
case R.id.tv_weChat: // 设置微信好友分享内容
if (!NoFastClickUtils.isFastClick(800)) {
//链接url
UMWeb web = new UMWeb(contentUrl);
web.setTitle(title);//标题
web.setDescription(content);
web.setThumb(image); //缩略图
new ShareAction(App.context)
.setPlatform(SHARE_MEDIA.WEIXIN)
.setCallback(umShareListener)
.withMedia(web)
.share();
}
break;
case R.id.tv_circle:
// 设置微信朋友圈分享内容
if (!NoFastClickUtils.isFastClick(800)) {
//链接url
UMWeb web = new UMWeb(contentUrl);
web.setTitle(title);//标题
web.setDescription(content);
web.setThumb(image); //缩略图
new ShareAction(App.context)
.setPlatform(SHARE_MEDIA.WEIXIN_CIRCLE)
.setCallback(umShareListener)
.withMedia(web)
.share();
}
break;
case R.id.tv_qq:
// 设置QQ分享内容
if (!NoFastClickUtils.isFastClick(800)) {
//链接url
UMWeb web = new UMWeb(contentUrl);
web.setTitle(title);//标题
web.setDescription(content);
web.setThumb(image); //缩略图
new ShareAction(App.context)
.setPlatform(SHARE_MEDIA.QQ)
.setCallback(umShareListener)
.withMedia(web)
.share();
}
break;
case R.id.tv_weibo:
// 设置微博分享内容
if (!NoFastClickUtils.isFastClick(800)) {
UMWeb web = new UMWeb(contentUrl);
web.setTitle(title);//标题
web.setDescription(content);
web.setThumb(image); //缩略图
new ShareAction(App.context)
.setPlatform(SHARE_MEDIA.SINA)
.setCallback(umShareListener)
.withMedia(web)
.share();
}
break;
case R.id.tv_space:
// 设置微信朋友圈分享内容
if (!NoFastClickUtils.isFastClick(800)) {
UMWeb web = new UMWeb(contentUrl);
web.setTitle(title);//标题
web.setDescription(content);
web.setThumb(image); //缩略图
new ShareAction(App.context)
.setPlatform(SHARE_MEDIA.QZONE)
.setCallback(umShareListener)
.withMedia(web)
.share();
}
break;
case R.id.tv_link:
if (!NoFastClickUtils.isFastClick(800)) {
ClipboardManager mClipboardManager = (ClipboardManager) context.getSystemService(CLIPBOARD_SERVICE);
ClipData clipData = ClipData.newRawUri("Label", Uri.parse(contentUrl));
mClipboardManager.setPrimaryClip(clipData);
Toast.makeText(context, "复制完成", Toast.LENGTH_SHORT).show();
}
break;
}
}
/**
* 点击外围Dialog消失
*
* @param cancel
* @return
*/
public ShareDialog setCancelable(boolean cancel) {
dialog.setCancelable(cancel);
return this;
}
/**
* 设置标题
*
* @param title
* @return
*/
public ShareDialog setTitle(String title) {
this.title = title;
return this;
}
/**
* 设置课程介绍
*
* @param content
* @return
*/
public ShareDialog setContent(String content) {
this.content = content;
return this;
}
/**
* 设置图片
*
* @param image
* @return
*/
public ShareDialog setImage(UMImage image) {
this.image = image;
return this;
}
/**
* 设置连接
*
* @param contentUrl
* @return
*/
public ShareDialog setContentUrl(String contentUrl) {
this.contentUrl = contentUrl;
return this;
}
public void show() {
dialog.show();
}
private UMShareListener umShareListener = new UMShareListener() {
@Override
public void onStart(SHARE_MEDIA share_media) {
}
@Override
public void onResult(SHARE_MEDIA platform) {
Toast.makeText(context, "分享成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(SHARE_MEDIA platform, Throwable t) {
Log.d("分享失败", "t:" + t);
}
@Override
public void onCancel(SHARE_MEDIA platform) {
Log.d("分享取消", platform.toString());
}
};
}
6、在点击事件中调用
String share_url = 分享的url;
UMImage image = new UMImage(this, "图片链接");
new ShareDialog(this)
.builder()
.setTitle(lessonDetailInfoBean.getTitle()) //标题
.setContent(lessonDetailInfoBean.getTitle()) //文本
.setImage(image) //图片
.setContentUrl(share_url) //网页地址
.setCancelable(true)
.show();
好了,这就是整个效果图了,有问题欢迎随时反馈,看到会及时回复