Java 登录Facebook后发送回MainActivity
我按照Facebook教程为我的应用程序制作了一个登录按钮,它可以与登录一起工作,但我有一些问题需要你们的帮助 我有一个活动&一个片段。 当你启动我的应用程序时,你会看到一个png图像,这是一个徽标,加上一个“登录到facebook”按钮。 当您按下登录按钮时,您将被发送到Facebook进行身份验证,登录后,您将再次被发送回MainActivity 现在主要活动有了徽标,Facebook按钮上写着“注销”。 这很好,但我的问题是: 登录后最好做什么 创建一个新类,您将在登录后被发送,或者被发送回MainActivity? 真正的程序员在认证后做什么 如果发送回MainActivity更好,那么在登录后如何删除徽标png图像?我的意思是,在你登录之前,这很好,但是在登录之后,图片应该消失了。 Facebook的注销按钮也是一样,我如何删除它,或者至少把它放在其他地方? 我想做一个操作栏,但注销按钮在那里 这是我用于活动的核心&片段。 那么,我应该在登录后创建一个新类来发送用户,还是应该将用户mack发送到活动中,如果是,在登录后如何删除logo/logout按钮?多谢各位 编辑: 如果最好的方法是创建一个新类,并在登录后将用户发送到新类, 我应该在代码中的什么地方写?我尝试了OnClickListener,但它在登录后从未将用户发送到新类。多谢各位 后勤活动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按钮上写着“注销”。 这很好,但我的问题是: 登录后最好做什么 创建一个新类,您将在登录后被发送,或者被发送
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...");
}
}