我正在尝试在我的应用中实现Facebook登录功能,并在获得发布权限后获取令牌。
为此,我按照以下步骤操作。
在Facebook上创建应用(填写所有详细信息,如应用名称,哈希键(发布),类名,包名称,单点登录)
App现在可供所有用户使用。
如果在我的手机上安装Native Facebook应用程序,一切都正常。但是如果本机应用程序没有安装,那么它会在填写登录信息后打开facebook webview,它要求我在点击确定按钮后授权再次要求我登录。这个过程将继续下去。
****登录并允许应用程序权限后,它不会回到我的屏幕,但它要求再次登录我****。
这是我的截屏。
这是第二次屏幕截图
点击确定然后再次要求我登录。这是循环登录 - 授权 - 登录..
这是我的完整代码:
我正在使用自己的按钮,所以我没有添加xml代码。
public class FBActivity extends Activity {
Session.StatusCallback statusCallback = new SessionStatusCallback();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.registartionwithmultiple);
printHashKey();
bundle = savedInstanceState;
permissions = new ArrayList<String>();
readpermissions = new ArrayList<String>();
permissions.add("publish_actions");
readpermissions.add("email");
executeFacebookLogin();
}
private void executeFacebookLogin() {
Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);
Session session = Session.getActiveSession();
if(session == null) {
if(bundle != null) {
Log.i("TEST","RESTORING FROM BUNDLE");
session = Session.restoreSession(this, null, statusCallback, bundle);
}
if(session == null) {
Log.i("TEST","CREATE NEW SESSION");
session = new Session(this);
}
Session.setActiveSession(session);
session.addCallback(statusCallback);
if(session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
}
}
if(session.isClosed()) {
session.closeAndClearTokenInformation();
Session.setActiveSession(null);
}
if(!session.isOpened()) {
session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(readpermissions));
Log.i("FB Login ","Open for Publish");
} else {
Session.openActiveSession(this, true, statusCallback);
}
}
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
//Check if Session is Opened or not
processSessionStatus(session, state, exception);
}
}
@SuppressWarnings("deprecation")
public void processSessionStatus(Session session, SessionState state, Exception exception) {
Log.i("TEST","Session in process session "+session);
if(session != null && session.isOpened()) {
if(session.getPermissions().contains("publish_actions")) {
//Show Progress Dialog
dialog = new ProgressDialog(this);
dialog.setMessage("Loggin in..");
dialog.show();
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
if (dialog!=null && dialog.isShowing()) {
dialog.dismiss();
}
if(user != null) {
Map<String, Object> responseMap = new HashMap<String, Object>();
GraphObject graphObject = response.getGraphObject();
responseMap = graphObject.asMap();
Log.i("FbLogin", "Response Map KeySet - " + responseMap.keySet());
// TODO : Get Email responseMap.get("email");
fb_id = user.getId();
fb_email = null;
user.getBirthday();
fb_userName = user.getUsername();
fb_fullname = user.getFirstName() +" "+user.getLastName();
String name = (String) responseMap.get("name");
if (responseMap.get("email")!=null) {
fb_email = responseMap.get("email").toString();
Log.i("TEST", "FB_ID="+fb_id +"email="+fb_email+"name="+name+"user_name="+user.getUsername()+"birthday="+user.getBirthday());
Session session = Session.getActiveSession();
tokenKey = session.getAccessToken();
SharedPreferenceStoring myPrefsClass = new SharedPreferenceStoring();
myPrefsClass.storingFBToken(FBActivity.this, tokenKey);
finish();
}
else {
//Clear all session info & ask user to login again
Session session = Session.getActiveSession();
if(session != null) {
session.closeAndClearTokenInformation();
}
}
}
}
});
} else {
session.requestNewPublishPermissions(new Session.NewPermissionsRequest(FBActivity.this, permissions));
}
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i("TEST","Activity result");
super.onActivityResult(requestCode, resultCode, data);
Log.d("FbLogin", "Result Code is - " + resultCode +"");
Session.getActiveSession().onActivityResult(FBActivity.this, requestCode, resultCode, data);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Save current session
super.onSaveInstanceState(outState);
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
}
}
我也得到哈希键..这是哈希键的代码
private void printHashKey() {
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.myapp",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:",
Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
}
我还在Internet Permission
和AndroidManifest.xml
为Facebook添加了meta-data
。
希望所有这些信息都足够,如果需要更多的东西肯定会更新我的问题。
请给我任何参考或提示。
答案 0 :(得分:1)
你需要一个库easyfacebookandroidsdk.jar并在你的项目中构建它
使用此代码:
public class MainActivity extends Activity implements LoginListener{
EditText et1;
private FBLoginManager fbLoginManager;
Button b;
//replace it with your own Facebook App ID
public final String FacebookTesting="218874471621782";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et1=(EditText)findViewById(R.id.editText1);
b=(Button)findViewById(R.id.button1);
connectToFacebook();
}
public void connectToFacebook(){
//read about Facebook Permissions here:
//http://developers.facebook.com/docs/reference/api/permissions/
String permissions[] = {
// "user_about_me",
// "user_activities",
// "user_birthday",
// "user_checkins",
// "user_education_history",
// "user_events",
// "user_groups",
// "user_hometown",
// "user_interests",
// "user_likes",
// "user_location",
// "user_notes",
// "user_online_presence",
// "user_photo_video_tags",
// "user_photos",
// "user_relationships",
// "user_relationship_details",
// "user_religion_politics",
// "user_status",
// "user_videos",
// "user_website",
// "user_work_history",
// "email",
//
// "read_friendlists",
// "read_insights",
// "read_mailbox",
// "read_requests",
// "read_stream",
// "xmpp_login",
// "ads_management",
// "create_event",
// "manage_friendlists",
// "manage_notifications",
// "offline_access",
// "publish_checkins",
"publish_stream",
// "rsvp_event",
// "sms",
//"publish_actions",
// "manage_pages"
};
fbLoginManager = new FBLoginManager(this,
R.layout.activity_main,
FacebookTesting,
permissions);
if(fbLoginManager.existsSavedFacebook()){
fbLoginManager.loadFacebook();
}
else{
fbLoginManager.login();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, android.content.Intent data){
fbLoginManager.loginSuccess(data);
}
public void loginSuccess(Facebook facebook) {
// GraphApi graphApi = new GraphApi(facebook);
new getDataBackgroundThread().execute(facebook);
// User user = new User();
// try{
// user = graphApi.getMyAccountInfo();
//
// //update your status if logged in
// graphApi.setStatus("Hello, world!");
// } catch(EasyFacebookError e){
// Log.d("TAG: ", e.toString());
// }
// fbLoginManager.displayToast("Hey, " + user.getFirst_name() + "! Login success!");
}
@Override
public void logoutSuccess() {
// TODO Auto-generated method stub
}
@Override
public void loginFail() {
// TODO Auto-generated method stub
}
class getDataBackgroundThread extends AsyncTask<Facebook, Void, String> {
private Exception exception;
protected String doInBackground(Facebook... urls) {
try{
GraphApi graphApi = new GraphApi(urls[0]);
User user = new User();
try{
// user = graphApi.getMyAccountInfo();
//update your status if logged in
//graphApi.setStatus("My android App "+"VivekAppTest");
graphApi.setStatus("Hello "+"VivekAppTest");
} catch(EasyFacebookError e){
Log.d("TAG: ", e.toString());
}
return "posted";
}
catch (Exception e) {
// TODO: handle exception
return null;
}
}
protected void onPostExecute(String ipr) {
// TODO: check this.exception
// TODO: do something with the feed
//
// Intent i=new Intent(getApplicationContext(),MainActivity.class);
// startActivity(i);
// finish();
// Toast toast=Toast.makeText(getApplicationContext(),"Post Successful !", 1);
// toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL,0, 130);
// toast.show();
//
}
}
}
获取您的Facebook App id&amp;在代码中替换它。每当我必须在FB上发布文本时,我总是使用这段代码。
在清单中给予互联网许可
<uses-permission android:name="android.permission.INTERNET"/>
多数人
干杯
答案 1 :(得分:0)
所以我想告诉你的是,你必须找到关键哈希值并将其放在facebook控制台中,使用下面的代码获取Key Hash值:
try {
PackageInfo info = getPackageManager().getPackageInfo("com.key", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
TextView tvmyName = (TextView)findViewById(R.id.KeyText);
tvmyName.setText(Base64.encodeBytes(md.digest()));
Log.d("KEY_HASH", Base64.encodeBytes(md.digest()));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
KeyHash值1:tvmyName.setText(Base64.encodeBytes(md.digest()));
KeyHash值2:Log.d(“KEY_HASH”,Base64.encodeBytes(md.digest()));
请在facebook控制台中传递keyhash值,如下图所示:
答案 2 :(得分:0)
首先,避免将Facebook SDK
复制到当前工作区,将其保存在某个位置,然后将Facebook SDK
的工作集添加到工作区中。
我尝试过一个简单的应用并从用户那里获得一些权限。以下是我试过的代码,在我没有在设备上安装Facebook应用程序的情况下完全正常工作。
public class MainActivity extends Activity implements StatusCallback {
final Context context = this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) {
Session session = new Session.Builder(context).build();
Session.setActiveSession(session);
currentSession = session;
}
if (currentSession.isOpened()) {
// Do whatever u want. User has logged in
} else if (!currentSession.isOpened()) {
// Ask for username and password
OpenRequest op = new Session.OpenRequest((Activity) context);
op.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
op.setCallback(null);
List<String> permissions = new ArrayList<String>();
permissions.add("user_likes");
permissions.add("email");
permissions.add("user_birthday");
permissions.add("user_location");
permissions.add("user_interests");
permissions.add("friends_birthday");
op.setPermissions(permissions);
Session session = new Builder(MainActivity.this).build();
Session.setActiveSession(session);
session.openForRead(op);
}
}
public void call(Session session, SessionState state, Exception exception) {
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
System.out.println("Here");
super.onActivityResult(requestCode, resultCode, data);
if (Session.getActiveSession() != null)
Session.getActiveSession().onActivityResult(this, requestCode,
resultCode, data);
Session currentSession = Session.getActiveSession();
if (currentSession == null || currentSession.getState().isClosed()) {
Session session = new Session.Builder(context).build();
Session.setActiveSession(session);
currentSession = session;
}
if (currentSession.isOpened()) {
Session.openActiveSession(this, true, new Session.StatusCallback() {
@SuppressWarnings("deprecation")
@Override
public void call(final Session session, SessionState state,
Exception exception) {
if (session.isOpened()) {
Request.executeMeRequestAsync(session,
new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user,
Response response) {
if (user != null) {
System.out.println(user.getName());
System.out.println(session
.getAccessToken());
System.out.println(user
.getFirstName());
}
}
});
}
}
});
}
}
}
在onActivityResult
我尝试打印一些基本信息。如果碰到这个当前代码的任何问题,只需尝试代码并发表评论。
答案 3 :(得分:0)