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.java
package 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 :)