友盟之微信授权登陆总结(微信授权回调响应问题)

至于友盟注册以及开发使用,自行查看文档或者官网了。
微信平台: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即可。



到这里结束了,欢迎评论留下你的友盟开发之微信的疑问,我尽量帮你们解答。。。



已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页