2011-08-02 22 views
6

Witam Używam biblioteki skrybów do komunikacji OAuth z LInkedIn.Używanie OAuth z Scribe na Androidzie

Mam klasę logowania i klasę zapytań.

Klasa logowania tworzy usługę pobierania tokenu żądania i tajnego klucza i tworzy mój token dostępu. Token dostępu jest następnie zapisywany w pliku preferencji. To wydaje się działać dobrze i mogę wykonać udane wywołanie api po utworzeniu wszystkich tokenów.

W mojej klasie zapytań OAuth pobierze token dostępu, utworzę kolejną usługę i spróbuję wykonać wywołanie API, ale kiedy tylko załaduję działanie, które wywoła tę klasę, spowoduje awarię mojej aplikacji. Przetestowałem, aby upewnić się, że token dostępu jest zapisany i tak się dzieje.

Oto moja klasa logowanie

public class Login_LinkedIn extends Activity 
{ 
SharedPreferences settings; 
OAuthService service; 
Token requestToken; 

Button home; 

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

    initControls(); 

    service = new ServiceBuilder() 
    .provider(LinkedInApi.class) 
    .apiKey(getString(R.string.apiKey)) 
    .apiSecret(getString(R.string.secKey)) 
    .callback(getString(R.string.callBack)) 
    .build(); 

    requestToken = service.getRequestToken(); 
    final String authURL = service.getAuthorizationUrl(requestToken); 

    final WebView webview = (WebView) findViewById(R.id.webView); 

    //attach WebViewClient to intercept the callback url 
    webview.setWebViewClient(new WebViewClient() 
    { 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) 
     { 

      //check for our custom callback protocol 
      //otherwise use default behavior 
      if(url.startsWith(getString(R.string.callBack))) 
      { 
       //authorization complete hide webview for now. 
       webview.setVisibility(View.GONE); 
       Uri uri = Uri.parse(url); 
       String verifier = uri.getQueryParameter("oauth_verifier"); 
       Verifier v = new Verifier(verifier); 

       //save this token for practical use. 
       Token accessToken = service.getAccessToken(requestToken, v); 

       OAuthRequest request = new OAuthRequest(Verb.GET, "http://api.linkedin.com/v1/people/~:(first-name,last-name)"); 
       service.signRequest(accessToken, request); 
       Response response = request.send(); 

       xmlHandler xh = new xmlHandler(response.getBody()); 

       settings = getSharedPreferences("preferences", 0); 
       SharedPreferences.Editor editor = settings.edit(); 

       editor.putString("accessToken", accessToken.getToken()); 

       // The requestToken is saved for use later on to verify the OAuth request. 
       // See onResume() below 
       editor.putString("requestToken", requestToken.getToken()); 
       editor.putString("requestSecret", requestToken.getSecret()); 

       editor.putString("first-name", xh.getValue("first-name")); 
       editor.putString("last-name", xh.getValue("last-name")); 

       editor.commit(); 

       return true; 
      } 
      return super.shouldOverrideUrlLoading(view, url); 
     } 
    }); 

    //send user to authorization page 
    webview.loadUrl(authURL); 
} 

@Override 
protected void onResume() 
{ 
    super.onResume(); 

    Intent i = getIntent(); 

    if(i != null) 
    { 
     Uri uri = i.getData(); 
     if(uri != null) 
     { 
      String oauthVerifier = uri.getQueryParameter("oauth_verifier"); 

      Verifier verifier = new Verifier(oauthVerifier); 

      requestToken = new Token(settings.getString("requestToken", null), settings.getString("requestSecret", null)); 

      Token accessToken = service.getAccessToken(requestToken, verifier); 

      // Save the access token. 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.remove("requestToken"); 
      editor.remove("requestSecret"); 
      editor.putString("accessToken", accessToken.getToken()); 
      editor.putString("accessSecret", accessToken.getSecret()); 
      editor.commit(); 

      // Start the film list activity. 
      final Intent intent = new Intent(this,ProConnect.class); 
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
      startActivity(intent); 
     } 
    } 
} 

private void initControls() 
{ 
    home = (Button)findViewById(R.id.home); 

    final Intent intent = new Intent(this,ProConnect.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    home.setOnClickListener(new Button.OnClickListener() 
    { 
     public void onClick (View v) 
     { 
      startActivity(intent); 
     } 
    }); 


} 

} 

i moja klasa zapytania

public class oAuthQuery extends Activity 
{ 
OAuthService service; 
Token accessToken; 
SharedPreferences settings; 

public oAuthQuery() 
{ 
    service= new ServiceBuilder() 
    .provider(LinkedInApi.class) 
    .apiKey(getString(R.string.apiKey)) 
    .apiSecret(getString(R.string.secKey)) 
    .callback(getString(R.string.callBack)) 
    .build(); 

    settings = getSharedPreferences("preferences", 0); 

    accessToken = new Token(settings.getString("accessToken", null), settings.getString("accessSecret", null)); 

} 

public String query(String s) 
{ 
    OAuthRequest request = new OAuthRequest(Verb.GET, s); 
    service.signRequest(accessToken, request); 
    Response response = request.send(); 

    return response.getBody(); 
} 

public OAuthService getService() 
{ 
    return service; 
} 

} 

Dzięki za wszelką pomoc Jeff

+0

Hey @jeff myślisz, że możesz tutaj wkleić dane wyjściowe logcat? –

+0

Dzięki za udostępnienie kodu, to naprawdę pomogło mi tutaj. – koljaTM

+0

Mam pytanie ... Zrobiłem prawie to samo - zapisane access_token i access_secret do wspólnych preferencji ... Ale kiedy próbuję wykonać nowe połączenie, aplikacja się zawiesza ... Jakiś pomysł? –

Odpowiedz

1

I rozwiązać problem było coś głupiego w końcu. Zmodyfikowałem swój kod, aby zapisać klucz dostępu i token dostępu, ale zapomniałem ponownie zalogować się podczas testowania aplikacji na moim telefonie. Spowodowało to, że kod, który zapisał części tokena, nie został osiągnięty.

nadal mam problem przy użyciu zaprosić nazywamy w LinkedIn API

invite.setOnClickListener(new Button.OnClickListener() 
     { 
      public void onClick (View v) 
      { 
       inviteXml = inviteCreator.inviteString(to, subj, body, authName, authValue); 
       nameField.setText(inviteXml); 
       titleField.setText(""); 


       call = "http://api.linkedin.com/v1/people/~/mailbox"; 
       request = new OAuthRequest(Verb.GET, call); 
       request.addPayload(inviteXml); 
       service.signRequest(accessToken, request); 
       response = request.send(); 

       invite.setVisibility(View.GONE); 
      } 
     }); 

nie jestem pewien, czy jest to prawidłowy sposób dodać ciąg XML do rozmowy. Interfejs API LinkedIn nie określa, w jaki sposób ma zostać dodany. Czy ktoś ma z tym jakieś doświadczenie?

+0

Domyślam się, że musisz zmienić 'Verb.GET' dla' Verb.POST' lub 'Verb.PUT' –