android - Facebook 登录后不回来但再次要求登录

标签 android facebook authentication

我正在尝试在我的应用程序中实现 Facebook 登录功能,并在授予发布权限后获取 token 。

为此,我遵循以下步骤。

  1. 在 Facebook 上创建应用(填写应用名称、哈希键(发布)、类名称、包名称、单点登录等所有详细信息)

  2. 应用程序现在可供所有用户使用。

  3. 然后我在我的 manifest.xml 中使用应用程序 ID

如果我的手机上安装了 native Facebook 应用程序,一切正常。但是,如果未安装 native 应用程序,那么它会在填写登录信息后打开 facebook webview,它会在单击“确定”按钮后要求我授权,它会再次要求我登录。而且这个过程还会继续。

****登录并允许应用程序权限后,它没有返回到我的屏幕,但它要求再次登录****。

这是我的屏幕截图。

enter image description here

这是第二个屏幕截图

enter image description here

点击确定后,它会再次要求我登录。这是循环登录-授权-登录..
这是我的完整代码:

我使用我自己的按钮,所以我没有添加 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.xmlmeta-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/

相关文章:

java - 共享首选项不保存

android - Android Studio gradle 中的重复值问题

android - 如何在android中解析来自json的数据?

facebook - DotNetOpenAuth 获取 Facebook 电子邮件地址

angularjs - Keycloak:在 AngularJS 应用程序中更新用户密码

android - 无法在 Android 嵌入式浏览器上使用 Facebook 登录

php - 如何计算在 Facebook 应用程序中花费的时间?

facebook - 为什么 Facebook Graph API 说我的帐户不活跃?

java - 您如何在 spring-security 中注销所有已登录的用户?

javascript - 使用变量中预设的密码登录系统