在這裏我用的是友盟的登錄,需要的請參考本文,直接擼代碼,
提示:微信登錄在一段時間內,只授權一次(只能調起一次登錄頁面),除非更換用戶,纔可以再調起登錄頁面。
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();
好了,這就是整個效果圖了,有問題歡迎隨時反饋,看到會及時回覆