友盟之微信授權登陸總結(微信授權回調響應問題)

至於友盟註冊以及開發使用,自行查看文檔或者官網了。
微信平臺:https://open.weixin.qq.com/
自行註冊,以及申請開發者資質認證(需要300元)還有一系列註冊需要的資料。通過這個後纔有微信登錄權限。

應用的提交審覈需要的資料,簽名等,微信或者友盟都有資料介紹。或者參考我的上一篇博客寫的新浪微博的:http://blog.csdn.net/qq_16064871/article/details/50083807

一、微信回調的activity註冊

   <!-- 微信回調activity 一定要是app的package包名-->
        <activity
            android:name=".wxapi.WXEntryActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:screenOrientation="portrait"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

雖然友盟都建議,友盟開發包建成工程,最後引用這個這個友盟的工程。但這樣做勢必會造成引用這個工程的app包名跟 android:name=".wxapi.WXEntryActivity"這前面的包名不一樣(app的包名+.wxapi.WXEntryActivity)而不是(友盟工程的包名+.wxapi.WXEntryActivity)。
所以這個空的WXEntryActivity還是要放在使用app的項目中,WXEntryActivity.class的完整路徑應該是app的包名+.wxapi.WXEntryActivity。還有上面那個activity註冊其他配置要一模一樣。

這就是大多數人友盟的微信登陸回調沒有用戶信息返回的原因。就是沒有執行到onComplete。



二、注意事項:

1、WXEntryActivity這個類裏面什麼都不用寫。友盟幫我們寫好了。就如下:

import com.umeng.socialize.weixin.view.WXCallbackActivity;
public class WXEntryActivity extends WXCallbackActivity {
}

2、如果測試時候,如果已經多次登錄微信。需要註銷登錄微信再進行測試。
3、測試的微信號一定要有微信號。最好也要有頭像。


三、下面看一下代碼流程:

1、平臺的註冊,微信包加到平臺

	// 整個平臺的Controller,負責管理整個SDK的配置、操作等處理
	private UMSocialService mController = UMServiceFactory
			.getUMSocialService("com.umeng.login");

	private void addWXPlatform() {
		// 注意:在微信授權的時候,必須傳遞appSecret
		// wx967daebe835fbeac是你在微信開發平臺註冊應用的AppID, 這裏需要替換成你註冊的AppID
		String appId = "wx.....";
		String appSecret = "gdfg......";
		// 添加微信平臺
		UMWXHandler wxHandler = new UMWXHandler(LoginActivity.this, appId,
				appSecret);
	 
	    wxHandler.setRefreshTokenAvailable(true);
		
		wxHandler.addToSocialSDK();

	}

2、微信登陸的調用與註銷微信登陸

//登錄微信調用
login(SHARE_MEDIA.WEIXIN);
//註銷微信登錄
logout(SHARE_MEDIA.WEIXIN);

