登录后Facebook没有回来但又要求登录

时间:2014-01-24 15:25:37

标签: android facebook login

我正在尝试在我的应用中实现Facebook登录功能,并在获得发布权限后获取令牌。

为此,我按照以下步骤操作。

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

  2. App现在可供所有用户使用。

  3. 然后我在manifest.xml中使用app id
  4. 如果在我的手机上安装Native Facebook应用程序,一切都正常。但是如果本机应用程序没有安装,那么它会在填写登录信息后打开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) {
    
        }
    }  
    

    我还在Internet PermissionAndroidManifest.xml为Facebook添加了meta-data

    希望所有这些信息都足够,如果需要更多的东西肯定会更新我的问题。

    请给我任何参考或提示。

4 个答案:

答案 0 :(得分:1)

你需要一个库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 App id&amp;在代码中替换它。每当我必须在FB上发布文本时,我总是使用这段代码。

在清单中给予互联网许可 <uses-permission android:name="android.permission.INTERNET"/>

多数人

干杯

答案 1 :(得分:0)

所以我想告诉你的是,你必须找到关键哈希值并将其放在facebook控制台中,使用下面的代码获取Key Hash值:

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) {

            }

KeyHash值1:tvmyName.setText(Base64.encodeBytes(md.digest()));

KeyHash值2:Log.d(“KEY_HASH”,Base64.encodeBytes(md.digest()));

请在facebook控制台中传递keyhash值,如下图所示: enter image description here

答案 2 :(得分:0)

首先,避免将Facebook SDK复制到当前工作区,将其保存在某个位置,然后将Facebook SDK的工作集添加到工作区中。

我尝试过一个简单的应用并从用户那里获得一些权限。以下是我试过的代码,在我没有在设备上安装Facebook应用程序的情况下完全正常工作。

public class MainActivity extends Activity implements StatusCallback {

final Context context = this;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Session currentSession = Session.getActiveSession();
    if (currentSession == null || currentSession.getState().isClosed()) {
        Session session = new Session.Builder(context).build();
        Session.setActiveSession(session);
        currentSession = session;
    }

    if (currentSession.isOpened()) {
        // Do whatever u want. User has logged in

    } else if (!currentSession.isOpened()) {
        // Ask for username and password
        OpenRequest op = new Session.OpenRequest((Activity) context);

        op.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
        op.setCallback(null);

        List<String> permissions = new ArrayList<String>();
        permissions.add("user_likes");
        permissions.add("email");
        permissions.add("user_birthday");
        permissions.add("user_location");
        permissions.add("user_interests");
        permissions.add("friends_birthday");
        op.setPermissions(permissions);

        Session session = new Builder(MainActivity.this).build();
        Session.setActiveSession(session);
        session.openForRead(op);
    }
}

public void call(Session session, SessionState state, Exception exception) {
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    System.out.println("Here");

    super.onActivityResult(requestCode, resultCode, data);
    if (Session.getActiveSession() != null)
        Session.getActiveSession().onActivityResult(this, requestCode,
                resultCode, data);

    Session currentSession = Session.getActiveSession();
    if (currentSession == null || currentSession.getState().isClosed()) {
        Session session = new Session.Builder(context).build();
        Session.setActiveSession(session);
        currentSession = session;
    }

    if (currentSession.isOpened()) {
        Session.openActiveSession(this, true, new Session.StatusCallback() {

            @SuppressWarnings("deprecation")
            @Override
            public void call(final Session session, SessionState state,
                    Exception exception) {

                if (session.isOpened()) {

                    Request.executeMeRequestAsync(session,
                            new Request.GraphUserCallback() {

                                @Override
                                public void onCompleted(GraphUser user,
                                        Response response) {
                                    if (user != null) {

                                        System.out.println(user.getName());
                                        System.out.println(session
                                                .getAccessToken());
                                        System.out.println(user
                                                .getFirstName());

                                    }
                                }
                            });
                }
            }
        });
    }
}

}

onActivityResult我尝试打印一些基本信息。如果碰到这个当前代码的任何问题,只需尝试代码并发表评论。

答案 3 :(得分:0)

您的SDK /进程/代码有什么问题吗?

试试这个代码&amp;让我知道它是否正常工作或遇到与你提到的相同的问题。

Click here.