¿Cuál es el código para obtener un token actualizado de Facebook en una aplicación para Android?

Estoy desarrollando una aplicación de Android. Con la depreciación inminente del permiso de offline_access de Facebook estoy intentando usar la API de Graph para extender el token de Facebook.

https://graph.facebook.com/oauth/access_token? client_id=APP_ID& client_secret=APP_SECRET& grant_type=fb_exchange_token& fb_exchange_token=EXISTING_ACCESS_TOKEN 

¿Puede alguien proporcionar código detallado que demuestre cómo implementar el código anterior en una aplicación para Android y obtener el token actualizado de Facebook?

Gracias por tu tiempo.

Actualización Dos:

Progreso (creo)!

El uso de la URL completa con el método de solicitud de facebook da como resultado que la URL base se agregue al principio de la URL. Así que en lugar de

 String refreshUrl = "https://graph.facebook.com/oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken; 

debería usar

 String refreshUrl = "oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken; 

Sin embargo, ahora estoy recibiendo la respuesta {"error": {"message": "Error validating application. Inválido ID de la aplicación.", "Type": "OAuthException", "code": 190}}

Actualizar uno:

Esto es lo que he probado. El código se completa, es decir, OnComplete en el listerner se llama, pero la respuesta no contiene un nuevo token de acceso o valor de caducidad.

  void refreshWithGraph() { AsyncFacebookRunner extendingAsyncRunner = new AsyncFacebookRunner(facebook); Bundle parameters = new Bundle(); //the variable currentAccessToken is obtained after authorisation is complete using currentAccessToken = facebook.getAccessToken(); String refreshUrl = "https://graph.facebook.com/oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken; extendingAsyncRunner.request(refreshUrl, parameters, new RefreshListener(), null ); } 

Aquí está mi versión de RefreshListener …

  //REFRESH LISTENER public class RefreshListener extends BaseRequestListener { public void onComplete(final String response, Object state) { try { final JSONObject json = Util.parseJson(response); runOnUiThread(new Runnable() { @Override public void run() { tvRefreshResponse.setText("IN REFRESH LISTENER ONCOMPLETE\nResponse is " + response); tvRefreshToken.setText("IN REFRESH LISTENER ONCOMPLETE\nToken is " + facebook.getAccessToken()); tvRefreshExpiry.setText("IN REFRESH LISTENER ONCOMPLETE\nFacebook expiry is " + millisecToDate(facebook.getAccessExpires())); } }); //end runOnUiThread } catch (JSONException e) { runOnUiThread(new Runnable() { @Override public void run() { tvRefreshResponse.setText("IN REFRESH LISTENER ONCOMPLETE CAUGHT JSON EXCEPTION \nResponse is " + response); } }); //end runOnUiThread } catch (FacebookError fe) { runOnUiThread(new Runnable() { @Override public void run() { tvRefreshResponse.setText("IN REFRESH LISTENER ONCOMPLETE CAUGHT FACEBOOK ERROR \nResponse is " + response); } }); //end runOnUiThread } //end catch Facebook error } //end onComplete @Override public void onIOException(IOException e, Object state) { tvRefreshResponse.setText("IN REFRESH LISTENER IOEXCEPTION \nException is "+ e.getLocalizedMessage()); } @Override public void onFileNotFoundException(FileNotFoundException e, Object state) { tvRefreshResponse.setText("IN REFRESH LISTENER FILE NOT FOUND EXCEPTION \nException is "+ e.getLocalizedMessage()); } @Override public void onMalformedURLException(MalformedURLException e, Object state) { tvRefreshResponse.setText("IN REFRESH MALFORMED URL \nException is "+ e.getLocalizedMessage()); } @Override public void onFacebookError(FacebookError e, Object state) { tvRefreshResponse.setText("IN REFRESH ONFACEBOOK ERROR \nException is "+ e.getLocalizedMessage()); } } //end RefreshListener 

El código se completa, es decir, OnComplete en el listerner se llama, pero la respuesta no contiene un nuevo token de acceso o valor de caducidad. La respuesta es …

  {"id":"https:\/\/graph.facebook.com\/oauth\/access_token","shares":78,"comments":1} 

Cuando pongo la misma URL (con un valor token alfanumérico actual) en un navegador web, la respuesta incluye un token de acceso.


Información relacionada

El permiso offline de Facebook será descontinuado el 1 de mayo de 2012

Por favor, no sugiera usar la función extendAccessTokenIfNeeded en onResume (). También estoy teniendo problemas con eso y es la razón por la que estoy buscando en el API de gráfico de actualización de token 🙂

Preguntas relacionadas con el desbordamiento de pila

¿Es posible extender los tokens de Facebook con extendAccessTokenIfNeeded en una aplicación para Android? (mi pregunta)

¿Cómo funciona offline_access después de la depreciación después del 1 de mayo?

No se puede ampliar el token de acceso a Facebook

Protección del secreto de la aplicación para el uso de extendAccessToken (Java / Android)

Enlaces relevantes de Facebook

Tutorial para Android de Facebook

Aprobación del permiso de Facebook offline_access

Para ser honesto, estoy un poco confundido – parece que tienes todo para hacerlo – y es simple. Pero déjame tratar de responder a tu pregunta. Aquí está el código de mi proyecto de C # donde extiendo el token de la aplicación con mis comentarios en caso de que no esté familiarizado con los idiomas y clases de C #:

 string currentToken = "token from somewhere"; // WebClient is used to send GET request to the given URL // and receive the response using (var req = new System.Net.WebClient()) { // create URL string and fill it in with data (app Id, secret, and current token) var extendTokenUrl = string.Format( "https://graph.facebook.com/oauth/access_token?client_id={0}&client_secret={1}&grant_type=fb_exchange_token&fb_exchange_token={2}", FB_APP_ID, FB_APP_SECRET, currentToken); // send GET request and download the response var response = req.DownloadString(extendTokenUrl); // if all is good, response will be a string which looks like this: // access_token=<<THE TOKEN GOES HERE>> var newToken = response.Substring("access_token=".Length); // now save newToken in your DB INSTEAD of currentToken - // so all calls will be made with extended token SaveTokenInDB(newToken); } 

Esperanza que ayuda, y traducir esto en Java debe ser directo.

  • Call finish () del método estático
  • Facebook y GoogleAnalytics está causando la señal fatal 11 (SIGSEGV)
  • ¿Cómo crear un hash de clave de Facebook?
  • Error al recuperar el correo electrónico y la ubicación de Facebook Request in Android
  • Android Studio Gradle error "Múltiples archivos dex definir ..."
  • No Class Def Found Error Android-Bolts Analizar
  • ¿Cómo puedo añadir facebook SDK al proyecto android?
  • LikeView Callback
  • Android: Facebook obtiene "Token de acceso de usuario", al acceder con éxito
  • FacebookSdk.sdkInitialize (Context) está obsoleto
  • Compartir texto en facebook con la intención de compartir de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.