Login/LogoutやPublish To Feedの例など、Facebook API 3.0のチュートリアルをいくつかフォローしました。したがって、ログインは次のように機能します。
ユーザーにこの方法でログインさせたくありません。ログイン/登録せずにアプリを使用してもらい、Facebook固有の機能(例: Facebookでメモを共有したら、アプリはFacebookにアプリを使用させるかどうかを尋ねる必要があります。これがなければ、ログインが行われていないため、セッションがnullであるため、publishFeedDialog()関数でnullポインタを取得します。
だから私の質問は、ログインボタンでSplashFragmentをどのように無視できるのですか?ユーザーが私のアプリのFacebook機能をクリックすると、ログインボタンのある新しい画面は表示されず、ユーザーが使用されるデフォルトのFacebook認証ウィンドウのみですに?
@ erdomester、@ sromku
Facebookは、セッションが廃止された新しいSDKバージョン4.xをリリースしました。
Facebookからのログインの新しいコンセプトがあります
LoginManagerおよびAccessToken -これらの新しいクラスはFacebookログインを実行します
そのため、ログインボタンなしでFacebook認証にアクセスできます。
layout.xml
<Button
Android:id="@+id/btn_fb_login"
.../>
MainActivity.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"));
}
});
}
以下を追加しないと機能しません(下のコメントの @ Daniel Zolnai で正しく指摘されています):
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(mCallbackManager.onActivityResult(requestCode, resultCode, data)) {
return;
}
}
このようなもの
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");
}
}
});
実際にそのように。それは私にとって完璧に動作します。
これは私のために働いた
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);
}
}
セッションが開いていることを確認した後に承認を取得する必要がある場合は、次のように追加します。
List<String> permissions = session.getPermissions();
Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(getActivity(), Arrays.asList("read_mailbox"));
session.requestNewReadPermissions(newPermissionsRequest);
このシンプルなライブラリはあなたを助けることができます: https://github.com/sromku/Android-simple-facebook
このライブラリをプロジェクトに追加し、このライブラリからFacebook SDK 3.0.xへの参照を作成し、アプリからこのライブラリへの参照を追加するだけです。
その後、LoginButton
なしでログインし、フィードの公開、プロフィール/友達の取得、招待状の送信などの簡単なアクションを実行できます。
ログインは次のようになります。
_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);
_
次に、onLogin()
コールバックメソッドで、次のようにフィードを公開できます。
_// 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);
_
それがあなたを助けることを願っています。
LoginButtonを使用してFBの詳細にアクセスするためのTurnaroubdは
1)LoginButton UIを非表示にする
2)カスタムボタンを追加する
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
}
});
ただし、LoginManagerを使用することをお勧めします
Node powered facebook-proxy モジュールを使用してログインダイアログをバイパスできます。ワンクリック展開ボタンを使用してHerokuに独自のインスタンスを作成します。
それが基本的にすること:
access_token
をリクエストしますexpress-http-proxy
を使用してプロキシサーバーを開きます