2011-06-23 23 views
5

Primero de todos. ¿Es posible agregar linkedin con la aplicación de Android como Facebook, Twitter? He leído muchos blogs pero no puedo implementar linkedin en mi aplicación. Llegué al proceso de autorización del usuario para la aplicación donde el usuario ingresa su nombre de usuario y contraseña. pero cuando ingresa un número de 5 dígitos, aparece en la pantalla y la pantalla dice que llegó a la pantalla de inicio de la aplicación. Luego llénelo y presione enter.token de acceso de linkedin para la aplicación de Android

Pero la pregunta es ¿cómo puedo pasar del navegador a mi aplicación y dónde debe poner esta información numérica? Y cuando & ¿cómo puedo obtener token de acceso para utilizar los datos del perfil de usuario.

No hay buenos asuntos en internet para usar para linkedin con android. Tengo uno de la biblioteca http://code.google.com/p/linkedin-j/, pero ¿cómo superar la situación? Ni idea. ¿Alguien puede sugerirme alguna solución? Gracias.

Respuesta

0

Ok, he tenido el mismo problema hace un par de horas y así es como lo resolví:

public class WebFragment extends Fragment { 

    class MyJavaScriptInterface 
    { 
     public void processHTML(String html) 
     { 
      Log.e("HTML" , html); 
      ((MainActivity)getActivity()).LinkedInCallback(html); 
     } 
    } 

    private WebView mWebView; 
    private String mUrl = "http://www.google.com"; 
    boolean doneRedirect = false; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 


     LayoutInflater mInflater = (LayoutInflater) getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     RelativeLayout view = (RelativeLayout) mInflater.inflate(R.layout.webview,null); 

     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(1200, 700); 
     lp.addRule(RelativeLayout.CENTER_IN_PARENT); 

     view.setLayoutParams(lp); 

     mWebView = (WebView) view.findViewById(R.id.wv1); 
     mWebView.getSettings().setJavaScriptEnabled(true); 

     mWebView.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT"); 

     mWebView.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       Log.e("Should Override url" , url); 
       view.loadUrl(url); 
       return false; 
      } 


       @Override 
       public void onPageFinished(WebView view, String url) 
       { 
        if(url.contains("submit")) 
         view.loadUrl("javascript:window.HTMLOUT.processHTML(document.getElementsByClassName('access-code')[0].innerHTML);"); 
       } 

     }); 
     mWebView.loadUrl(mUrl); 
     return view; 
    } 

    public void loadUrl(String url) { 
     mWebView.loadUrl(url); 
     Log.e("loadUrl", url); 
    } 

    public void setUrl(String url) { 
     mUrl = url 
     Log.e("setUrl", url); 
    } 

    public String getUrl() { 
     return mUrl; 
    } 
} 

y de mi lado Actividad tengo estos métodos:

private void login() { 

     new Thread(new Runnable() { 

      public void run() { 
       oAuthService = LinkedInOAuthServiceFactory.getInstance().createLinkedInOAuthService(CONSUMER_KEY, CONSUMER_SECRET); 
       factory = LinkedInApiClientFactory.newInstance(CONSUMER_KEY, CONSUMER_SECRET); 

       liToken = oAuthService.getOAuthRequestToken(); 

       loginFragment(liToken.getAuthorizationUrl()); 
      } 
     }).start(); 
    } 

    private void loginFragment(String url) { 


     mWebViewFragment.setUrl(url); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.add(R.id.main_layout ,mWebViewFragment ,"webview"); 
     fragmentTransaction.addToBackStack("webview"); 
     fragmentTransaction.commit(); 

    } 


    public void LinkedInCallback (final String VerifierCode) 
    { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.remove(mWebViewFragment); 
     fragmentTransaction.commit(); 

     new Thread(new Runnable() { 

      public void run() { 

        String verifier = VerifierCode; 
        LinkedInAccessToken accessToken = oAuthService.getOAuthAccessToken(liToken, verifier); 

      } 
     }).start(); 

    } 

sólo para aclarar :

Creo un fragmento con una vista web y cuando los usuarios ingresan sus credenciales, detecto la url de redirección que contiene "enviar" y hago una inyección de JavaScript para obtener el elemento que tiene el verificador oauth. Luego descarto el fragmento y vuelvo a mi actividad y consumo ese verificador oauth para hacer lo que necesito usando el cliente.

2

Puede lograrlo utilizando un tercero jar scribe.jar. Intento de webview para la autorización de la siguiente manera.

OAuthService service = new ServiceBuilder() 
     .provider(LinkedInApi.class).apiKey(Constants.CONSUMER_KEY) 
     .apiSecret(Constants.CONSUMER_SECRET) 
     .callback(Constants.OAUTH_CALLBACK_URL).build(); 
