3 Mar 2014

Linkedin Integration in android | Android Linkedin Api | Post on Linkedin from Android Application.

Hello Friends,

Android allows your application to connect to Linkedin and share data or any kind of updates on Linkedin.
Today i am going to post important sharing Text and Image from android application to LinkedIn.

Step 1 : Create Application- :

Go to developer site https://www.linkedin.com/secure/developer and create an APP.

Step 2 : Getting API key(Consumer Key)  and Secret key- :



Step 3: Create project :


In_dialog.xml :


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="280dip"
    android:layout_height="420dip"
    android:orientation="vertical" >

    <WebView
        android:id="@+id/webkitWebView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />

</RelativeLayout>

main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/darker_gray"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/header"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/blue_gradient_header" >

        <Button
            android:id="@+id/logo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="false"
            android:layout_centerVertical="true"
            android:layout_gravity="center"
            android:layout_marginLeft="8dp"
            android:background="@drawable/logo"
            android:padding="4dp"
            android:text="" />

        <TextView
            android:id="@+id/txtTitle"
            android:layout_width="wrap_content"
            android:layout_height="32dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="Linkedin"
            android:textColor="@android:color/white"
            android:textSize="22sp"
            android:textStyle="bold"
            android:typeface="sans" >
        </TextView>
    </RelativeLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="10dp" >

            <TextView
                android:id="@+id/name"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:padding="15dp"
                android:text="Name"
                android:textColor="@android:color/white"
                android:textSize="16sp"
                android:textStyle="bold"
                android:visibility="invisible" />

            <ImageView
                android:id="@+id/photo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/photo"
                android:visibility="invisible" />
        </LinearLayout>

        <Button
            android:id="@+id/login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:background="@drawable/btn_active_pressed"
            android:padding="8dp"
            android:text="Login"
            android:textColor="@android:color/white"
            android:textStyle="bold" />

        <Button
            android:id="@+id/share"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dp"
            android:background="@drawable/linkedin_share"
            android:visibility="invisible" />
    </LinearLayout>

</LinearLayout>


Config.java:


public class Config 
{
 public static String LINKEDIN_CONSUMER_KEY = "Your API key";
 public static String LINKEDIN_CONSUMER_SECRET = "Your Secret key";
 
 public static String OAUTH_CALLBACK_SCHEME = "x-oauthflow-linkedin";
 public static String OAUTH_CALLBACK_HOST = "callback";
 public static String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST;
 
 //Set Scope Params which you checked while create App in LinkedIn Account
 public static String scopeParams="rw_nus+r_basicprofile";

 
}

LinkedinDialog.java:


import java.util.ArrayList;
import java.util.List;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Picture;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Window;
import android.webkit.WebView;
import android.webkit.WebView.PictureListener;
import android.webkit.WebViewClient;
import com.hb.linkedin.R;
import com.google.code.linkedinapi.client.LinkedInApiClientFactory;
import com.google.code.linkedinapi.client.oauth.LinkedInOAuthService;
import com.google.code.linkedinapi.client.oauth.LinkedInOAuthServiceFactory;
import com.google.code.linkedinapi.client.oauth.LinkedInRequestToken;

/**
 * @author hasmukh Bhadani
 */

@SuppressWarnings("deprecation")
public class LinkedinDialog extends Dialog 
{
 private ProgressDialog progressDialog = null;

 public static LinkedInApiClientFactory factory;
 public static LinkedInOAuthService oAuthService;
 public static LinkedInRequestToken liToken;

 /**
  * Construct a new LinkedIn dialog
  * 
  * @param context
  *            activity {@link Context}
  * @param progressDialog
  *            {@link ProgressDialog}
  */
 public LinkedinDialog(Context context, ProgressDialog progressDialog) 
 {
  super(context);
  this.progressDialog = progressDialog;
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) 
 {
  requestWindowFeature(Window.FEATURE_NO_TITLE);// must call before super.
  super.onCreate(savedInstanceState);
  setContentView(R.layout.ln_dialog);

  setWebView();
 }