3、微信登陸與註銷微信登陸整體代碼,獲取用戶信息

	/**
	 * 授權。如果授權成功,則獲取用戶信息
	 * 
	 * @param platform
	 */
	private void login(final SHARE_MEDIA platform) {
		mController.doOauthVerify(LoginActivity.this, platform,
				new UMAuthListener() {

					@Override
					public void onStart(SHARE_MEDIA platform) {
						Toast.makeText(LoginActivity.this, "授權開始",
								Toast.LENGTH_SHORT).show();
					}

					@Override
					public void onError(SocializeException e,
							SHARE_MEDIA platform) {
						Toast.makeText(LoginActivity.this, "授權失敗",
								Toast.LENGTH_SHORT).show();
					}

					@Override
					public void onComplete(Bundle value, SHARE_MEDIA platform) {
						Toast.makeText(LoginActivity.this, "授權完成",
								Toast.LENGTH_LONG).show();
						// 獲取uid
						String uid = value.getString("uid");
						if (!TextUtils.isEmpty(uid)) {
							// uid不爲空,獲取用戶信息
							getUserInfo(platform);
						} else {
							Toast.makeText(LoginActivity.this, "授權失敗...",
									Toast.LENGTH_LONG).show();
						}
					}

					@Override
					public void onCancel(SHARE_MEDIA platform) {
						Toast.makeText(LoginActivity.this, "授權取消",
								Toast.LENGTH_SHORT).show();
					}
				});
	}

	/**
	 * 獲取用戶信息
	 * 
	 * @param platform
	 */
	private void getUserInfo(SHARE_MEDIA platform) {
		mController.getPlatformInfo(LoginActivity.this, platform,
				new UMDataListener() {

					@Override
					public void onStart() {

					}

					@Override
					public void onComplete(int status, Map<String, Object> info) {
//						 String showText = "";
//						 if (status == StatusCode.ST_CODE_SUCCESSED) {
//						 showText = "用戶名:" +
//						 info.get("screen_name").toString();
//						 Log.d("#########", "##########" + info.toString());
//						 } else {
//						 showText = "獲取用戶信息失敗";
//						 }

						if (info != null) {
							Toast.makeText(LoginActivity.this, info.toString(),Toast.LENGTH_SHORT).show();
						}
					}
				});
	}
	
	/**
	 * 註銷本次登陸
	 * @param platform
	 */
	private void logout(final SHARE_MEDIA platform) {
		mController.deleteOauth(LoginActivity.this, platform, new SocializeClientListener() {
			
			@Override
			public void onStart() {
				
			}
			
			@Override
			public void onComplete(int status, SocializeEntity entity) {
				String showText = "解除" + platform.toString() + "平臺授權成功";
				if (status != StatusCode.ST_CODE_SUCCESSED) {
					showText = "解除" + platform.toString() + "平臺授權失敗[" + status + "]";
				}
				Toast.makeText(LoginActivity.this, showText, Toast.LENGTH_SHORT).show();
			}
		});
	}

四、看圖






五,帶簽名調試的千名證書

修改Android簽名證書keystore的密碼、別名alias以及別名密碼

之前在測試Eclipse ADT的Custom debug keystore自定義調試證書的時候,發過一篇關於調試證書規格的博文:Eclipse ADT的Custom debug keystore所需證書規格,提到過自定義調試證書的密碼和alias命名以及alias密碼都是有規矩的。其實Android應用開發接入各種SDK時會發現,有很多SDK是需要靠package name和keystore的指紋hash來識別的(百度地圖SDK、Facebook SDK等等…),這樣如果使用默認自動生成的debug keystore的話就會給開發調試工作帶來一些麻煩。這時可以通過修改正式的release keystore,生成一份“遵守規矩”的臨時自定義調試證書給開發時用,就方便多了,具體方法如下:
1. 首先當然是先複製一份正式證書出來作爲要修改爲的臨時調試證書。
2. 修改keystore密碼的命令(keytool爲JDK帶的命令行工具):
keytool -storepasswd -keystore my.keystore
其中,my.keystore是複製出來的證書文件,執行後會提示輸入證書的當前密碼,和新密碼以及重複新密碼確認。這一步需要將密碼改爲android。
3. 修改keystore的alias:
keytool -changealias -keystore my.keystore -alias my_name -destalias androiddebugkey
這一步中,my_name是證書中當前的alias,-destalias指定的是要修改爲的alias,這裏按規矩來,改爲androiddebugkey!這個命令會先後提示輸入keystore的密碼和當前alias的密碼。
4. 修改alias的密碼:
keytool -keypasswd -keystore my.keystore -alias androiddebugkey
這一步執行後會提示輸入keystore密碼,alias密碼,然後提示輸入新的alias密碼,同樣,按規矩來,改爲android!
以上幾個操作執行後,my.keystore就是符合規矩的debug keystore了,接着在Eclipse的ADT設置中選中這個custom debug keystore即可。



到這裏結束了,歡迎評論留下你的友盟開發之微信的疑問,我儘量幫你們解答。。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章