Uwierzytelnianie Facebook bez przycisku logowania
Śledziłem kilka samouczków Facebook API 3.0, w tym Login/Wyloguj I Publish to Feed przykłady. Więc login działa w ten sposób:
- otwiera się aplikacja, pokazuje fragment, który wyświetla przycisk logowania
- użytkownik klika login, uwierzytelnianie odbywa się za pośrednictwem wymienionej Biblioteki FacebookSDK (com.facebook.widget.LoginActivity) oraz dostarczony kod wykorzystujący sesje.
- Użytkownik zostaje przekierowany do następnego ekranu
Nie chcę zmuszać użytkownika do zalogowania się do tego sposób. Facebook facebook facebook, to aplikacja powinna zapytać ich, czy pozwalają Facebook korzystać z ich aplikacji, czy coś, wiesz, zwykłe rzeczy.jeśli chcesz, aby korzystać z mojej aplikacji bez logowania/rejestracji, a następnie kliknij na Facebooku konkretnej funkcji, np. udostępnić notatkę na Facebooku, to aplikacja powinna zapytać ich, czy pozwalają Facebook korzystać z ich aplikacji, czy coś, wiesz, zwykłe rzeczy. Bez tego dostaję nullpointer w funkcji publishFeedDialog (), ponieważ sesja jest null, ponieważ nie dokonano logowania.
Więc moje pytanie brzmi, Jak mogę zignorować SplashFragment z przyciskiem Login, więc gdy użytkownik kliknie na Funkcja Facebook Facebook w mojej aplikacji żaden nowy ekran nie jest wyświetlany za pomocą przycisku logowania, ale tylko domyślne okno uwierzytelniania Facebooka, do którego użytkownicy są przyzwyczajeni?
6 answers
@erdomester, @sromku
Facebook uruchamia nowe sdk w wersji 4.x gdzie sesja jest przestarzała,
Tam nowa koncepcja logowania z facebook
LoginManager i AccessToken - te nowe klasy wykonują Facebook Login
Więc teraz możesz uzyskać dostęp do uwierzytelniania Facebook bez przycisku logowania jako
układ.xml
<Button
android:id="@+id/btn_fb_login"
.../>
główna aktywność.java
private CallbackManager mCallbackManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());
mCallbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(mCallbackManager,
new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.d("Success", "Login");
}
@Override
public void onCancel() {
Toast.makeText(MainActivity.this, "Login Cancel", Toast.LENGTH_LONG).show();
}
@Override
public void onError(FacebookException exception) {
Toast.makeText(MainActivity.this, exception.getMessage(), Toast.LENGTH_LONG).show();
}
});
setContentView(R.layout.activity_main);
Button btn_fb_login = (Button)findViewById(R.id.btn_fb_login);
btn_fb_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends"));
}
});
}
Edit
Jeśli nie dodasz po, to nie zadziała (słusznie zauważył @Daniel Zolnai w komentarzu poniżej):
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(mCallbackManager.onActivityResult(requestCode, resultCode, data)) {
return;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:56
Coś takiego
private void performFacebookLogin()
{
Log.d("FACEBOOK", "performFacebookLogin");
final Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(this, Arrays.asList("email"));
Session openActiveSession = Session.openActiveSession(this, true, new Session.StatusCallback()
{
@Override
public void call(Session session, SessionState state, Exception exception)
{
Log.d("FACEBOOK", "call");
if (session.isOpened() && !isFetching)
{
Log.d("FACEBOOK", "if (session.isOpened() && !isFetching)");
isFetching = true;
session.requestNewReadPermissions(newPermissionsRequest);
Request getMe = Request.newMeRequest(session, new GraphUserCallback()
{
@Override
public void onCompleted(GraphUser user, Response response)
{
Log.d("FACEBOOK", "onCompleted");
if (user != null)
{
Log.d("FACEBOOK", "user != null");
org.json.JSONObject graphResponse = response.getGraphObject().getInnerJSONObject();
String email = graphResponse.optString("email");
String id = graphResponse.optString("id");
String facebookName = user.getUsername();
if (email == null || email.length() < 0)
{
Logic.showAlert(
ActivityLogin.this,
"Facebook Login",
"An email address is required for your account, we could not find an email associated with this Facebook account. Please associate a email with this account or login the oldskool way.");
return;
}
}
}
});
getMe.executeAsync();
}
else
{
if (!session.isOpened())
Log.d("FACEBOOK", "!session.isOpened()");
else
Log.d("FACEBOOK", "isFetching");
}
}
});
Dokładnie tak. Dla mnie działa idealnie.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 16:02:15
To zadziałało dla mnie
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.widget.TextView;
import com.facebook.*;
import com.facebook.model.*;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// start Facebook Login
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
// make request to the /me API
Request.newMeRequest(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
TextView welcome = (TextView) findViewById(R.id.welcome);
welcome.setText("Hello " + user.getName() + "!");
}
}
}).executeAsync();
}
}
});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
}
Jeśli chcesz uzyskać autoryzację po sprawdzeniu ,że sesja jest otwarta, Dodaj w ten sposób:
List<String> permissions = session.getPermissions();
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(getActivity(), Arrays.asList("read_mailbox"));
session.requestNewReadPermissions(newPermissionsRequest);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-18 20:39:33
Ta prosta biblioteka może Ci pomóc: https://github.com/sromku/android-simple-facebook
Wystarczy dodać tę bibliotekę do swojego projektu i dokonać odniesienia z tej biblioteki do Facebook SDK 3.0.x i dodać odniesienie z aplikacji do tej biblioteki.
Następnie możesz zalogować się bez LoginButton
i wykonywać proste czynności, takie jak publikowanie kanałów, zdobywanie profilu/znajomych, wysyłanie zaproszeń i wiele innych.
Tak wygląda login:
OnLoginOutListener onLoginOutListener = new SimpleFacebook.OnLoginOutListener()
{
@Override
public void onFail()
{
Log.w(TAG, "Failed to login");
}
@Override
public void onException(Throwable throwable)
{
Log.e(TAG, "Bad thing happened", throwable);
}
@Override
public void onThinking()
{
// show progress bar or something to the user while login is happening
Log.i(TAG, "In progress");
}
@Override
public void onLogout()
{
// change the state of the button or do whatever you want
Log.i(TAG, "Logged out");
}
@Override
public void onLogin()
{
// change the state of the button or do whatever you want
Log.i(TAG, "Logged in");
}
};
// set login/logut listener
mSimpleFacebook.setLogInOutListener(onLoginOutListener);
// do the login action
mSimpleFacebook.login(MainActivity.this);
Następnie w metodzie callback onLogin()
możesz opublikować kanał tak:
// build feed
Feed feed = new Feed.Builder()
.setMessage("Clone it out...")
.setName("Simple Facebook for Android")
.setCaption("Code less, do the same.")
.setDescription("The Simple Facebook library project makes the life much easier by coding less code for being able to login, publish feeds and open graph stories, invite friends and more.")
.setPicture("https://raw.github.com/sromku/android-simple-facebook/master/Refs/android_facebook_sdk_logo.png")
.setLink("https://github.com/sromku/android-simple-facebook")
.build();
// publish the feed
mSimpleFacebook.publish(feed);
Mam nadzieję, że ci pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 16:19:37
Zwrot w celu uzyskania dostępu do szczegółów FB przy użyciu LoginButton to
1)Ukryj swój LoginButton UI
2) Dodaj swój niestandardowy przycisk
Button signup = (Button) view.findViewById(R.id.btn_signup);
signup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loginButton.performClick();//Where loginButton is Facebook UI
}
});
Ale proponuję użyć LoginManager
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-12 06:08:41
Możesz ominąć okno logowania za pomocą modułu node powered facebook-proxy. Utwórz własną instancję w Heroku za pomocą przycisku wdrażania jednym kliknięciem.
Co to w zasadzie robi:
- Prośba o
access_token
z Facebook - otwiera serwer proxy za pomocą
express-http-proxy
- poproś o wszystkie punkty końcowe API
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-09 22:18:43