2011-08-02 9 views
6

Hola estoy usando la biblioteca escriba para la comunicación de OAuth con LinkedIn.Uso de OAuth con Scribe en Android

que tienen una clase de usuario y una clase de consulta.

La clase inicio de sesión crea un servicio para que mi solicitud de token y secreto y crea mi token de acceso. El token de acceso se guarda luego en el archivo de preferencias. Esto parece funcionar bien y puedo hacer una llamada api exitosa después de que se hayan creado todos los tokens.

En mi clase de consulta OAuth recupero el token de acceso, creo otro servicio y trato de hacer una llamada API, pero siempre que cargo una actividad que hace que las llamadas entren en esta clase, hace que la aplicación se cuelgue. Lo he probado para asegurarme de que el token de acceso está guardado y lo están.

Aquí es mi clase de login

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


} 

} 

y mi clase de consulta

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

} 

Gracias por cualquier ayuda Jeff

+0

Hola @jeff creo que puedes pegar la salida de logcat aquí? –

+0

Gracias por compartir tu código, esto realmente me ayudó aquí. – koljaTM

+0

Tengo una pregunta ... Hice casi lo mismo - almacené access_token y access_secret a las preferencias compartidas ... Pero cuando intento hacer una nueva llamada, la aplicación se cuelga ... ¿Alguna idea? –

Respuesta

1

me resolvió el problema era algo estúpido en el final. Había editado mi código para guardar el secreto de acceso y el token de acceso, pero había olvidado volver a iniciar sesión cuando probaba mi aplicación en mi teléfono. Esto dio como resultado que no se llegara al código que guardaba las partes del token. La API de LinkedIn no especifica cómo se debe agregar. Alguien tiene alguna experiencia con esto?

+0

Supongo que debe cambiar 'Verb.GET' por' Verb.POST' o 'Verb.PUT' –