 /**
  * set webview.
  */
 @SuppressWarnings("deprecation")
 private void setWebView() 
 {
  LinkedinDialog.oAuthService = LinkedInOAuthServiceFactory.getInstance()
    .createLinkedInOAuthService(Config.LINKEDIN_CONSUMER_KEY,Config.LINKEDIN_CONSUMER_SECRET);
  LinkedinDialog.factory = LinkedInApiClientFactory.newInstance(
    Config.LINKEDIN_CONSUMER_KEY, Config.LINKEDIN_CONSUMER_SECRET);

  LinkedinDialog.liToken = LinkedinDialog.oAuthService
    .getOAuthRequestToken(Config.OAUTH_CALLBACK_URL);

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

  Log.i("LinkedinSample", LinkedinDialog.liToken.getAuthorizationUrl());
  mWebView.loadUrl(LinkedinDialog.liToken.getAuthorizationUrl());
  mWebView.setWebViewClient(new HelloWebViewClient());

  mWebView.setPictureListener(new PictureListener() 
  {
   @Override
   public void onNewPicture(WebView view, Picture picture) 
   {
    if (progressDialog != null && progressDialog.isShowing()) 
    {
     progressDialog.dismiss();
    }

   }
  });

 } 
 class HelloWebViewClient extends WebViewClient 
 {
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) 
  {
   if (url.contains(Config.OAUTH_CALLBACK_URL)) 
   {
    Uri uri = Uri.parse(url);
    String verifier = uri.getQueryParameter("oauth_verifier");

    cancel();

    for (OnVerifyListener d : listeners) 
    {
     // call listener method
     d.onVerify(verifier);
    }
   } 
   else if (url.contains("https://www.google.co.in/")) 
   {
    cancel();
   } 
   else 
   {
    Log.i("LinkedinSample", "url: " + url);
    view.loadUrl(url);
   }

   return true;
  }
 }

 /**
  * List of listener.
  */
 private List<OnVerifyListener> listeners = new ArrayList<OnVerifyListener>();

 /**
  * Register a callback to be invoked when authentication have finished.
  * 
  * @param data
  *            The callback that will run
  */
 public void setVerifierListener(OnVerifyListener data)
 {
  listeners.add(data);
 }

 /**
  * Listener for oauth_verifier.
  */
 interface OnVerifyListener 
 {
  /**
   * invoked when authentication have finished.
   * 
   * @param verifier
   *            oauth_verifier code.
   */
  public void onVerify(String verifier);
 }
}

LinkedInSampleActivity.java :

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.hb.linkedin.R;
import com.google.code.linkedinapi.client.LinkedInApiClient;
import com.google.code.linkedinapi.client.LinkedInApiClientFactory;
import com.google.code.linkedinapi.client.oauth.LinkedInAccessToken;
import com.google.code.linkedinapi.client.oauth.LinkedInOAuthService;
import com.google.code.linkedinapi.client.oauth.LinkedInOAuthServiceFactory;
import com.google.code.linkedinapi.client.oauth.LinkedInRequestToken;
import com.google.code.linkedinapi.schema.Person;
import com.hb.linkedin.LinkedinDialog.OnVerifyListener;

/**
 * @author Hasmukh Bhadani
 */
public class LinkedInSampleActivity extends Activity 
{
 Button login;
 Button share; 
 TextView name;
 ImageView photo;

 LinkedInRequestToken liToken;
 LinkedInApiClient client;
 LinkedInAccessToken accessToken = null;


 public static final String OAUTH_CALLBACK_HOST = "litestcalback";

 final LinkedInOAuthService oAuthService = LinkedInOAuthServiceFactory
   .getInstance().createLinkedInOAuthService(Config.LINKEDIN_CONSUMER_KEY,
     Config.LINKEDIN_CONSUMER_SECRET, Config.scopeParams);
 final LinkedInApiClientFactory factory = LinkedInApiClientFactory.newInstance(
   Config.LINKEDIN_CONSUMER_KEY,Config.LINKEDIN_CONSUMER_SECRET);


