2011-08-02 10 views
6

Merhaba LInkedIn ile OAuth iletişimi için scribe kütüphanesini kullanıyorum.OAuth with Scribe'ı Android'de Kullanma

Oturum açma sınıfım ve bir sorgu sınıfım var.

Oturum açma sınıfı, istek belirteci ve sırrımı almak için bir hizmet oluşturur ve erişim belirtecimi oluşturur. Erişim belirteci daha sonra tercihler dosyasına kaydedilir. Bu iyi çalışıyor gibi görünüyor ve tüm belirteçleri oluşturulduktan sonra başarılı bir API çağrısı yapabilirim.

OAuth sorgu sınıfımda erişim belirtecini al, başka bir hizmet oluştur ve bir API çağrısı yapmayı denedim, ancak bu sınıfta arama yapan bir etkinliği yüklediğimde, uygulamasının çökmesine neden oluyor. Erişim belirtecinin kaydedildiğinden ve yapıldığından emin olmak için test ettim.

İşte benim giriş sınıfı

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


} 

} 

ve benim sorgu sınıfı Jeff

+0

Hey @jeff logcat çıktısını buraya yapıştırabileceğinizi düşünüyor musunuz? –

+0

Kodunuzu paylaştığınız için teşekkürler, bu gerçekten burada bana yardımcı oldu. – koljaTM

+0

Bir sorum var ... Paylaşılan tercihler için neredeyse aynı - saklanan access_token ve access_secret yaptım ... Ama yeni bir arama yapmaya çalıştığımda, uygulama çöküyor ... Herhangi bir fikir? –

cevap

1

Ben sonunda aptal bir şeydi sorunu çözüldü herhangi bir yardım için

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

} 

teşekkürler olduğunu. Erişim sırrını ve erişim belirtecini kaydetmek için kodumu düzenledim, ancak uygulamamı telefonumda test ederken yeniden giriş yapmayı unutmuştum. Bu, kodun parçalarını kaydeden kodun ulaşılmamasıyla sonuçlandı.

Hala bu çağrıya XML dizesi eklemek için doğru yol olup olmadığından emin değilim 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); 
      } 
     }); 

aramak davet kullanarak bir sorun var. LinkedIn API'sı nasıl ekleneceğini belirtmiyor. Bununla ilgili herhangi bir deneyimi var mı?

+0

Benim tahminim, Verb.GET'in 'Verb.POST' veya' Verb.PUT' için değişmesi gerektiğidir. –

İlgili konular