效果圖
WechatIMG26.png
源碼
版本
集成
-
添加倉庫地址
maven { url "https://dl.bintray.com/thelasterstar/maven/" } // 微博 aar maven { url 'http://developer.huawei.com/repo/' } // 華為倉庫 maven { url 'https://dl.bintray.com/wenjie/maven' }
-
根據(jù)要集成的第三方庫添加依賴
api 'com.enowr.android:Auth:0.0.7' api 'com.enowr.android:AuthHW:0.0.7' api 'com.enowr.android:AuthQQ:0.0.7' api 'com.enowr.android:AuthWB:0.0.7' api 'com.enowr.android:AuthWX:0.0.7' api 'com.enowr.android:AuthYL:0.0.7' api 'com.enowr.android:AuthZFB:0.0.7' api 'com.enowr.android:AuthOPPO:0.0.7'
-
Manifest
<manifest> <!-- 華為權(quán)限 --> <uses-permission android:name="android.permission.INTERNET" /> <!--HMS-SDK引導(dǎo)升級(jí)HMS功能,訪問OTA服務(wù)器需要網(wǎng)絡(luò)權(quán)限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--HMS-SDK引導(dǎo)升級(jí)HMS功能守谓,保存下載的升級(jí)包需要SD卡寫權(quán)限--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!--檢測網(wǎng)絡(luò)狀態(tài)--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!--檢測wifi狀態(tài)--> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!--為了獲取用戶手機(jī)的IMEI穿铆,用來唯一的標(biāo)識(shí)用戶。--> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!--如果是安卓8.0斋荞,應(yīng)用編譯配置的targetSdkVersion>=26荞雏,請(qǐng)務(wù)必添加權(quán)限 --> <!-- QQ權(quán)限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- SDK2.1新增獲取用戶位置信息 --> <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" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 微博權(quán)限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /><!-- 用于調(diào)用 JNI --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 微信權(quán)限 其中網(wǎng)絡(luò)權(quán)限如果沒有使用掃碼登錄功能非必要;后三個(gè)權(quán)限,如果沒有使用mta凤优,也非必要羡疗,即使有使用mta,去掉也不影響功能 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 銀聯(lián) --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_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.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="org.simalliance.openmobileapi.SMARTCARD" /> <uses-feature android:name="android.hardware.nfc.hce" /> <!-- 支付寶 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- OPPO --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_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.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <application> <!-- 華為 --> <!-- value的值“xxx”用實(shí)際申請(qǐng)的應(yīng)用ID替換别洪,來源于開發(fā)者聯(lián)盟網(wǎng)站應(yīng)用的服務(wù)詳情叨恨。--> <!-- replace 用于避免其他庫引用華為sdk時(shí)設(shè)置 appId 沖突 --> <meta-data tools:replace="android:value" android:name="com.huawei.hms.client.appid" android:value="appid=xxx"> </meta-data> <!-- 在application節(jié)點(diǎn)下增加provider,UpdateProvider用于HMS-SDK引導(dǎo)升級(jí)HMS挖垛,提供給系統(tǒng)安裝器讀取升級(jí)文件痒钝。UpdateSdkFileProvider用于應(yīng)用自升級(jí)。--> <!--“xxx.xxx.xxx”用實(shí)際的應(yīng)用包名替換--> <provider android:name="com.huawei.hms.update.provider.UpdateProvider" android:authorities="xxx.xxx.xxx.hms.update.provider" android:exported="false" android:grantUriPermissions="true" > </provider> <!-- 如果應(yīng)用使用了HMSAgent.checkUpdate(Activity activity,CheckUpdateHandler callback)接口痢毒,則必須配置UpdateSdkFileProvider --> <!--“xxx.xxx.xxx”用實(shí)際的應(yīng)用包名替換--> <provider android:name="com.huawei.updatesdk.fileprovider.UpdateSdkFileProvider" android:authorities="xxx.xxx.xxx.updateSdk.fileProvider" android:exported="false" android:grantUriPermissions="true"> </provider> <!-- QQ --> <!-- xxxxxx 用注冊(cè)的appId替換 --> <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" /> <data android:scheme="tencentxxxxxx" /> </intent-filter> </activity> <!-- 微信 分享登錄實(shí)現(xiàn) WXEntryActivity 繼承自 AuthActivity送矩, 支付實(shí)現(xiàn) WXPayEntryActivity 繼承自 AuthActivity --> <activity android:name=".wxapi.WXEntryActivity" android:exported="true" android:label="@string/app_name" android:launchMode="singleTask" android:taskAffinity="net.sourceforge.simcpux" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTask" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <!-- 支付寶簽約 支付寶免密支付完成時(shí)走此filter,必須匹配scheme --> <activity android:name="com.enowr.auth.AliRouseActivity" android:allowTaskReparenting="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="xxx" /> </intent-filter> </activity> <!-- OPPO --> <meta-data android:name="debug_mode" android:value="false" /> <!-- 日志開關(guān)哪替,發(fā)布時(shí)候設(shè)置為false --> <meta-data android:name="app_key" android:value="c5217trjnrmU6gO5jG8VvUFU0" /> <!-- appKey --> </application> </manifest>
-
混淆
# Auth -keep class com.enowr.** {*;} # 華為 -ignorewarning -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.hianalytics.android.**{*;} -keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.hms.**{*;} -keep class com.huawei.android.hms.agent.**{*;} # QQ -keep class com.tencent.open.TDialog$* -keep class com.tencent.open.TDialog$* {*;} -keep class com.tencent.open.PKDialog -keep class com.tencent.open.PKDialog {*;} -keep class com.tencent.open.PKDialog$* -keep class com.tencent.open.PKDialog$* {*;} # 微博 -keep class com.sina.weibo.sdk.** {*;} # 微信 -keep class com.tencent.mm.opensdk.** {*;} -keep class com.tencent.wxop.** {*;} -keep class com.tencent.mm.sdk.** {*;} # 銀聯(lián) -keep public class com.unionpay.uppay.net.HttpConnection {public <methods>;} -keep public class com.unionpay.uppay.net.HttpParameters {public <methods>;} -keep public class com.unionpay.uppay.model.BankCardInfo {public <methods>;} -keep public class com.unionpay.uppay.model.PAAInfo {public <methods>;} -keep public class com.unionpay.uppay.model.ResponseInfo {public <methods>;} -keep public class com.unionpay.uppay.model.PurchaseInfo {public <methods>;} -keep public class com.unionpay.uppay.util.DeviceInfo {public <methods>;} -keep public class com.unionpay.uppay.util.PayEngine { public <methods>; native <methods>; } -keep public class com.unionpay.utils.UPUtils {native <methods>;} # 支付寶 -keep class com.alipay.android.app.IAlixPay{*;} -keep class com.alipay.android.app.IAlixPay$Stub{*;} -keep class com.alipay.android.app.IRemoteServiceCallback{*;} -keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;} -keep class com.alipay.sdk.app.PayTask{ public *;} -keep class com.alipay.sdk.app.AuthTask{ public *;} -keep class com.alipay.sdk.app.H5PayCallback { <fields>; <methods>; } -keep class com.alipay.android.phone.mrpc.core.** { *; } -keep class com.alipay.apmobilesecuritysdk.** { *; } -keep class com.alipay.mobile.framework.service.annotation.** { *; } -keep class com.alipay.mobilesecuritysdk.face.** { *; } -keep class com.alipay.tscenter.biz.rpc.** { *; } -keep class org.json.alipay.** { *; } -keep class com.alipay.tscenter.** { *; } -keep class com.ta.utdid2.** { *;} -keep class com.ut.device.** { *;} # SDK 包可能不包含 utdid -dontwarn com.ta.utdid2.** -dontwarn com.ut.device.** # SDK 包可能不包含 securitysdk -dontwarn com.alipay.mobilesecuritysdk.** # OPPO -keep class com.nearme.** {*;}
-
初始化
Auth.init() .setHWAppID("") .setHWKey("") .setHWMerchantID("") .setQQAppID("") .setWXAppID("") .setWXSecret("") .setWBAppKey("") .setWBRedirectUrl("") .setWBScope("") .setOPPOAppSecret("secret") .build(); // 如果使用華為支付功能, 還需要在 MainActivity 里初始化華為 Auth.withHW(context).initHW(activity); // OPPO 要求使用OPPO 自帶的退出功能 Auth.withOPPO(context).exit(activity); // 使用微信相關(guān)功能 // 包名相應(yīng)目錄下新建一個(gè)wxapi目錄栋荸,并在該wxapi目錄下新增兩個(gè)WXPayEntryActivity、WXEntryActivity類凭舶,繼承自AuthActivity
使用
public void hwLogin() {
Auth.withHW(this)
.loginForceLogin(false) // 當(dāng)force為false時(shí)晌块,錯(cuò)誤碼為2001、2002時(shí)帅霜,會(huì)再次以參數(shù)為ture嘗試調(diào)用一次
.login(mCallback);
}
public void hwPay() {
Auth.withHW(this)
.payAmount("")
.payApplicationId("")
.payChannel(1)
.payCountry("")
.payCurrency("")
.payExtReserved("")
.payMerchantId("")
.payMerchantName("")
.payProductDesc("")
.payProductName("")
.payPublicKey("")
.payRequestId("")
.payServiceCatalog("")
.paySign("")
.payUrl("")
.payVersion("")
.pay(mCallback);
}
public void hwRouse() {
Auth.withHW(this)
.rouseAmount("")
.rouseApplicationId("")
.rouseChannel(1)
.rouseCountry("")
.rouseCurrency("")
.rouseExtReserved("")
.rouseMerchantId("")
.rouseMerchantName("")
.rouseProductDesc("")
.rouseProductName("")
.rousePublicKey("")
.rouseRequestId("")
.rouseServiceCatalog("")
.rouseSign("")
.rouseUrl("")
.rouseVersion("")
.rouseTradeType("")
.rouse(mCallback);
}
public void oppoPay() {
Auth.withOPPO(this)
.payAmount(1)
.payAttach("attach")
.payOrderId(String.valueOf(System.currentTimeMillis()))
.payProductName("test")
.payProductDesc("test")
.payCallbackUrl("")
.payUseCachedChannel(false)
.pay(mCallback);
}
public void qqLogin() {
Auth.withQQ(this)
.loginQrcode(true)
.login(mCallback);
}
public void qqShareText() {
Auth.withQQ(this)
.shareTextArk("")
.shareTextImage("")
.shareTextName("")
.shareTextQzoneHide(true)
.shareTextSummary("")
.shareTextTargetUrl("")
.shareTextTitle("")
.shareText(mCallback);
}
public void qqShareImage() {
Auth.withQQ(this)
.shareImageArk("")
.shareImagePath("")
.shareImageName("")
.shareImageQzoneHide(true)
.shareImage(mCallback);
}
public void qqShareMusic() {
Auth.withQQ(this)
.shareMusicImageUrl("")
.shareMusicSummary("")
.shareMusicArk("")
.shareMusicName("")
.shareMusicQzoneHide(true)
.shareMusicTargetUrl("")
.shareMusicTitle("")
.shareMusicUrl("")
.shareMusic(mCallback);
}
public void qqShareVideo() {
Auth.withQQ(this)
.shareVideoPath("")
.shareVideoBack("")
.shareVideoImageList(null)
.shareVideoScene("")
.shareVideoSummary("")
.shareVideo(mCallback);
}
public void qqShareApp() {
Auth.withQQ(this)
.shareAppName("")
.shareAppImageUrl("")
.shareAppSummary("")
.shareAppTitle("")
.shareAppArk("")
.shareAppQzoneHide(true)
.shareApp(mCallback);
}
public void qqShareQzone() {
Auth.withQQ(this)
.shareToQzoneImageList(null)
.shareToQzoneSummary("")
.shareToQzoneTargetUrl("")
.shareToQzoneTitle("")
.shareToQzone(mCallback);
}
public void qqShareMood() {
Auth.withQQ(this)
.shareToMoodBack("")
.shareToMoodImageList(null)
.shareToMoodScene("")
.shareToMoodSummary("")
.shareToMoodVideoPath("")
.shareToMood(mCallback);
}
public void wbLogin() {
Auth.withWB(this)
.login(mCallback);
}
public void wbShareText() {
Auth.withWB(this)
.shareTextContent("")
.shareTextSummary("")
.shareTextTitle("")
.shareTextUrl("")
.shareText(mCallback);
}
public void wbShareImage() {
Auth.withWB(this)
.shareImageBitmap(null)
.shareImageContent("")
.shareImage(mCallback);
}
public void wbShareMultiImage() {
Auth.withWB(this)
.shareMultiImageContent("")
.shareMultiImageUriList(null)
.shareMultiImage(mCallback);
}
public void wbShareLink() {
Auth.withWB(this)
.shareLinkContent("")
.shareLinkSummary("")
.shareLinkThumbImage(null)
.shareLinkTitle("")
.shareLinkUrl("")
.shareLink(mCallback);
}
public void wbShareVideo() {
Auth.withWB(this)
.shareVideoPath("")
.shareVideoContent("")
.shareVideoSummary("")
.shareVideoTitle("")
.shareVideo(mCallback);
}
public void wbShareToStory() {
Auth.withWB(this)
.shareToStoryImagePath("")
.shareToStoryVideoPath("")
.shareToStory(mCallback);
}
public void wxLogin() {
Auth.withWX(this)
.login(mCallback);
}
public void wxPay() {
Auth.withWX(this)
.payNonceStr("")
.payPackageValue("")
.payPartnerId("")
.payPrepayId("")
.paySign("")
.payTimestamp("")
.pay(mCallback);
}
public void wxRouse() {
Auth.withWX(this)
.rouseUrl("")
.rouse(mCallback);
}
public void wxShareText() {
Auth.withWX(this)
.shareTextSummary("")
.shareTextContent("")
.shareTextThumbData(null)
.shareTextTitle("")
.shareText(mCallback);
}
public void wxShareImage() {
Auth.withWX(this)
.shareImageBitmap(null)
.shareImageSummary("")
.shareImageThumbData(null)
.shareImageTitle("")
.shareImage(mCallback);
}
public void wxShareLink() {
Auth.withWX(this)
.shareLinkThumbData(null)
.shareLinkSummary("")
.shareLinkTitle("")
.shareLinkUrl("")
.shareLink(mCallback);
}
public void wxShareVideo() {
Auth.withWX(this)
.shareVideoThumbData(null)
.shareVideoSummary("")
.shareVideoLowBandUrl("")
.shareVideoTitle("")
.shareVideoUrl("")
.shareVideo(mCallback);
}
public void wxShareMusic() {
Auth.withWX(this)
.shareMusicThumbData(null)
.shareMusicSummary("")
.shareMusicDataUrl("")
.shareMusicLowBandDataUrl("")
.shareMusicLowBandUrl("")
.shareMusicTitle("")
.shareMusicUrl("")
.shareMusic(mCallback);
}
public void wxShareApp() {
Auth.withWX(this)
.shareAppId("")
.shareAppPath("")
.shareAppSummary("")
.shareAppThumbData(null)
.shareAppTitle("")
.shareAppType(1)
.shareAppUrl("")
.shareAppWithShareTicket(true)
.shareApp(mCallback);
}
public void ylPay() {
Auth.withYL(this)
.payOrderInfo("")
.payIsTest(true)
.pay(mCallback);
}
public void zfbPay() {
Auth.withZFB(this)
.payOrderInfo("")
.payIsShowLoading(true)
.pay(mCallback);
}
public void zfbRouse() {
Auth.withZFB(this)
.rouseUrl("")
.rouse(mCallback);
}
返回碼
-
QQ
110201:未登陸 110405:登錄請(qǐng)求被限制 110404:請(qǐng)求參數(shù)缺少appid 110401:請(qǐng)求的應(yīng)用不存在 110407:應(yīng)用已經(jīng)下架 110406:應(yīng)用沒有通過審核 100044:錯(cuò)誤的sign 110500:獲取用戶授權(quán)信息失敗 110501:獲取應(yīng)用的授權(quán)信息失敗 110502:設(shè)置用戶授權(quán)失敗 110503:獲取token失敗 110504:系統(tǒng)內(nèi)部錯(cuò)誤
-
微博
C8998: 簽名不一致 8000: 沒有安裝客戶端 8001: 非官方客戶端
OPPO 為離線文檔
說明
-
華為:Mac 下集成Agent執(zhí)行腳本文件沒反應(yīng)匆背。
GetHMSAgent_cn.sh 換行符的原因?qū)е略趍acos下執(zhí)行無反映,可通過下列命令替換下?lián)Q行符:
cat GetHMSAgent_cn.sh | tr "^M" "\n" > GetHMSAgent_cn_new.sh -
華為:同時(shí)引入其他第三方華為支持時(shí)(如極光的華為推送插件)
禁用華為依賴傳遞身冀,由于極光插件全量引入了華為SDK钝尸,所以全部禁用所有依賴
implementation ('com.enowr.android:AuthHW:0.0.3'){transitive false}
引入極光的華為插件,配置相關(guān)配置即可
implementation 'cn.jiguang.sdk.plugin:huawei:3.3.2'