Facebook 登录和分享 分类: Android开发常识

来源:互联网 发布:足球战术软件 编辑:程序博客网 时间:2024/05/21 08:40
因项目要求,需要实现FaceBook的登录和分享,于是 百度+google+翻墙。终于实现了!一下希望对你能起到帮助
1.首先要申请账号,下载Sdk  因为连接国外的网站所以需要做点处理
    https://www.vcupmars.com/user/2384183/myvpn  可申请账号  然后设置Vpn(不会设置的童鞋自行百度)
   连接上了之后 进行app注册

 注意此处的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


根据提示 很明白  是分享的dialog

在.setApplicationName的时候 和注册APP的是不匹配的  自己去看申请是填写的名称 修改即可

另外只回调初期 无论分享是成功还是取消都走onComplete 提示Success  后看源码和onComplete代码发现有data

于是分别在取消分享和成功分享的时候查看data

Ok此时就知道了

String result = data.getString("com.facebook.platform.extra.COMPLETION_GESTURE");//cancel取消   post成功


最后  注意一点的是  facebook的第三方库 要放在你得项目的同级磁盘下,不然导入库的时候会报错


以上个人测试是通过的。如有大牛研究得更多的话,可留言告知!

代码未整理 但应该可以明白

0 0
原创粉丝点击