Token liToken = oAuthService 
       .getRequestToken(); 

     String url = oAuthService 
       .getAuthorizationUrl(PrepareRequestLinkedinTokenActivity.liToken); 
     Log.i(TAG, "Popping a browser with the authorize URL : " + url); 
     // Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(liToken 
     // .getAuthorizationUrl())); 
     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 

     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 
     context.startActivity(intent); 

En la autorización, se le redirige a su actividad. Recupere el token de acceso en su actividad de la siguiente manera.

@Override 
public void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    SharedPreferences prefs = PreferenceManager 
      .getDefaultSharedPreferences(this); 
    final Uri uri = intent.getData(); 
    if (uri != null 
      && uri.getScheme().equals(Constants.OAUTH_CALLBACK_SCHEME)) { 
     Log.i(TAG, "Callback received : " + uri); 
     Log.i(TAG, "Retrieving Access Token"); 
     new RetrieveAccessTokenTask(this, prefs).execute(uri); 
     finish(); 
    } 
} 

public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> { 

    private SharedPreferences prefs; 

    public RetrieveAccessTokenTask(Context context, SharedPreferences prefs) { 

     this.prefs = prefs; 
    } 

    /** 
    * Retrieve the oauth_verifier, and store the oauth and 
    * oauth_token_secret for future API calls. 
    */ 
    @Override 
    protected Void doInBackground(Uri... params) { 
     final Uri uri = params[0]; 
     final Verifier verifier = new Verifier(
       uri.getQueryParameter("oauth_verifier")); 

     try { 
      accessToken = service.getAccessToken(liToken, verifier); 

      final Editor edit = prefs.edit(); 
      edit.putString(Constants.LINKEDIN_TOKEN, accessToken.getToken()); 
      edit.putString(Constants.LINKEDIN_TOKEN_SECRET, 
        accessToken.getSecret()); 
      edit.commit(); 

      Log.i(TAG, "OAuth - Access Token Retrieved"); 

     } catch (Exception e) { 
      Log.e(TAG, "OAuth - Access Token Retrieval Error", e); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

     super.onPostExecute(result); 
     executeAfterAccessTokenRetrieval(accessToken); 
    } 

Con el token de acceso puede realizar actualizaciones de red a linkedin de la siguiente manera.

private void postToLinkedin(String comment) { 

    SharedPreferences prefs = PreferenceManager 
      .getDefaultSharedPreferences(LinkedinDialogActivity.this); 
    String token = prefs.getString(Constants.LINKEDIN_TOKEN, ""); 
    String secret = prefs.getString(Constants.LINKEDIN_TOKEN_SECRET, ""); 

    Token accessToken = new Token(token, secret); 

    OAuthService service = new ServiceBuilder().provider(LinkedInApi.class) 
      .apiKey(Constants.CONSUMER_KEY) 
      .apiSecret(Constants.CONSUMER_SECRET) 
      .callback(Constants.OAUTH_CALLBACK_URL).build(); 

    String url = "http://api.linkedin.com/v1/people/~/shares"; 
    OAuthRequest request = new OAuthRequest(Verb.POST, url); 
    String payLoad = "<?xml version='1.0' encoding='UTF-8'?><share><comment>Check out the Sep 13 Second share!</comment><content><title>My new share with linked-in</title><description>Leverage the Share API to maximize engagement on user-generated content on LinkedIn</description><submitted-url>https://developer.linkedin.com/documents/share-api</submitted-url><submitted-image-url>http://m3.licdn.com/media/p/3/000/124/1a6/089a29a.png</submitted-image-url></content><visibility><code>anyone</code></visibility></share>"; 
    request.addHeader("Content-Length", Integer.toString(payLoad.length())); 
    request.addHeader("Content-Type", "text/xml"); 
    request.addPayload(payLoad); 
    service.signRequest(accessToken, request); 
    Response response = request.send(); 
    System.out.println("response >>>> " + response.getBody()); 

} 

La actividad debe declararse en el archivo de manifiesto de la siguiente manera.

<activity android:name=".PrepareRequestLinkedinTokenActivity" 
     android:launchMode="singleTask" android:theme="@android:style/Theme.Translucent.NoTitleBar"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 

      <data android:host="callback" android:scheme="x-oauthflow-linkedin" /> 
     </intent-filter> 
    </activity> 
+0

Hola Thasneem Estoy buscando la integración de linkedin con Android utilizando Scribe. ¿Podría enviarme una aplicación de muestra si tiene o me guía a través de un enlace relevante? –

+0

Consulte la siguiente dirección URL para obtener más información. https: // github.com/fernandezpablo85/scribe-java/blob/master/src/test/java/org/scribe/examples/LinkedInExample.java. Puede descargar una aplicación de muestra desde aquí. – Thasneem

0

Siguiendo código que he hecho con éxito 100% probado

public class ShareInLinkedIn extends Activity implements OnClickListener { 

private LinkedInOAuthService oAuthService; 
private LinkedInApiClientFactory factory; 
private LinkedInRequestToken liToken; 
private LinkedInApiClient client; 
public static final String LINKEDIN_PREF = "GamePrefs"; 

@SuppressLint({ "NewApi", "NewApi", "NewApi" }) 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.linkedin); 

    if (android.os.Build.VERSION.SDK_INT > 9) { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
    } 

    oAuthService = LinkedInOAuthServiceFactory.getInstance().createLinkedInOAuthService(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET, Constants.SCOPE_PARAMS); 
    System.out.println("oAuthService : " + oAuthService); 

    factory = LinkedInApiClientFactory.newInstance(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET); 

    liToken = oAuthService.getOAuthRequestToken(Constants.OAUTH_CALLBACK_URL); 
    System.out.println("onCreate:linktoURL : " + liToken.getAuthorizationUrl()); 
    Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(liToken.getAuthorizationUrl())); 
    startActivity(i); 

} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 

    try { 
     linkedInImport(intent); 
    } catch (NullPointerException e) { 
     e.printStackTrace(); 
    } 
} 

