Android 如何使用其他facebook帐户登录?

Android 如何使用其他facebook帐户登录?,android,facebook,login,Android,Facebook,Login,我是下面做一个小应用程序登录,说你好+用户名 问题是:我只能使用我的帐户登录,但不能使用其他帐户登录。 这个问题发生在一些需要登录的示例代码中,比如HelloFacebookSample或Scrumptius。 Logcat没有显示任何错误 所以请帮我用其他帐户登录。提前谢谢 编辑(已解决): 我刚刚找到原因:我的应用程序处于沙盒模式,只需禁用沙盒模式即可解决问题。谢谢任何人的帮助 我的代码: public class MainActivity extends Activity { @Ov

我是下面做一个小应用程序登录,说你好+用户名

问题是:我只能使用我的帐户登录,但不能使用其他帐户登录。 这个问题发生在一些需要登录的示例代码中,比如HelloFacebookSample或Scrumptius。 Logcat没有显示任何错误

所以请帮我用其他帐户登录。提前谢谢

编辑(已解决): 我刚刚找到原因:我的应用程序处于沙盒模式,只需禁用沙盒模式即可解决问题。谢谢任何人的帮助

我的代码:

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.executeMeRequestAsync(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() + "!");
              }
            }
          });
        }
      }
    });
  }

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

}
使用我的帐户登录时的屏幕截图:显示hello+我的名字(Nguyễ六ệt Anh)

使用其他帐户登录时的屏幕截图:白色屏幕
这是预期的行为。本质上,facebook的登录是SSO(单点登录),因此人们强烈期望用户在其设备上只有一个帐户

我自己也试图找到一种方法,让Facebook SDK允许用户登录到不同的帐户,但它不起作用

也许可以通过清除缓存来蒙混过关,但这对在手机上使用正版facebook应用程序的用户没有帮助

我最后做的是使用web工作流,而不是本机应用程序。我可以推荐scribe来完成这项任务

如果您选择使用Scribe,这是我的登录活动

public class FacebookScribeLogin extends FragmentActivity{
private static final String TAG = FacebookScribeLogin.class.getSimpleName();
private final static String CALLBACK = "http://localhost:3000/";

private WebView mWebView;
private ProgressDialog mProgressDialog;

private OAuthService mAuthService;
private SyncStatusUpdaterFragment mSyncStatusUpdaterFragment;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.webview);

    mWebView = (WebView) findViewById(R.id.webview);

    new GetLoginPage().execute();
}

private class GetLoginPage extends AsyncTask<Void, Void, String> {
    @Override
    protected String doInBackground(Void... voids) {
        //set up service and get request token as seen on scribe website
        //https://github.com/fernandezpablo85/scribe-java/wiki/Getting-Started
        mAuthService = new ServiceBuilder()
                .provider(FacebookApi.class)
                .apiKey(getString(R.string.facebook_api_key))
                .apiSecret(getString(R.string.facebook_api_secret))
                .scope("read_stream, publish_stream, manage_notifications, publish_actions, manage_pages")
                .callback(CALLBACK)
                .build();

        return mAuthService.getAuthorizationUrl(null);
    }

    @Override
    protected void onPostExecute(String authURL) {
        //send user to authorization page
        android.webkit.CookieManager.getInstance().removeAllCookie();

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //check for our custom callback protocol otherwise use default behavior
                if (url.startsWith(CALLBACK)) {
                    GetAccessToken getAccessToken = new GetAccessToken(url);
                    getAccessToken.execute();

                    return true;
                }

                if(mProgressDialog == null){
                    mProgressDialog = ProgressDialog.show(FacebookScribeLogin.this, null,
                        String.format(getString(R.string.talking_to_x), getString(R.string.facebook)), true, false);
                }

                return super.shouldOverrideUrlLoading(view, url);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                if(mProgressDialog != null){
                    mProgressDialog.hide();
                    mProgressDialog = null;
                }
            }
        });
        mWebView.loadUrl(authURL);

    }
}

