最新的Android Facebook SDK登录的工作示例

12

我正在制作自定义Facebook登录按钮,我发现关于最新的Facebook Android SDK,很少有资料(特别是工作代码示例)。我花了一整天的时间,但代码仍然无法正常工作。我想知道是否有项目示例或您的项目代码可供参考:

  1. Facebook登录:
  2. 共享会话到其他活动/片段(这样我就可以在应用程序的任何地方检查登录/注销状态)
  3. 发布到墙上
  4. 注销

这是我的代码,但它实际上返回未登录状态,即使我已经登录了

登录:

public class Login {
    private final static String TAG = "FaceBookLogin";
    public Context ctx;
    public Session fb_session;

    public Login(Context _ctx) {
        ctx = _ctx;
        Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
        fb_session = Session.getActiveSession();

        if(fb_session == null)                   
            fb_session = Session.openActiveSessionFromCache(ctx);
    }

    public void checkLogin() {
        printHashKey();
        if (fb_session != null && fb_session.isOpened()) {
            Log.i(TAG, "Facebook Login State");
        } else {
            if (fb_session == null)
                fb_session = new Session(ctx);

            Session.setActiveSession(fb_session);
            ConnectToFacebook();
            Log.i(TAG, "Facebook Not login State");
        }
    }

    public void printHashKey() {

        try {
            PackageInfo info = ctx.getPackageManager().getPackageInfo("com.project.hkseven",
                    PackageManager.GET_SIGNATURES);
            for (Signature signature : info.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                Log.d(TAG,
                        Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
        } catch (NameNotFoundException e) {
              Log.d(TAG,""+e);
        } catch (NoSuchAlgorithmException e) {
              Log.d(TAG,""+e);
        }

    }

    private void ConnectToFacebook() {
        Session session = Session.getActiveSession();

        if(session == null)                   
            session = Session.openActiveSessionFromCache(ctx);

        if (!session.isOpened() && !session.isClosed()) {
            Log.i(TAG, "ConnectToFacebook if");
            OpenRequest newSession = new Session.OpenRequest((Activity) ctx);
            newSession.setCallback(callback);
            session.openForRead(newSession);
            try {
                Session.OpenRequest request = new Session.OpenRequest((Activity) ctx);
                request.setPermissions(Arrays.asList("email","publish_stream","publish_actions"));
            } catch (Exception e) {
                Log.d(TAG,""+e);
                e.printStackTrace();
            }
        } else {
            Log.i(TAG, "ConnectToFacebook else");
            Session.openActiveSession((Activity) ctx, true, callback);
        }
    }

    private Session.StatusCallback callback = new Session.StatusCallback() {
        public void call(final Session session, final SessionState state,
                final Exception exception) {
            Log.d(TAG,"callback" + state);
            onSessionStateChange(session, state, exception);
        }
    };

    private void onSessionStateChange(final Session session,
            SessionState state, Exception exception) {
        Log.i(TAG, "state change");
        if (session != null && session.isOpened()) {
            Log.i(TAG, "Change to Facebook Login");
        }
    }
}

任何形式的帮助都将不胜感激,感谢您的慷慨援助。


我看过一个使用Facebook登录的示例,你可以在这里找到它:http://www.demoadda.com/demo/android/login-with-facebook_108 - Kishan Dhamat
2个回答

30

看这个例子,它使用最新的Facebook SDK并涵盖了基本的登录+分享。

现在对应用程序清单文件进行以下更改。在<application>标签之前放置以下代码。确保您正在使用从Facebook开发人员控制台获取的自己的AppID。

<activity android:name="com.facebook.LoginActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<meta-data android:name="com.facebook.sdk.ApplicationId"
                android:value="@string/app_id" />

你的活动布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:facebook="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="20dp" >

    <com.facebook.widget.LoginButton
        android:id="@+id/fb_login_button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        facebook:confirm_logout="false"
        facebook:fetch_user_info="true" />

    <TextView
        android:id="@+id/user_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="10dp"
        android:textSize="18sp" />

    <Button
        android:id="@+id/update_status"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/update_status" />

    <Button
        android:id="@+id/post_image"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/post_image" />

</LinearLayout>

活动 Java 类

package com.domain.yourapp;

import java.util.Arrays;
import java.util.List;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.facebook.Request;
import com.facebook.Response;
import com.facebook.Session;
import com.facebook.SessionState;
import com.facebook.UiLifecycleHelper;
import com.facebook.model.GraphUser;
import com.facebook.widget.LoginButton;
import com.facebook.widget.LoginButton.UserInfoChangedCallback;

public class FBActivity extends FragmentActivity {

    private LoginButton loginBtn;
    private Button postImageBtn;
    private Button updateStatusBtn;

    private TextView userName;

    private UiLifecycleHelper uiHelper;

    private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");

    private static String message = "Sample status posted from android app";

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

        uiHelper = new UiLifecycleHelper(this, statusCallback);
        uiHelper.onCreate(savedInstanceState);

        setContentView(R.layout.activity_facebook);

        userName = (TextView) findViewById(R.id.user_name);
        loginBtn = (LoginButton) findViewById(R.id.fb_login_button);
        loginBtn.setUserInfoChangedCallback(new UserInfoChangedCallback() {
            @Override
            public void onUserInfoFetched(GraphUser user) {
                if (user != null) {
                    userName.setText("Hello, " + user.getName());
                } else {
                    userName.setText("You are not logged");
                }
            }
        });

        postImageBtn = (Button) findViewById(R.id.post_image);
        postImageBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                postImage();
            }
        });

        updateStatusBtn = (Button) findViewById(R.id.update_status);
        updateStatusBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

            }
        });

        buttonsEnabled(false);
    }

    private Session.StatusCallback statusCallback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state,
                Exception exception) {
            if (state.isOpened()) {
                buttonsEnabled(true);
                Log.d("FacebookSampleActivity", "Facebook session opened");
            } else if (state.isClosed()) {
                buttonsEnabled(false);
                Log.d("FacebookSampleActivity", "Facebook session closed");
            }
        }
    };

    public void buttonsEnabled(boolean isEnabled) {
        postImageBtn.setEnabled(isEnabled);
        updateStatusBtn.setEnabled(isEnabled);
    }

    public void postImage() {
        if (checkPermissions()) {
            Bitmap img = BitmapFactory.decodeResource(getResources(),
                    R.drawable.ic_launcher);
            Request uploadRequest = Request.newUploadPhotoRequest(
                    Session.getActiveSession(), img, new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            Toast.makeText(FBActivity.this,
                                    "Photo uploaded successfully",
                                    Toast.LENGTH_LONG).show();
                        }
                    });
            uploadRequest.executeAsync();
        } else {
            requestPermissions();
        }
    }

    public void postStatusMessage() {
        if (checkPermissions()) {
            Request request = Request.newStatusUpdateRequest(
                    Session.getActiveSession(), message,
                    new Request.Callback() {
                        @Override
                        public void onCompleted(Response response) {
                            if (response.getError() == null)
                                Toast.makeText(FBActivity.this,
                                        "Status updated successfully",
                                        Toast.LENGTH_LONG).show();
                        }
                    });
            request.executeAsync();
        } else {
            requestPermissions();
        }
    }

    public boolean checkPermissions() {
        Session s = Session.getActiveSession();
        if (s != null) {
            return s.getPermissions().contains("publish_actions");
        } else
            return false;
    }

    public void requestPermissions() {
        Session s = Session.getActiveSession();
        if (s != null)
            s.requestNewPublishPermissions(new Session.NewPermissionsRequest(
                    this, PERMISSIONS));
    }

    @Override
    public void onResume() {
        super.onResume();
        uiHelper.onResume();
        buttonsEnabled(Session.getActiveSession().isOpened());
    }

    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }

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

    @Override
    public void onSaveInstanceState(Bundle savedState) {
        super.onSaveInstanceState(savedState);
        uiHelper.onSaveInstanceState(savedState);
    }

}

