最近在做一个小项目,简版新浪微博,用到了微博授权登录。
这里使用的是Android studio ,遇到了一些问题,和大家分享一下。
先登录新浪微博开发平台,注册一个开发者账号。http://open.weibo.com。
在网站主页面点击微连接 -->移动应用,添加一个新应用
点击立即接入
创建新应用
创建完成后
然后就会生成一个App Key。这个值后面代码会用到。
然后去网站下载 新浪微博SDK
下载页面 http://open.weibo.com/wiki/SDK。选择你需要的版本下载
这里下载Android SDK
下载解压后,会有以下文件
把app_signatures.apk装入到你的手机,点击运行。
根据包名,生成一个MD5签名
包名即为 AndroidMaindfest.xlm中的package=" ";
然后,在新浪微博开发网站进入《我的应用》--->《应用信息》--->《基本应用》---->《编辑》
把包名和MD5签名写入保存即可。
最后,还需要注册一下回调地址,这个地址是:当取消授权时调用该地址。
到这里准备工作就完成了。
接下来写代码。
把weiboSDKCore_3.1.2.jar 包复制到AS中的libs目录下
点击该jar包,右键-->As a LIbrary即可完成jar包的导入。
还有重要的一步,把libs中的文件也一起放入到该目录(libs)下。
把以下代码,原封不动的加入到在AndroidMainfest.xml中
<!-- 页面授权配置-->
<activity
android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
android:configChanges="keyboardHidden|orientation"
android:windowSoftInputMode="adjustResize"
android:exported="false" >
</activity>
这里就一个简单的登录按钮
新建一个接口
public interface Constants {
public static final String APP_KEY = "2703292856"; // 应用的APP_KEY
public static final String REDIRECT_URL = "http://www.sina.com";// 应用的回调页根据注册的回调页填写
public static final String SCOPE = // 应用申请的高级权限
"email,direct_messages_read,direct_messages_write,"
+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
+ "follow_app_official_microblog," + "invitation_write";
}
新建一个Activity
public class WBAuthActivity extends Activity {
private AuthInfo authInfo;
private Oauth2AccessToken accessToken;
private SsoHandler ssoHandler;
private Button button;//登录按钮
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wbauth);
button= (Button) findViewById(R.id.btn);
authInfo=new AuthInfo(this, Constants.APP_KEY,Constants.REDIRECT_URL,Constants.SCOPE);
ssoHandler=new SsoHandler(this,authInfo);
//按钮点击事件
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ssoHandler.authorize(new AuthListener());
}
});
}
/**
* 当 SSO 授权 Activity 退出时,该函数被调用。
* @see {@link Activity#onActivityResult}
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// SSO 授权回调
// 重要:发起 SSO 登陆的 Activity 必须重写 onActivityResults
if ( ssoHandler!= null) {
ssoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
/**
* 微博认证授权回调类。
* 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,
* 该回调才会被执行。
* 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
* 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
*/
class AuthListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
// 从 Bundle 中解析 Token
accessToken = Oauth2AccessToken.parseAccessToken(values);
//从这里获取用户输入的 电话号码信息
String phoneNum = accessToken.getPhoneNum();
if (accessToken.isSessionValid()) {
// 可以获取各种信息
Toast.makeText(WBAuthActivity.this,"授权成功", Toast.LENGTH_SHORT).show();
} else {
// 以下几种情况,您会收到 Code:
// 1. 当您未在平台上注册的应用程序的包名与签名时;
// 2. 当您注册的应用程序包名与签名不正确时;
// 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
String code = values.getString("code");
Toast.makeText(WBAuthActivity.this, "shibai", Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancel() {
Toast.makeText(WBAuthActivity.this,"取消授权", Toast.LENGTH_LONG).show();
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(WBAuthActivity.this,"exception:" +e.getMessage(),Toast.LENGTH_LONG).show();
}
}
}
实现效果:
在运行的时候可能会出现错误。
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.myweibo-1/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]] couldn't find "libweibosdkcore.so"
解决:
在bulid.dradl e中的android 中加入
//noinspection all task copyNativeLibs(type: Copy) { // third party lib so from(new File(projectDir, 'libs')) { include 'armeabi/*.so','armeabi-v7a/*.so' } into new File(buildDir, 'native-libs') } tasks.withType(JavaCompile) { compileTask -> //noinspection all compileTask.dependsOn copyNativeLibs } //noinspection all tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask -> pkgTask.jniFolders = new HashSet() pkgTask.jniFolders.add(new File(buildDir, 'native-libs')) }