 @TargetApi(Build.VERSION_CODES.GINGERBREAD)
 @SuppressLint("NewApi")
 @Override
 public void onCreate(Bundle savedInstanceState) 
 { 
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  if( Build.VERSION.SDK_INT >= 9)
  {
   StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
   StrictMode.setThreadPolicy(policy); 
  }
  share = (Button) findViewById(R.id.share);
  name = (TextView) findViewById(R.id.name);  
  login = (Button) findViewById(R.id.login);
  photo = (ImageView) findViewById(R.id.photo);

  login.setOnClickListener(new OnClickListener() 
  {
   @Override
   public void onClick(View v) 
   {
    linkedInLogin();
   }
  });

  // share on linkedin
  share.setOnClickListener(new OnClickListener() 
  {
   @Override
   public void onClick(View v) 
   {    
    OAuthConsumer consumer = new CommonsHttpOAuthConsumer(Config.LINKEDIN_CONSUMER_KEY, Config.LINKEDIN_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);
    }
    catch (OAuthMessageSignerException e) 
    {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } 
    catch (OAuthExpectationFailedException e) 
    {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } 
    catch (OAuthCommunicationException e) 
    {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } 
    // here need the consumer for sign in for post the share
    post.setHeader("content-type", "text/XML");

   String myEntity="<share>"
   +"<comment>Check out the LinkedIn Share API!</comment>"
   +"<content>"
   +"<title>LinkedIn Developers Documentation On Using the Share API</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>";

    try 
    {
     post.setEntity(new StringEntity(myEntity));
     org.apache.http.HttpResponse response = httpclient.execute(post);

     Toast.makeText(LinkedInSampleActivity.this,"Shared sucessfully", Toast.LENGTH_SHORT).show();
    } 
    catch (UnsupportedEncodingException e) 
    {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } 
    catch (ClientProtocolException e) 
    {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } 
    catch (IOException e) 
    {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }    
  });
 }

 private void linkedInLogin() 
 {
  ProgressDialog progressDialog = new ProgressDialog(LinkedInSampleActivity.this);

  LinkedinDialog d = new LinkedinDialog(LinkedInSampleActivity.this,progressDialog);
  d.show();

  // set call back listener to get oauth_verifier value
  d.setVerifierListener(new OnVerifyListener() 
  {
   @Override
   public void onVerify(String verifier)
   {
    try {
    Log.i("LinkedinSample", "verifier: " + verifier);

 accessToken = LinkedinDialog.oAuthService.getOAuthAccessToken(LinkedinDialog.liToken,verifier);
 LinkedinDialog.factory.createLinkedInApiClient(accessToken);
 client = factory.createLinkedInApiClient(accessToken);

 Log.i("LinkedinSample","ln_access_token: " + accessToken.getToken());
 Log.i("LinkedinSample","ln_access_token: " + accessToken.getTokenSecret());

 Person p = client.getProfileForCurrentUser();
 name.setText("Welcome " + p.getFirstName() + " "+ p.getLastName());


     name.setVisibility(0);
     login.setVisibility(4);
     share.setVisibility(0);     

    } 
    catch (Exception e) 
    {
     Log.i("LinkedinSample", "error to get verifier");
     e.printStackTrace();
    }
   }
  });

  // set progress dialog
  progressDialog.setMessage("Loading...");
  progressDialog.setCancelable(true);
  progressDialog.show();
 }
}


LinkedIn Dialog Screen:




See, here is the Post in LinkedIn Account.

Out Put:




Note- Don't forget to add Permission Manifest File-
<uses-permission android:name="android.permission.INTERNET" />

Download Full source code from here LinkedInSharing

More reference for LinkedIn API:
LinkedIn Api Document:

I will be happy if you will provide your feedback or follow this blog. Any suggestion and help will be appreciated.
Thank you :)

4 comments:

  1. E/AndroidRuntime(3244): FATAL EXCEPTION: main
    i get this error y only thing i did was to add ckey and cskey

    ReplyDelete
  2. Hello,

    what is your scopeParams ? it should same as which you checked while created application.

    ReplyDelete
  3. Here i am getting error of verifying the code....
    At accessToken = LinkedinDialog.oAuthService.getOAuthAccessToken(LinkedinDialog.liToken,verifier);

    After the @Override
    public void onVerify(String verifier)
    {
    try {
    Log.i("LinkedinSample", "verifier: " + verifier);

    Line....Please help me here...Thanks....

    ReplyDelete