2013-02-21 5 views
13

Я делаю какой-то проект для входа через Facebook с последними версиями SDK i.e. 3.0. Мне очень трудно получить токен доступа пользователей. Я искал в Интернете и все, максимальные результаты использовались в старой SDK. Вот некоторые фрагменты кода, которые я взял из Facebook Android SDK Tutorial:Android: Facebook получает «токен доступа пользователя», при успешном входе в систему

public class LoginActivity extends Activity implements OnClickListener { 

Button login; 
TextView accessToken; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

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

    login.setOnClickListener(this); 

} 

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

} 

} 

Войти был успешным, и я могу видеть имя пользователя в приложении, как это было предложено учебник Facbeook.

Я пробовал старые методы, но все они теперь устарели. Пожалуйста, помогите мне в получении токена доступа пользователя. Помощь будет оценена.

Спасибо.

ответ

38

В методе onResume() добавьте следующий код (в данном случае я использовал Toast.makeText видеть маркер доступа после входа в систему):

Session session = Session.getActiveSession(); 
    if (session.isOpened()) { 
     Toast.makeText(getActivity(), session.getAccessToken(), Toast.LENGTH_LONG).show(); 
    } 

Я использовал getActivity, потому что он находится в фрагменте в моей случай, если у вас есть кнопка входа в деятельности использовать «это» вместо «getActivity()»

+0

Когда вы смотрите на сеанс, кажется, что токен был удален, так как он отображает «токен: {ACCESS_TOKEN REMOVED]», но 'session.getAccessToken()' правильно извлекает маркер. –

-3

Я успешно удалось интегрировать SDK Facebook в мой мой с помощью следующего кода:

public class MainActivity extends Activity implements OnClickListener { 
    Facebook fb; 
    Button button; 
    SharedPreferences sp; 
    //TextView welcome; 

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

     String APP_ID = getString(R.string.APP_ID); 
     fb=new Facebook(APP_ID); 

     sp=getPreferences(MODE_PRIVATE); 
     String access_token=sp.getString("access token",null); 
     long expires=sp.getLong("access expires",0); 

     if(access_token!=null){ 
      fb.setAccessToken(access_token); 
     } 
     if(expires!=0){ 
      fb.setAccessExpires(expires); 
     } 



     button=(Button)findViewById(R.id.login); 
     //pic=(ImageView)findViewById(R.id.picture_pic); 
     button.setOnClickListener(this); 
     updateButtonImage(); 
    } 

    private void updateButtonImage() { 
     // TODO Auto-generated method stub 
     if(fb.isSessionValid()){ 
      try{ 
       //post.setVisibility(Button.VISIBLE); 
       button.setBackgroundResource(R.drawable.logout_button); 
       /*pic.setVisibility(ImageView.VISIBLE); 

       JSONObject obj=null; 
       URL img_url = null; 
       String jsonuser=fb.request("me"); 
       obj=Util.parseJson(jsonuser); 

       String id = obj.optString("id"); 
       String name = obj.optString("name"); 
       welcome.setText("Welcome "+name); 
       img_url=new URL("http://graph.facebook.com/"+id+"/picture?type=large"); 
       Bitmap bmp = BitmapFactory.decodeStream(img_url.openConnection().getInputStream()); 
       pic.setImageBitmap(bmp);*/ 
       buttonClicks(); 
       }catch(Exception e){ 
        e.printStackTrace(); 
       } 

     }else{ 
      //post.setVisibility(Button.INVISIBLE); 
      button.setBackgroundResource(R.drawable.login_button); 
      //pic.setVisibility(ImageView.INVISIBLE); 
     } 
    } 

    public void buttonClicks() 
    { 
      Bundle params = new Bundle(); 
      params.putString("image", "your string"); 


      fb.dialog(MainActivity.this, "feed", params, new DialogListener(){ 

       @Override 
       public void onComplete(Bundle values) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onFacebookError(FacebookError e) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onError(DialogError e) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onCancel() { 
        // TODO Auto-generated method stub 

       } 

      }); 
    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     if(fb.isSessionValid()){ 
      //button close our session - log out facebook 
      try { 
       fb.logout(getApplicationContext()); 
       updateButtonImage(); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     }else{ 
      //login to fb 
      fb.authorize(MainActivity.this, new String[] {"email"}, new DialogListener(){ 

       @Override 
       public void onComplete(Bundle values) { 
        // TODO Auto-generated method stub 
        Editor editor=sp.edit(); 
        editor.putString("access_token", fb.getAccessToken()); 
        editor.putLong("access expires", fb.getAccessExpires()); 
        editor.commit(); 
        updateButtonImage(); 
       } 

       @Override 
       public void onFacebookError(FacebookError e) { 
        // TODO Auto-generated method stub 
        Toast.makeText(MainActivity.this, "onFacebookError", Toast.LENGTH_SHORT).show(); 
       } 

       @Override 
       public void onError(DialogError e) { 
        // TODO Auto-generated method stub 
        Toast.makeText(MainActivity.this, "onError", Toast.LENGTH_SHORT).show(); 
       } 

       @Override 
       public void onCancel() { 
        // TODO Auto-generated method stub 
        Toast.makeText(MainActivity.this, "onCancel", Toast.LENGTH_SHORT).show(); 
       } 

      }); 
     } 
    } 


    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // TODO Auto-generated method stub 
     super.onActivityResult(requestCode, resultCode, data); 
     fb.authorizeCallback(requestCode, resultCode, data); 
    } 
} 

