Hello Friends,
I am going to share the steps of LinkedIn Integration in android.
Steps for LinkedIn Integration :
1. Go to developer site(https://www.linkedin.com/secure/developer) and create
an APP.
![]() |
2. Getting API key(Consumer Key) and Secret key:
3. Add following code in Your app and don't forgot to replace the key
from the config.java file.
1. LinkedInSampleActivity
package com.example.linkedin;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.EnumSet;
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.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.linkedin.R;
import com.google.code.linkedinapi.client.LinkedInApiClient;
import com.google.code.linkedinapi.client.LinkedInApiClientFactory;
import com.google.code.linkedinapi.client.enumeration.ProfileField;
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.mukesh.linkedin.LinkedinDialog.OnVerifyListener;
import com.squareup.picasso.Picasso;
/**
* @author Mukesh Kumar Yadav
*/
public class LinkedInSampleActivity extends Activity {
Button login;
Button share;
EditText et;
TextView name,profile;
ImageView photo;
public static final String OAUTH_CALLBACK_HOST = "litestcalback";
final LinkedInOAuthService oAuthService = LinkedInOAuthServiceFactory
.getInstance().createLinkedInOAuthService(
Config.LINKEDIN_CONSUMER_KEY,Config.LINKEDIN_CONSUMER_SECRET);
final LinkedInApiClientFactory factory = LinkedInApiClientFactory
.newInstance(Config.LINKEDIN_CONSUMER_KEY,
Config.LINKEDIN_CONSUMER_SECRET);
LinkedInRequestToken liToken;
LinkedInApiClient client;
LinkedInAccessToken accessToken = null;
@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);
profile = (TextView) findViewById(R.id.profile);
et = (EditText) findViewById(R.id.et_share);
login = (Button) findViewById(R.id.login);
photo = (ImageView) findViewById(R.id.photo);
login.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
linkedInLogin();
}
});
// share on linkedin
share.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String share = et.getText().toString();
if (null != share && !share.equalsIgnoreCase("")) {
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>"+ share +"</comment><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();
}
}else {
Toast.makeText(LinkedInSampleActivity.this,
"Please enter the text to share",
Toast.LENGTH_SHORT).show();
}
/*String share = et.getText().toString();
if (null != share && !share.equalsIgnoreCase("")) {
client = factory.createLinkedInApiClient(accessToken);
client.postNetworkUpdate(share);
et.setText("");
Toast.makeText(LinkedInSampleActivity.this,
"Shared sucessfully", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(LinkedInSampleActivity.this,
"Please enter the text to share",
Toast.LENGTH_SHORT).show();
}*/
}
});
}
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() {
@SuppressLint("NewApi")
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);
// client.postNetworkUpdate("Testing by Mukesh!!! LinkedIn wall post from Android app");
Log.i("LinkedinSample",
"ln_access_token: " + accessToken.getToken());
Log.i("LinkedinSample",
"ln_access_token: " + accessToken.getTokenSecret());
//Person p = client.getProfileForCurrentUser();
Person p = client.getProfileForCurrentUser(EnumSet.of(
ProfileField.ID, ProfileField.FIRST_NAME,
ProfileField.PHONE_NUMBERS, ProfileField.LAST_NAME,
ProfileField.HEADLINE, ProfileField.INDUSTRY,
ProfileField.PICTURE_URL, ProfileField.DATE_OF_BIRTH,
ProfileField.LOCATION_NAME, ProfileField.MAIN_ADDRESS,
ProfileField.LOCATION_COUNTRY));
Log.e("create access token secret", client.getAccessToken()
.getTokenSecret());
if(p!=null) {
name.setText("Welcome " + p.getFirstName() + " "
+ p.getLastName());
name.setVisibility(0);
profile.setText("Profile:"+p.getHeadline());
profile.setVisibility(0);
String id = p.getId();
String url = p.getPictureUrl();
if(url != null && !url.isEmpty()) {
Picasso.with(LinkedInSampleActivity.this).load(url).into(photo);
photo.setVisibility(0);
}
login.setVisibility(4);
share.setVisibility(0);
et.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();
}
}
2.LinkedinDialog:
package com.example.linkedin;
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.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;
/**
* Linkedin dialog
*
* @author Mukesh Kumar Yadav
*/
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.
*/
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();
}
}
});
}
/**
* webview client for internal url loading
*/
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.linkedin.com/uas/oauth/mukeshyadav4u.blogspot.in")) {
cancel();
} else {
Log.i("LinkedinSample", "url: " + url);
view.loadUrl(url);
}
return true;
}
}
/**
* List of listener.
*/
private List listeners = new ArrayList();
/**
* 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);
}
}
3: Config.javapackage com.example.linkedin;
public class Config {
public static String LINKEDIN_CONSUMER_KEY = "your consumer key here";
public static String LINKEDIN_CONSUMER_SECRET = "your consumer secret here
";
public static String scopeParams = "rw_nus+r_basicprofile";
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;
}
4. main.xml<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/blue_bg_rect" android:orientation="vertical" > <RelativeLayout android:id="@+id/header" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/blue_gradient_header" android:orientation="horizontal" > <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> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/header" android:padding="15dp" android:text="Name" android:textColor="@android:color/white" android:textSize="16sp" android:textStyle="bold" android:visibility="invisible" /> <Button android:id="@+id/share" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/et_share" android:layout_marginTop="22dp" android:background="@drawable/linkedin_share" android:visibility="invisible" /> <Button android:id="@+id/login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerInParent="true" android:layout_centerVertical="true" android:background="@drawable/btn_active_pressed" android:gravity="center_vertical|center_horizontal" android:padding="8dp" android:text="Login" android:textColor="@android:color/white" android:textStyle="bold" /> <ImageView android:id="@+id/photo" android:layout_width="72dp" android:layout_height="72dp" android:layout_alignRight="@+id/et_share" android:layout_alignTop="@+id/name" android:layout_marginTop="22dp" android:background="@drawable/photo" android:padding="5dp" android:visibility="invisible" /> <EditText android:id="@+id/et_share" android:layout_width="match_parent" android:layout_height="100dp" android:layout_alignBottom="@+id/login" android:layout_alignParentRight="true" android:ems="10" android:gravity="top|center_vertical" android:hint="Enter Your Text to Share" android:visibility="invisible" > <requestFocus /> </EditText> </RelativeLayout>finally the AndroidManifest.xml file:
5. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.linkedin" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.linkedin.LinkedInSampleActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>Note: While Sending or Posting message on LinkedIn , Or shairing message on
LinkedIn you found following error to:
I am obtaining the following error when using the resource client.sendMessage():
com.google.code.linkedinapi.client.LinkedInApiClientException: Throttle limit for calls to this resource is reached.
com.google.code.linkedinapi.client.impl.BaseLinkedInApiClient.createLinkedInApiClientException(BaseLinkedInApiClient.java:3906)
com.google.code.linkedinapi.client.impl.BaseLinkedInApiClient.callApiMethod(BaseLinkedInApiClient.java:3846)
com.google.code.linkedinapi.client.impl.BaseLinkedInApiClient.sendMessage(BaseLinkedInApiClient.java:1829)
org.apache.jsp.linkedin_005fEmail_jsp._jspService(linkedin_005fEmail_jsp.java:149)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
This is because on LinkedIn there is a few limits, the number of message you can
share on linkedIn. Check below two links for more knowledge:
1. http://developer.linkedin.com/forum/what-throttle-limit-calls-clientsendmessage
2. http://developer.linkedin.com/documents/throttle-limits---see the per day limit
Few Other links
1. http://developer.linkedin.com/documents/libraries-and-tools
2. https://code.google.com/p/linkedin-j/downloads/list
Download the Complete Source Code : LinkedInDemo
Hope this post Helps you.
Enjoy Coding :)





