San*_*til 7 android facebook login
我试图在我的应用程序中实现Facebook登录功能,并在获得发布权限后获取令牌.
为此,我按照以下步骤操作.
在Facebook上创建应用程序(填写所有详细信息,如应用程序名称,哈希键(发布),类名称,包名称,单点登录)
应用程序现在可供所有用户使用.
如果在我的手机上安装Native Facebook应用程序,一切都正常.但是如果本机应用程序没有安装,那么它会在填写登录信息后打开facebook webview,它要求我在点击确定按钮后授权再次要求我登录.这个过程将继续下去.
****登录并允许应用程序权限后,它不会回到我的屏幕,但它要求再次登录我****.
这是我的屏幕截图.
这是第二个屏幕截图

点击确定然后再次要求我登录.这是循环登录 - 授权 - 登录..
这是我的完整代码:
我使用自己的按钮,所以我不添加xml代码.
public class FBActivity extends Activity {
Session.StatusCallback statusCallback = new SessionStatusCallback();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.registartionwithmultiple);
printHashKey();
bundle = savedInstanceState;
permissions = new ArrayList<String>();
readpermissions = new ArrayList<String>();
permissions.add("publish_actions");
readpermissions.add("email");
executeFacebookLogin();
}
private void executeFacebookLogin() {
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
Session session = Session.getActiveSession();
if(session == null) {
if(bundle != null) {
Log.i("TEST","RESTORING FROM BUNDLE");
session = Session.restoreSession(this, null, statusCallback, bundle);
}
if(session == null) {
Log.i("TEST","CREATE NEW SESSION");
session = new Session(this);
}
Session.setActiveSession(session);
session.addCallback(statusCallback);
if(session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
}
}
if(session.isClosed()) {
session.closeAndClearTokenInformation();
Session.setActiveSession(null);
}
if(!session.isOpened()) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
Log.i("FB Login ","Open for Publish");
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
//Check if Session is Opened or not
processSessionStatus(session, state, exception);
}
}
@SuppressWarnings("deprecation")
public void processSessionStatus(Session session, SessionState state, Exception exception) {
Log.i("TEST","Session in process session "+session);
if(session != null && session.isOpened()) {
if(session.getPermissions().contains("publish_actions")) {
//Show Progress Dialog
dialog = new ProgressDialog(this);
dialog.setMessage("Loggin in..");
dialog.show();
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
if (dialog!=null && dialog.isShowing()) {
dialog.dismiss();
}
if(user != null) {
Map<String, Object> responseMap = new HashMap<String, Object>();
GraphObject graphObject = response.getGraphObject();
responseMap = graphObject.asMap();
Log.i("FbLogin", "Response Map KeySet - " + responseMap.keySet());
// TODO : Get Email responseMap.get("email");
fb_id = user.getId();
fb_email = null;
user.getBirthday();
fb_userName = user.getUsername();
fb_fullname = user.getFirstName() +" "+user.getLastName();
String name = (String) responseMap.get("name");
if (responseMap.get("email")!=null) {
fb_email = responseMap.get("email").toString();
Log.i("TEST", "FB_ID="+fb_id +"email="+fb_email+"name="+name+"user_name="+user.getUsername()+"birthday="+user.getBirthday());
Session session = Session.getActiveSession();
tokenKey = session.getAccessToken();
SharedPreferenceStoring myPrefsClass = new SharedPreferenceStoring();
myPrefsClass.storingFBToken(FBActivity.this, tokenKey);
finish();
}
else {
//Clear all session info & ask user to login again
Session session = Session.getActiveSession();
if(session != null) {
session.closeAndClearTokenInformation();
}
}
}
}
});
} else {
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(FBActivity.this, permissions));
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i("TEST","Activity result");
super.onActivityResult(requestCode, resultCode, data);
Log.d("FbLogin", "Result Code is - " + resultCode +"");
Session.getActiveSession().onActivityResult(FBActivity.this, requestCode, resultCode, data);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Save current session
super.onSaveInstanceState(outState);
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
}
Run Code Online (Sandbox Code Playgroud)
}
我也得到哈希键..这是哈希键的代码
private void printHashKey() {
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.myapp",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:",
Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
}
Run Code Online (Sandbox Code Playgroud)
我还添加Internet Permission在AndroidManifest.xml和meta-data为Facebook.
希望所有这些信息都足够,如果需要更多的东西肯定会更新我的问题.
请给我任何参考或提示.
所以我想告诉你的是,你必须找到关键哈希值并将其放入 Facebook 控制台,使用下面的代码获取关键哈希值:
try {
PackageInfo info = getPackageManager().getPackageInfo("com.key", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
TextView tvmyName = (TextView)findViewById(R.id.KeyText);
tvmyName.setText(Base64.encodeBytes(md.digest()));
Log.d("KEY_HASH", Base64.encodeBytes(md.digest()));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
Run Code Online (Sandbox Code Playgroud)
KeyHash 值 1:tvmyName.setText(Base64.encodeBytes(md.digest()));
KeyHash 值 2:Log.d("KEY_HASH", Base64.encodeBytes(md.digest()));
请参阅下图以了解在 Facebook 控制台中传递 keyhash 值:
| 归档时间: |
|
| 查看次数: |
3420 次 |
| 最近记录: |