private class GetAccessToken extends AsyncTask<Void, Void, Void>{
    private String mUrl, mToken, mSecret;

    private GetAccessToken(String url) {
        mUrl = url;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        Uri uri = Uri.parse(mUrl);

        String verifierStr = uri.getQueryParameter("code");
        Verifier verifier = new Verifier(verifierStr);

        //save this token for practical use.
        Token accessToken = mAuthService.getAccessToken(null, verifier);
        mToken = accessToken.getToken();
        mSecret = accessToken.getSecret();

        return null;
    }

    @Override
    protected void onPostExecute(Void s) {
        //mToken - save your mToken somehwere and perhaps use a graph API call for user details
    }
}



}
public类FacebookScribeLogin扩展了碎片活动{
private static final String TAG=FacebookScribeLogin.class.getSimpleName();
私有最终静态字符串回调=”http://localhost:3000/";
私有网络视图;
private ProgressDialog mProgressDialog;
私人OAuthService mAuthService;
私有SyncStatusUpdaterFragment mSyncStatusUpdaterFragment;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.webview);
mWebView=(WebView)findViewById(R.id.WebView);
新建GetLoginPage().execute();
}
私有类GetLoginPage扩展异步任务{
@凌驾
受保护的字符串背景(无效…无效){
//设置服务并获取scribe网站上显示的请求令牌
//https://github.com/fernandezpablo85/scribe-java/wiki/Getting-Started
mAuthService=newServiceBuilder()
.provider(FacebookApi.class)
.apiKey(getString(R.string.facebook\u api\u key))
.apiSecret(getString(R.string.facebook\u api\u secret))
.scope(“读取\u流、发布\u流、管理\u通知、发布\u操作、管理\u页面”)
.callback(回调)
.build();
返回mAuthService.getAuthorizationUrl(null);
}
@凌驾
受保护的void onPostExecute(字符串authURL){
//将用户发送到授权页面
android.webkit.CookieManager.getInstance().removeAllCookie();
setWebViewClient(新的WebViewClient()){
@凌驾
公共布尔值shouldOverrideUrlLoading(WebView视图,字符串url){
//检查我们的自定义回调协议,否则使用默认行为
if(url.startsWith(回调)){
GetAccessToken GetAccessToken=新的GetAccessToken(url);
getAccessToken.execute();
返回true;
}
如果(mProgressDialog==null){
mProgressDialog=ProgressDialog.show(FacebookScribeLogin.this,null,
format(getString(R.String.talking_to_x),getString(R.String.facebook)),true,false);
}
返回super.shouldOverrideUrlLoading(视图、url);
}
@凌驾
公共void onPageFinished(WebView视图,字符串url){
如果(mProgressDialog!=null){
mProgressDialog.hide();
mProgressDialog=null;
}
}
});
加载URL(authURL);
}
}
私有类GetAccessToken扩展异步任务{
私人字符串mUrl、mToken、mSecret;
私有GetAccessToken(字符串url){
mUrl=url;
}
@凌驾
受保护的空位背景(空位…空位){
Uri=Uri.parse(mUrl);
字符串验证器tr=uri.getQueryParameter(“代码”);
验证者验证者=新验证者(验证者TR);
//保存此令牌以供实际使用。
Token accessToken=mAuthService.getAccessToken(null,验证器);
mToken=accessToken.getToken();
mSecret=accessToken.getSecret();
返回null;
}
@凌驾
受保护的void onPostExecute(void s){
//mToken-将mToken保存在某个地方,也许可以使用图形API调用获取用户详细信息
}
}
}

您可以使用不同的Facebook用户id登录,然后:

  • 从顶部选择应用程序
  • 从左侧选择想要的应用程序
  • 选择编辑应用程序
  • 禁用沙箱模式

这不是您的帐户,而是您的FB应用程序。所以,尝试使用不同的用户ID登录。@DhawalSodha是的,我的意思是如何使用不同的facebook用户ID登录?我尝试使用我的朋友facebook用户ID登录,但这不起作用。