2013-02-21 15 views
13

Wykonałem projekt logowania za pomocą najnowszego SDK Facebooka, tj. 3.0. Mam trudności z uzyskaniem tokenu dostępu użytkownika. Szukałem w Internecie i wszystkie, maksymalne wyniki były przy użyciu starego SDK. Oto niektóre fragmenty kodu, które wziąłem z Facebook Android SDK Tutorial:Android: Facebook dostanie "Token dostępu użytkownika" po pomyślnym zalogowaniu

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

} 

} 

Logowanie powiodło się i widzę Nazwa użytkownika w aplikacji, jak sugeruje samouczka Facbeook.

Próbowałem starych metod, ale te wszystkie są teraz przestarzałe. Proszę, poprowadź mnie w uzyskaniu tokena dostępu dla użytkownika. Pomoc zostanie doceniona.

Dzięki.

Odpowiedz

38

W metodzie onResume() dodać następujący kod (w tym przypadku użyłem Toast.makeText zobaczyć tokenu dostęp po zalogowaniu):

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

użyłem getActivity ponieważ jest we fragmencie w moim sprawa, jeśli masz przycisk logowania w działaniu używać „to” zamiast „getActivity()”

+0

Gdy patrzysz na sesję, wydaje się, że token został usunięty, ponieważ wyświetla 'token: {ACCESS_TOKEN REMOVED}', ale 'session.getAccessToken()' poprawnie pobiera znak. –

-3

pomyślnie udało się zintegrować SDK Facebook w My My za pomocą następującego kodu:

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); 
    } 
} 

Mam nadzieję, że będzie trochę w tym pomóc.

+0

Po prostu trzeba uzyskać token dostępu, gdy logowanie jest kompletna. Czy możesz mi z tym pomóc. Myślę, że użyłeś starego SDK FB. Lub zaimplementowałeś używając nowego FB SDK, tj. FacebookSDK-3.0? – Anupam

+0

Użyłem facebook SDK 3.0. Oto link, w którym opisano metody uzyskiwania tokena dostępu. http://developers.facebook.com/docs/reference/android/3.0/AccessToken – Rohit

+1

Rohit, prawdopodobnie zobaczysz, że Twój kod nie dostanie tokena dostępu, gdy użytkownik 1) zainstaluje twoją aplikację i przyzna dostęp FB, a następnie 2) odinstalowuje twoją aplikację, a następnie 3) ponownie instaluje twoją aplikację. –

28

Uwaga: klasa sesji usuwa się w nowym Facebooku SDK

Po Facebook SDK version 4.X, wy shoul Zastosowanie d następujący:

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, w jaki sposób otrzymamy powiadomienie, gdy pierwsza aplikacja zaloguje się przy pomocy FB i wywołana zostanie funkcja onActivityResult? Dla mnie, onSuccess() z registerCallback (callbackManager, new FacebookCallback () {} nie jest wywoływany, mimo że wywołałem callBackmanager.onActivityResult() w onActivityResult() mojej aktywności.Każda wskazówka? – cgr

+1

Myślę, że token shold zostać zmieniony na token.getToken(), – Youness

+1

@ yououness masz rację Odpowiedź powyżej musi zostać zaktualizowana Wysłałem zaktualizowaną odpowiedź na to pytanie poniżej –

2

Aby uzyskać accessToken na facebook-sdk 4. * lub powyżej. Dodaj ten linie po facebookSDKInitialize()

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

potem wykorzystać te linie kodu,

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

Próbka:

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

Dzięki Man, zadziałało. – Pawan

0

Kod poniżej jest aktualizowana:

@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

Jestem nowy w systemie Android ..
Używam powyższego kodu do pobierania tokena.

Na Facebooku SDK 4.21.0
kompilacji „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()); 
Powiązane problemy