注意此处的hashKey 对你程序能登录和分享成功有很大关系 有两种获取方法 代码和cmd
代码
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.baidu.pushtest",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String KeyHash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
Log.d("KeyHash:", "KeyHash:"+KeyHash);//两次获取的不一样 此处取第一个的值
Toast.makeText(this, "FaceBook HashKey:"+KeyHash, Toast.LENGTH_SHORT).show();
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
CMD
获取哈希值的方法:
下载 openssl-0.9.8k_WIN32 下载地址:http://download.csdn.net/detail/h7870181/5054864
或者直接本文最下面附件中下载
下载完成后,解压到C盘根目录
进入cmd 粘贴以下字符串,keystore默认密码为android 注意不要写错了。出来一串字符则为我们所需要的哈希值。
keytool -export -alias myAlias -keystore C:\Users\Administrator\.android\debug.keystore | C:\openssl-0.9.8k_WIN32\bin\openssl sha1 -binary | C:\openssl-0.9.8k_WIN32\bin\openssl enc -a -e
填写完之后就是下载SDK了
官网可以下载,可怜的我连接的VPN不能下载,只能到git上面去找了:https://github.com/facebook/facebook-android-sdk
facebook需要导入项目用作libs samples是官方Demo 加入libs下的两个jar包
自行导入修改应该是没有问题的 如有问题就是jar包导错了,自行看问题解决问题
2.ok此时我们可以往自己项目中加入libs 并Coding了
public class FaceBookTest extends Activity implements OnClickListener{
private Button m_face_login;
private Button m_face_share;
private Button m_face_login_out;
private UiLifecycleHelper uiHelper;
private Session.StatusCallback statusCallback = new SessionStatusCallback();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.face);
uiHelper = new UiLifecycleHelper(this, callback);
uiHelper.onCreate(savedInstanceState);
initlayout();
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.baidu.pushtest",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String KeyHash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
Log.d("KeyHash:", "KeyHash:"+KeyHash);//两次获取的不一样 此处取第一个的值
Toast.makeText(this, "FaceBook HashKey:"+KeyHash, Toast.LENGTH_SHORT).show();
// Toast.makeText(this, "FaceBook HashKey:"+Base64.encodeToString(md.digest(), Base64.DEFAULT), Toast.LENGTH_SHORT).show();
// System.out.println("KeyHash:"+Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
}
private void initlayout(){
m_face_login = (Button) this.findViewById(R.id.face_login);
m_face_share = (Button) this.findViewById(R.id.face_share);
m_face_login_out = (Button) this.findViewById(R.id.face_login_out);
m_face_login.setOnClickListener(this);
m_face_share.setOnClickListener(this);
m_face_login_out.setOnClickListener(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Session.getActiveSession().onActivityResult(this, requestCode,resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() {
@Override
public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
Log.e("Activity", String.format("Error: %s", error.toString()));
}
@Override
public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
Log.i("Activity", "Success!");
String result = data.getString("com.facebook.platform.extra.COMPLETION_GESTURE");//cancel取消 post成功
// String result = FacebookDialog.getNativeDialogCompletionGesture(data);
Log.i("Data", result);
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.face_login:
doLogin();//在没有app的情况下进行网页授权
break;
case R.id.face_share:
doShare();//在没有APP的情况下 不能分享
break;
case R.id.face_login_out:
onClickLogout();
break;
default:
break;
}
}
private void doLogin(){
// Session.openActiveSession(this, true, new StatusCallback() {
// @Override
// public void call(Session session, SessionState state, Exception exception) {
// if(session.isOpened()){
// // get token
// Toast.makeText(FaceBookTest.this, session.getAccessToken(), Toast.LENGTH_SHORT).show();
// }
// }
// });
Session session = Session.getActiveSession();
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
if(session.isOpened()){
// get token
Toast.makeText(FaceBookTest.this, session.getAccessToken(), Toast.LENGTH_SHORT).show();
}
}
}
private void onClickLogout() {
Session session = Session.getActiveSession();
if (!session.isClosed()) {
session.closeAndClearTokenInformation();
}
}
public void doShare(){
try {
FacebookDialog shareDialog = new FacebookDialog.ShareDialogBuilder(this)
.setLink("https://developers.facebook.com/android")
.setApplicationName("AndroidBaiDuPush")
.setDescription("description")
.setName("name")
.setCaption("caption")
.setPlace("place")
.setPicture("http://219.232.161.206:80/data/userdata/vismam/downfile/201307/01191850Ax44.jpeg")
.build();
uiHelper.trackPendingDialogCall(shareDialog.present());
} catch (FacebookException e) {
Toast.makeText(getApplication(), "Facebook app is not installed", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(getApplication(), "Unexpect Exception", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,Exception exception) {
onSessionStateChange(session, state, exception);
}
};
private void onSessionStateChange(Session session, SessionState state,
Exception exception) {
if (state.isOpened()) {
Log.i("tag", "Logged in...");
} else if (state.isClosed()) {
Log.i("tag", "Logged out...");
}
}
}
实现: 登录获取token 分享 退出
doLogin();//在没有app的情况下进行网页授权
doShare();//在没有APP的情况下 不能分享
onClickLogout();
app_key 需要在Strings 里面声明,直接卸载配置文件当中会找不到Key 报错!
在运行代码的时候 前期一直不能成功,然后看提示语 发现都是hashKey的问题,此处需要多注意一下,这个hashKey和你得签名文件是有关联的,不同的eclispe或者打包工具对应不同的hashKey
在.setApplicationName的时候 和注册APP的是不匹配的 自己去看申请是填写的名称 修改即可
另外只回调初期 无论分享是成功还是取消都走onComplete 提示Success 后看源码和onComplete代码发现有data
Ok此时就知道了
String result = data.getString("com.facebook.platform.extra.COMPLETION_GESTURE");//cancel取消 post成功
最后 注意一点的是 facebook的第三方库 要放在你得项目的同级磁盘下,不然导入库的时候会报错
以上个人测试是通过的。如有大牛研究得更多的话,可留言告知!
代码未整理 但应该可以明白