Java 登录Facebook后发送回MainActivity

Java 登录Facebook后发送回MainActivity,java,android,facebook-graph-api,authentication,android-studio,Java,Android,Facebook Graph Api,Authentication,Android Studio,我按照Facebook教程为我的应用程序制作了一个登录按钮,它可以与登录一起工作,但我有一些问题需要你们的帮助 我有一个活动&一个片段。 当你启动我的应用程序时,你会看到一个png图像,这是一个徽标,加上一个“登录到facebook”按钮。 当您按下登录按钮时,您将被发送到Facebook进行身份验证,登录后,您将再次被发送回MainActivity 现在主要活动有了徽标,Facebook按钮上写着“注销”。 这很好,但我的问题是: 登录后最好做什么 创建一个新类,您将在登录后被发送,或者被发送

我按照Facebook教程为我的应用程序制作了一个登录按钮,它可以与登录一起工作,但我有一些问题需要你们的帮助

我有一个活动&一个片段。 当你启动我的应用程序时,你会看到一个png图像,这是一个徽标,加上一个“登录到facebook”按钮。 当您按下登录按钮时,您将被发送到Facebook进行身份验证,登录后,您将再次被发送回MainActivity

现在主要活动有了徽标,Facebook按钮上写着“注销”。 这很好,但我的问题是:

登录后最好做什么

创建一个新类,您将在登录后被发送,或者被发送回MainActivity? 真正的程序员在认证后做什么

如果发送回MainActivity更好,那么在登录后如何删除徽标png图像?我的意思是,在你登录之前,这很好,但是在登录之后,图片应该消失了。 Facebook的注销按钮也是一样,我如何删除它,或者至少把它放在其他地方? 我想做一个操作栏,但注销按钮在那里

这是我用于活动的核心&片段。 那么,我应该在登录后创建一个新类来发送用户,还是应该将用户mack发送到活动中,如果是,在登录后如何删除logo/logout按钮?多谢各位

编辑

如果最好的方法是创建一个新类,并在登录后将用户发送到新类, 我应该在代码中的什么地方写?我尝试了OnClickListener,但它在登录后从未将用户发送到新类。多谢各位

后勤活动

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

import com.facebook.widget.LoginButton;

public class LoginActivity extends FragmentActivity {

private LoginFragment loginFragment;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState == null) {
        // Add the fragment on initial activity setup
        loginFragment = new LoginFragment();
        getSupportFragmentManager()
                .beginTransaction()
                .add(android.R.id.content, loginFragment)
                .commit();

    } else {
        // Or set the fragment from restored state info
        loginFragment = (LoginFragment) getSupportFragmentManager()
                .findFragmentById(android.R.id.content);
    }
}
}
登录片段

public class LoginFragment extends Fragment {

private static final String TAG = "LoginFragment";
private UiLifecycleHelper uiHelper;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    uiHelper = new UiLifecycleHelper(getActivity(), callback);
    uiHelper.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater,
    ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_login, container, false);

    LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
    authButton.setFragment(this);
    authButton.setReadPermissions(Arrays.asList("public_profile" , "user_birthday" , "user_friends"));

    return view;
}

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...");
    }
}

@Override
public void onResume() {
    super.onResume();

    // For scenarios where the main activity is launched and user
    // session is not null, the session state change notification
    // may not be triggered. Trigger it if it's open/closed.
    Session session = Session.getActiveSession();
    if (session != null &&
            (session.isOpened() || session.isClosed()) ) {
        onSessionStateChange(session, session.getState(), null);


    }

    uiHelper.onResume();
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    uiHelper.onActivityResult(requestCode, resultCode, data);
}

@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);
}
}
编辑2:

我想我成功了。 这就是我所做的,但不知道这是否正确

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        Log.i(TAG, "Logged in...");

        Intent intent = new Intent(getActivity(), MainActivity.class);
        startActivity(intent);
        finish();
和为完成();是的

