最新 android facebook sdk 登录的工作示例
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21634138/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Working example of latest android facebook sdk login
提问by user782104
I am working on custom facebook login button, I found that there is little source (especially working code example) about the latest facebook android sdk. I spent all day but still the code is not working. I wonder if there is any project example or your project code of:
我正在开发自定义 facebook 登录按钮,我发现关于最新的 facebook android sdk 的资源很少(尤其是工作代码示例)。我花了一整天,但代码仍然无法正常工作。我想知道是否有任何项目示例或您的项目代码:
- facebook login:
- share session to other activity/fragment (so I can check the login / logout status in everywhere of the app)
- post to wall
- logout
- Facebook登入:
- 与其他活动/片段共享会话(这样我就可以在应用程序的任何地方检查登录/注销状态)
- 贴到墙上
- 登出
Here are my code, but it actually return non-login status even I am logined
这是我的代码,但即使我已登录,它实际上也返回非登录状态
Login:
登录:
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");
}
}
}
Any kind of help is appreciate , thanks for kindly help
感谢任何形式的帮助,感谢您的帮助
采纳答案by Sagar Shah
First of all install latest sdk and do something like this:
首先安装最新的 sdk 并执行如下操作:
Under ~\FaceBook-Sdk\facebook-android-sdk-3.5.2\samples.
在 ~\FaceBook-Sdk\facebook-android-sdk-3.5.2\samples 下。
You will find the samples of whatever you have posted. But may be It will not work. So what you have to do to make it run is:
您将找到您发布的任何内容的示例。但可能是行不通的。所以你需要做的是让它运行:
Make application on Facebook side. Get your fb_api_key from there and put in the project you get from samples.
在 Facebook 端申请。从那里获取您的 fb_api_key 并放入您从示例中获得的项目。
回答by Faisal Basra
See this example, it is using Latest Facebook SDK and cover basic login + sharing.
看这个例子,它使用的是最新的 Facebook SDK,涵盖了基本的登录 + 分享。
Now do the following changes to your application manifest file. Put the following code before tag. Make sure you are using your own AppID obtained from Facebook developer console.
现在对您的应用程序清单文件进行以下更改。将以下代码放在标签之前。确保您使用的是从 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" />
Your Activity Layout
你的活动布局
<?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>
Activity Java class
活动 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);
}
}
This is complete code, which provides login, status update, image update to the point.
这是完整的代码,提供登录、状态更新、图片更新到点。
For detail see following link. http://javatechig.com/android/using-facebook-sdk-in-android-example
详情见以下链接。 http://javatechig.com/android/using-facebook-sdk-in-android-example