Я надеюсь, вы получите некоторую помощь с этим.

+0

Мне просто нужно, чтобы получить маркер доступа, когда Логин завершена. Можете ли вы помочь мне в этом. Я думаю, вы использовали старый FB SDK. Или вы реализовали с использованием нового FB SDK, то есть FacebookSDK-3.0? – Anupam

+0

я использовал facebook SDK 3.0. Вот ссылка, в которой описаны методы, как получить токен доступа. http://developers.facebook.com/docs/reference/android/3.0/AccessToken – Rohit

+1

Rohit, вы, вероятно, увидите, что ваш код не сможет получить токен доступа, когда пользователь 1) устанавливает ваше приложение и предоставляет доступ к FB, затем 2) удаляет ваше приложение, а затем 3) переустанавливает ваше приложение. –

28

Примечание: класс Session снимается в новом Facebook SDK

После Facebook SDK version 4.X, вы Shoul д использование следующего:

AccessToken token = AccessToken.getCurrentAccessToken(); 
if (token != null) { 
    Toast.makeText(getActivity(), token, Toast.LENGTH_LONG).show(); 
} 

Change log reference is here.

Migrate reference from Sdk 3.x to 4.x

+0

@astuter, как мы получаем уведомление, когда первое приложение, зарегистрированное в FB и onActivityResult, вызывается? Для меня, onSuccess() registerCallback (callbackManager, новый FacebookCallback () {} не вызывается, хотя я вызывал callBackmanager.onActivityResult() в onActivityResult() из моей активности. ANy clue? – cgr

+1

Я думаю, что этот токен будет изменен на token.getToken(), – Youness

+1

@ youness, вы правы. Ответ выше должен быть обновлен. Я опубликовал обновленный ответ на этот вопрос ниже. –

2

Чтобы получить маркер доступа для facebook-SDK 4. * или выше. Добавить эти строки после facebookSDKInitialize()

FacebookSdk.setIsDebugEnabled(true); 
FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKEN); 

После этого использовать эти строки кодов,

AccessToken token = AccessToken.getCurrentAccessToken(); 
Log.d("Access Token is",token); 

Пример:

GraphRequestAsyncTask graphRequestAsyncTask = new GraphRequest(
    login_result.getAccessToken(), 
    //AccessToken.getCurrentAccessToken(), 
    "/me/friends", 
    bundle, 
    HttpMethod.GET, 
    new GraphRequest.Callback() { 
    public void onCompleted(GraphResponse response) { 
    try { 
    JSONArray rawName = response.getJSONObject().getJSONArray("data"); 
    Log.d("rawName friendList",String.valueOf(rawName)); 
    AccessToken token = AccessToken.getCurrentAccessToken(); 
    Log.d("access token is: ",String.valueOf(token)); 
    } catch (JSONException e) { 
    e.printStackTrace(); 
    } 
    } 
    } 
).executeAsync(); 
+0

Спасибо, Man, это сработало. – Pawan

0

Код ниже обновляется:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 

    /** This block obtains Facebook UserID and Token */ 
    AccessToken token = AccessToken.getCurrentAccessToken(); 
    if (token != null) { 
     Toast.makeText(this, token.toString(), Toast.LENGTH_SHORT).show(); 
     Log.e(TAG, "Token: " + token.getToken()); 
     Log.e(TAG, "UserID: " + token.getUserId()); 
    } 
    /***/ 
} 
3

Я новичок в Android.
Я использую приведенный выше код для получения только токена.

Для Facebook SDK 4.21.0
компиляции «com.facebook.android:facebook-android-sdk:4.21.0'

FacebookSdk.setIsDebugEnabled(true);    
FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 

AccessToken token = AccessToken.getCurrentAccessToken(); 
Log.d("access only Token is", String.valueOf(token.getToken())); 
String facebook_id_token = String.valueOf(token.getToken()); 

 Смежные вопросы

  • Нет связанных вопросов^_^