我正在尝试在我的应用程序中实现 Facebook 登录功能,并在授予发布权限后获取 token 。
为此,我遵循以下步骤。
在 Facebook 上创建应用(填写应用名称、哈希键(发布)、类名称、包名称、单点登录等所有详细信息)
应用程序现在可供所有用户使用。
- 然后我在我的 manifest.xml 中使用应用程序 ID
如果我的手机上安装了 native Facebook 应用程序,一切正常。但是,如果未安装 native 应用程序,那么它会在填写登录信息后打开 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);
}
我也得到哈希键..这是哈希键的代码
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) {
}
}
我还在 AndroidManifest.xml
和 meta-data
中为 Facebook 添加了 Internet Permission
。
希望所有这些信息都足够,如果需要更多信息肯定会更新我的问题。
请给我任何引用或提示。
最佳答案
你需要一个图书馆 easyfacebookandroidsdk.jar并在你的项目中构建它
使用这段代码:
public class MainActivity extends Activity implements LoginListener{
EditText et1;
private FBLoginManager fbLoginManager;
Button b;
//replace it with your own Facebook App ID
public final String FacebookTesting="218874471621782";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.editText1);
b=(Button)findViewById(R.id.button1);
connectToFacebook();
}
public void connectToFacebook(){
//read about Facebook Permissions here:
//http://developers.facebook.com/docs/reference/api/permissions/
String permissions[] = {
// "user_about_me",
// "user_activities",
// "user_birthday",
// "user_checkins",
// "user_education_history",
// "user_events",
// "user_groups",
// "user_hometown",
// "user_interests",
// "user_likes",
// "user_location",
// "user_notes",
// "user_online_presence",
// "user_photo_video_tags",
// "user_photos",
// "user_relationships",
// "user_relationship_details",
// "user_religion_politics",
// "user_status",
// "user_videos",
// "user_website",
// "user_work_history",
// "email",
//
// "read_friendlists",
// "read_insights",
// "read_mailbox",
// "read_requests",
// "read_stream",
// "xmpp_login",
// "ads_management",
// "create_event",
// "manage_friendlists",
// "manage_notifications",
// "offline_access",
// "publish_checkins",
"publish_stream",
// "rsvp_event",
// "sms",
//"publish_actions",
// "manage_pages"
};
fbLoginManager = new FBLoginManager(this,
R.layout.activity_main,
FacebookTesting,
permissions);
if(fbLoginManager.existsSavedFacebook()){
fbLoginManager.loadFacebook();
}
else{
fbLoginManager.login();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, android.content.Intent data){
fbLoginManager.loginSuccess(data);
}
public void loginSuccess(Facebook facebook) {
// GraphApi graphApi = new GraphApi(facebook);
new getDataBackgroundThread().execute(facebook);
// User user = new User();
// try{
// user = graphApi.getMyAccountInfo();
//
// //update your status if logged in
// graphApi.setStatus("Hello, world!");
// } catch(EasyFacebookError e){
// Log.d("TAG: ", e.toString());
// }
// fbLoginManager.displayToast("Hey, " + user.getFirst_name() + "! Login success!");
}
@Override
public void logoutSuccess() {
// TODO Auto-generated method stub
}
@Override
public void loginFail() {
// TODO Auto-generated method stub
}
class getDataBackgroundThread extends AsyncTask<Facebook, Void, String> {
private Exception exception;
protected String doInBackground(Facebook... urls) {
try{
GraphApi graphApi = new GraphApi(urls[0]);
User user = new User();
try{
// user = graphApi.getMyAccountInfo();
//update your status if logged in
//graphApi.setStatus("My android App "+"VivekAppTest");
graphApi.setStatus("Hello "+"VivekAppTest");
} catch(EasyFacebookError e){
Log.d("TAG: ", e.toString());
}
return "posted";
}
catch (Exception e) {
// TODO: handle exception
return null;
}
}
protected void onPostExecute(String ipr) {
// TODO: check this.exception
// TODO: do something with the feed
//
// Intent i=new Intent(getApplicationContext(),MainActivity.class);
// startActivity(i);
// finish();
// Toast toast=Toast.makeText(getApplicationContext(),"Post Successful !", 1);
// toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL,0, 130);
// toast.show();
//
}
}
}
获取您的 Facebook 应用程序 ID 并在代码中替换它。每当我必须在 FB 上发布文本时,我总是使用此代码。
在 list 中授予互联网权限
<uses-permission android:name="android.permission.INTERNET"/>
就这些
干杯
关于android - Facebook 登录后不回来但再次要求登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21336314/