将Android工程打成jar并解决资源不能读取的问题
这里以实际项目为例为大家讲解下如何修改腾讯微博sdk源码并将修改后的Android工程打成jar包
将项目中使用第三方登录模块进行了修改,发现使用腾讯微博的单点登录有2个问题。
备注:使用的Tencent 微博SDK版本是Tencent_Weibo_Android_Open_SDK_V2.0
第一、如果手机没安装腾讯微博客户端或者版本过低 就会弹出WebView进行授权,但是授权成功后AccessToken并没有回传。
后来查看AndroidSDKComponent下的源码发现如果检测到手机没安装或者版本过低就会跳转到Authorize(Activity)该类中授权成功后直接finish()掉了。
第二、由于sdk中缺少资源文件,所有打开的授权界面顶部标题栏背景为白色
因此必须对这个类进行修改,需要拿到WeiboToken可以在下面方法中添加
/**
*
* 获取授权后的返回地址,并对其进行解析
*/
public void jumpResultParser(String result) {
String resultParam = result.split("#")[1];
String params[] = resultParam.split("&");
String accessToken = params[0].split("=")[1];
String expiresIn = params[1].split("=")[1];
String openid = params[2].split("=")[1];
String openkey = params[3].split("=")[1];
String refreshToken = params[4].split("=")[1];
String state = params[5].split("=")[1];
String name = params[6].split("=")[1];
String nick = params[7].split("=")[1];
Context context = this.getApplicationContext();
if (accessToken != null && !"".equals(accessToken)) {
Util.saveSharePersistent(context, "ACCESS_TOKEN", accessToken);
Util.saveSharePersistent(context, "EXPIRES_IN", expiresIn);// accesstoken过期时间,以返回的时间的准,单位为秒,注意过期时提醒用户重新授权
Util.saveSharePersistent(context, "OPEN_ID", openid);
Util.saveSharePersistent(context, "OPEN_KEY", openkey);
Util.saveSharePersistent(context, "REFRESH_TOKEN", refreshToken);
Util.saveSharePersistent(context, "NAME", name);
Util.saveSharePersistent(context, "NICK", nick);
Util.saveSharePersistent(context, "CLIENT_ID", clientId);
Util.saveSharePersistent(context, "AUTHORIZETIME",
String.valueOf(System.currentTimeMillis() / 1000l));
Toast.makeText(Authorize.this, "授权成功", Toast.LENGTH_SHORT).show();
WeiboToken token = new WeiboToken();
token.accessToken = accessToken;
token.expiresIn = Long.parseLong(expiresIn);
token.refreshToken = refreshToken;
token.openID = openid;
Intent data = new Intent();
data.putExtra("WeiboToken", token);
setResult(200, data);
this.finish();
isShow = true;
}
}
调用的Activity 通过Intent i = new Intent(mContext,Authorize.class); startActivityForResult(i, 100);
然后在调用的Activity重写 protected void onActivityResult(int requestCode, int resultCode, Intent data) {...}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Activity.RESULT_OK){
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
if(200==resultCode){
WeiboToken token = (WeiboToken) data.getSerializableExtra("WeiboToken");
requestFriendFansList(token);
}
}
或者在Authorize类中处理完授权使用接口回调的方式将值传回调用的类中
处理完上面的问题就是自定义Tencent微博授权页面顶部Title bar。这里官方也处理的比较坑爹,在手机没装Tencent客户端的情况下打开授权界面顶部出现白色
感觉太难看了,经过一番折腾最后弄好了,发现网上几乎没有这样的帖子。
在Authorize类的initLayout方法中我可以通过
int back_btn_id = getResources().getIdentifier("back_button", "drawable",mContext.getPackageName());
public static Drawable getAssertDrawable(Context context,String fileName){
try {
InputStream inStream=context.getAssets().open(fileName);
return new BitmapDrawable(BitmapFactory.decodeStream(inStream));
} catch (IOException e) {
Log.e("TENCENT_WEIBO", "Assert中"+fileName+"不存在");
}
return null;
}
在这里另外转载下几篇介绍Android获取资源文件的帖子
http://www.cnblogs.com/carbs/archive/2012/07/20/2601811.html
http://www.2cto.com/kf/201205/132802.html
http://www.devdiv.com/Android-jar%E7%9A%84%E5%AF%BC%E5%87%BA%E4%B8%8E%E5%BC%95%E7%94%A8-thread-175955-1-1.html
最后将修改的Android项目保存并在项目上单击右键选择Export--选择Jar--JAR file--next--勾选左侧栏中项目下的src、assets、res--取消勾选右侧文件选项
然后勾选Export generated class files and resources,填写JAR file路径和名称
最后点击finish(),此时可能会弹出警告直接忽视点击ok,现在就可以开始使用jar包了!
要转载的朋友希望标明出处谢谢!