private void linkedInImport(Intent intent) { 
    String verifier = intent.getData().getQueryParameter("oauth_verifier"); 
    System.out.println("liToken " + liToken); 
    System.out.println("verifier " + verifier); 

    LinkedInAccessToken accessToken = oAuthService.getOAuthAccessToken(liToken, verifier); 
    //SharedPreferences settings = getSharedPreferences(LINKEDIN_PREF, MODE_PRIVATE); 
    // final Editor edit = settings.edit(); 
    // edit.putString(OAuth.OAUTH_TOKEN, accessToken.getToken()); 
    // edit.putString(OAuth.OAUTH_TOKEN_SECRET, 
    // accessToken.getTokenSecret()); 
    // edit.putString("linkedin_login", "valid"); 
    // edit.commit(); 

    client = factory.createLinkedInApiClient(accessToken); 

    // client.postNetworkUpdate("LinkedIn Android app test"); 

    Person profile = client.getProfileForCurrentUser(EnumSet.of(ProfileField.ID, ProfileField.FIRST_NAME, ProfileField.LAST_NAME, ProfileField.HEADLINE)); 

    System.out.println("First Name :: " + profile.getFirstName()); 
    System.out.println("Last Name :: " + profile.getLastName()); 
    System.out.println("Head Line :: " + profile.getHeadline()); 

    OAuthConsumer consumer = new CommonsHttpOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET); 
    consumer.setTokenWithSecret(accessToken.getToken(), accessToken.getTokenSecret()); 

    DefaultHttpClient httpclient = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("https://api.linkedin.com/v1/people/~/shares"); 
    try { 
     consumer.sign(post); 
     post.setHeader("content-type", "text/XML"); 
     String myEntity = "<share><comment>This is a test</comment><visibility><code>anyone</code></visibility></share>"; 
     post.setEntity(new StringEntity(myEntity)); 
     org.apache.http.HttpResponse response = httpclient.execute(post); 
     // Get the response 
     BufferedReader rd = new BufferedReader 
      (new InputStreamReader(response.getEntity().getContent())); 
     StringBuffer strBfr = new StringBuffer(); 
     String line = ""; 
     while ((line = rd.readLine()) != null) { 

      strBfr.append(line); 
     } 
     System.out.println("Response is : "+strBfr.toString()); 
     Toast.makeText(ShareInLinkedIn.this, strBfr.toString(), Toast.LENGTH_LONG).show(); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

@Override 
public void onClick(View v) { 
    // TODO Auto-generated method stub 

} 

}

Constants.java

public class Constants { 

public static final String CONSUMER_KEY = "YOUR_CONSUMER_KEY"; 
public static final String CONSUMER_SECRET = "YOUR_CONSUMER_SECRET_KEY"; 
public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-linkedin"; 
public static final String OAUTH_CALLBACK_HOST = "litestcalback"; 
public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST; 
public static final String SCOPE_PARAMS = "rw_nus+r_basicprofile"; 

}

archivo AndroidManifiest.xml

 <activity 
     android:name="com.linkedin.ShareInLinkedIn" 
     android:launchMode="singleInstance" > 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 

      <data 
       android:host="litestcalback" 
       android:scheme="x-oauthflow-linkedin" /> 
     </intent-filter> 
    </activity> 
+1

¿Qué es OAuthConsumer? –

Cuestiones relacionadas