这是完整的代码,提供登录、状态更新和图像更新。

详情请参见以下链接。 http://javatechig.com/android/using-facebook-sdk-in-android-example


实际上,我找不到导入Facebook Jars的任何方法。你知道如何在Gradle中使用Jar文件吗?你有任何关于Gradle自动导入的代码吗?我正在使用Android Studio,我需要Jar文件或Gradle代码。 - mehmetakifalp
如果设备上安装了原生应用程序,则在电子邮件方面它会返回空值。 - Bhoomika Brahmbhatt
@Faisal Bastra:你忘记在updateStatusBtn的点击监听器中调用postStatusMessage()了。 - Apfelsaft
很好的回答!帮了很多忙。 - Victor Laerte
不再起作用:在最新的SDK中,com.facebook.widget.LoginButton.UserInfoChangedCallback已不存在。 - pipacs
显示剩余9条评论

5

首先安装最新的sdk,并执行以下操作:

位于 ~\FaceBook-Sdk\facebook-android-sdk-3.5.2\samples 下。

您将找到您发布内容的示例。但可能无法正常工作。因此,为使其运行,您需要执行以下步骤:

在Facebook上创建应用程序。从那里获取您的fb_api_key,并放入从示例中获取的项目中。


谢谢你的帮助,实际上我之前已经浏览过了。我查看了 SessionLoginSample 但是它不是很容易理解,并且其中提供了一些非必要的代码。我想我会去看 hellofacebook 那个例子。 - user782104
我正在寻找像这样的教程:http://polamreddyn.blogspot.in/2013/12/android-facebook-login-using-facebook.html。不幸的是,这个例子无法工作。 - user782104
我建议你先尝试Session Login示例,然后再去尝试Hellofaebook。 - Sagar Shah
1
这也是一个不错的教程,但它来自旧的SDK:如果你喜欢,请查看:http://www.androidhive.info/2012/03/android-facebook-connect-tutorial/ - Sagar Shah
感谢您的帮助。我正在自定义Session Login示例,并希望它能够与发布消息的HelloSimple一起使用。 - user782104

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接