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
Hola @jeff creo que puedes pegar la salida de logcat aquí? –
Gracias por compartir tu código, esto realmente me ayudó aquí. – koljaTM
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? –