好的,这就是我要做的。 我的应用程序将具有的第一个活动是LoginActivity.java。 此活动将包含徽标和facebook登录按钮。 当用户点击并使用facebook登录时,我调用MainActivity.java[这是我应用程序的主屏幕]。 当用户单击此处的“上一步”按钮时,我不会返回LoginActivity.java,而是显示一个应用程序退出警报框。

尝试以下操作:

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        Log.i(TAG, "Logged in...");
        Intent intent = new INTENT(context, NewActivity.class);
        context.startActivity(intent);
        finish(); // back button shouldn't bring you back to this fragment
    } else if (state.isClosed()) {
        Log.i(TAG, "Logged out...");
    }
}

我认为在可用性方面最好的做法是将用户带到他应该去的地方,我很确定这不再是登录屏幕。 你给他写日志是有原因的,所以要努力做到这一点

至于你的代码,@varsha venkatesh代码应该能做到这一点。

照上面提到的做


我希望这能解决您的问题。

您应该创建一个新类(Intent),并在登录后使用onSessionStateChange()方法将用户发送到新类(Intent),如果您想将从facebook获得的数据发送到下一个Intent,也可以使用捆绑方法。检查这个例子

private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
    Log.i(TAG, "Logged in...");

    // Request user data and show the results
    Request.newMeRequest(session, new Request.GraphUserCallback() {
        @Override
        public void onCompleted(GraphUser user, Response response) {
            if (user != null) {

               Intent pit = new Intent(getApplicationContext(), HomeActivity.class);
               pit.putExtra("Fb_id", user.getId());
               pit.putExtra("user_name", user.getName());
               startActivity(pit);

            }
        }
    }).executeAsync();


} else if (state.isClosed()) {
    Log.i(TAG, "Logged out...");

}
}

你推荐这样的东西?LoginActivity(logo/loginbutton)->LoginFragment(用于身份验证)->如果成功->新类MainActivity?我不知道这是否会减慢应用程序的登录过程,但我会试试这个,谢谢。我尝试在验证后发送到MainActivert(我创建的新类),但它不起作用,你知道代码和我应该在哪里编写它吗?谢谢。请看主要问题的编辑。提出一些新问题。它不起作用。我犯了错误;意图中的上下文。另一个错误是startActivity之前的上下文,甚至finish();红色对我来说是错误的。所以这不起作用。这是正确的,它起作用了:::Intent nextScreen=newintent(getActivity(),SecondScreenActivity.class);startActivity(nextScreen);getActivity方法返回上下文。我建议的解决方案和以前的完全一样。哦,我现在明白了。谢谢你,瓦沙。现在我明白了发生了什么:-)facebook sdk 4.3.0呢?该教程从2012年开始,该教程中的所有内容现在都是错误的。该网站的一切都不管用,它已经2年了,Facebook有了新的SDk和新的编码,所以不,它没有解决我的任何问题,只是花了我的时间。谢谢。但我的应用程序中仍然可以使用它。请同时下载与本教程兼容的旧facebook sdk。我为什么要使用旧sdk?这并不好,特别是Facebook将从2015年4月起删除使用旧sdk的应用程序,所以我也将使用2015年4月后可用的sdk。哦,我明白了。继续走,没用。获取getApplicationContext上的错误。请记住,代码在片段中,而不是活动中,getApplicationContext需要活动。我认为您应该使用getActivity()。getApplicationContext()在那里。是的,新的意图(getActivity()是正确的用法,谢谢:)
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
    Log.i(TAG, "Logged in...");

    // Request user data and show the results
    Request.newMeRequest(session, new Request.GraphUserCallback() {
        @Override
        public void onCompleted(GraphUser user, Response response) {
            if (user != null) {

               Intent pit = new Intent(getApplicationContext(), HomeActivity.class);
               pit.putExtra("Fb_id", user.getId());
               pit.putExtra("user_name", user.getName());
               startActivity(pit);

            }
        }
    }).executeAsync();


} else if (state.isClosed()) {
    Log.i(TAG, "Logged out...");

}
}