2013-05-02 145 views
10

我使用restfb API以Java访问我的朋友的照片。为了访问这些照片,我使用Graph API explorer手动生成访问代码,并将此作为参数传递给restfb API调用。如何在android中获取facebook用户访问令牌?

但现在我想通过生成的代码(编程)此访问令牌。我见过fb android样本,尤其是hackbook。我没有看到任何可以用于我自己的应用程序的访问代码。我需要创建一个新的应用程序,并获得一些秘密等?任何建议将不胜感激。

我已经看到了这些解决方案(solution-1 & solution-2)在stackoverflow但我仍然没有得到从哪里开始?

更新-1 ::

我使用下面的代码登录并获得访问令牌登录的用户。但问题是,它只适用于我在Facebook上创建应用程序以生成app_id的帐户。它不会收到其他帐户的回电。请提供任何建议。

和公正的情况下,如果你不知道从哪里开始,遵循step-6从头创建一个新的应用程序。

public class MainActivity extends Activity implements OnClickListener { 

    Button login; 
    TextView accessToken; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     login = (Button) findViewById(R.id.login); 
     accessToken = (TextView) findViewById(R.id.accessToken); 

     login.setOnClickListener(this); 
     // start Facebook 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 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
    } 

    @Override 
    public void onResume() 
    { 
     Session session = Session.getActiveSession(); 
     if(session != null) 
      if (session.isOpened()) { 
       //Toast.makeText(this, session.getAccessToken(), Toast.LENGTH_LONG).show(); 
       accessToken = (TextView) findViewById(R.id.accessToken); 
       accessToken.setText(session.getAccessToken()); 
       System.out.println("----------------------" + session.getAccessToken() + "---------------------"); 

      } 
     super.onResume(); 
    } 

    @Override 
    public void onClick(View v) { 
     // 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() + "!"); 
            } 
           } 
          }); 
       } 
      } 
     }); 

    } 

    } 

回答

0

对原始问题的回答已作为update-1输入。但它只适用于管理员用户。程序创建时其实

,我错误地选择其只限制到开发商的应用程序配置页面添加应用程序的访问“沙盒”模式。因此,在禁用此模式后,我也能够为其他用户生成访问令牌。

8

使用Facebook SDK,更好的方式来管理用户的身份验证是通过Session类。 当你有一个Session类的有效实例时,你只需要调用getAccessToken()就可以获得表示访问令牌的字符串。

Session session = Session.getActiveSession(); 
if (session != null && session.getState().isOpened()){ 
    Log.i("sessionToken", session.getAccessToken()); 
    Log.i("sessionTokenDueDate", session.getExpirationDate().toLocaleString()); 
} 
+0

感谢您的回答,我不允许创建会话的对象。请让我知道为什么会发生这种情况! – TharakaNirmana 2013-05-11 14:40:34

+0

实际上,如果您从前一个会话中获得空会话,则不需要创建新的Session实例,只需使用'getActiveSession()'方法或'openActiveSession()'。关于这个也请参阅[我的其他答案(http://stackoverflow.com/questions/16140771/login-with-facebook-android-sdk-3-0-using-shared-preferences-session/16143102#16143102) – 5agado 2013-05-11 17:03:19

+0

谢谢你的回复,我的情况有点奇怪。我有一个Facebook对象(Facebook的脸书=新Facebook())。但有了这个对象,我不能调用facebook.getActiveSession()或facebook.openActiveSession()。你能告诉我为什么吗?我的意图是以某种方式创建一个访问令牌,并用params(捆绑)发送它来上传照片。 – TharakaNirmana 2013-05-11 17:13:59

1

GET/oauth/access_token? CLIENT_ID = {APP-ID} & client_secret = {应用秘密} & grant_type = client_credentials

8

我用的是最新的Android的Facebook SDK(4.0.1)有同样的问题。

我用AccessToken.getCurrentAccessToken()和它的工作:

GraphRequest request = GraphRequest.newMeRequest(
      AccessToken.getCurrentAccessToken(), 
      new GraphRequest.GraphJSONObjectCallback() { 
       @Override 
       public void onCompleted(JSONObject jsonObject, GraphResponse response) { 
        Log.d(LOG_TAG,"onCompleted jsonObject: "+jsonObject); 
        Log.d(LOG_TAG,"onCompleted response: "+response); 
        // Application code 
       } 
      }); 
    Bundle parameters = new Bundle(); 
    parameters.putString("fields", "id,name,link,cover,email"); 
    request.setParameters(parameters); 
    request.executeAsync(); 
+0

你可以发布你的活动包含上面的代码的整个代码。我对将代码放在哪里感到困惑,试图将其放在onCreate中,但没有任何帮助。 – 2015-04-23 10:56:18

+0

我也使用sdk 4.0.1和android studio 1.1.0。 – 2015-04-23 10:56:47

+0

工作正常!非常感谢你sdk 4.5 – 2015-08-22 15:47:46

相关问题