2011-06-23 43 views
5

首先。是否有可能像Facebook,Twitter的Android應用程序添加linkedin?我已經閱讀了許多博客,但無法在我的應用程序中實現linkedin。我已經到達用戶輸入用戶名和密碼的應用程序的用戶授權過程。但是當他輸入一個5位數字進入屏幕並且屏幕被告知應用主屏幕。然後填寫它並按回車。來自linkedin的Android應用程序訪問令牌

但問題是我該如何從瀏覽器移回到我的應用程序,以及用戶應該放置這些數字數據。並且當&我如何獲得訪問令牌以使用用戶配置文件的數據。

有沒有好的事情在互聯網上使用與安卓的linkedin。我有一個圖書館http://code.google.com/p/linkedin-j/,但如何克服的情況?不知道。任何人都可以向我推薦一些解謝謝。

回答

0

好吧,我在幾個小時前有同樣的問題,這是我如何解決它:

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; 
    } 
} 

,並在我的活動方面我有以下方法:

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(); 

    } 

只是爲了澄清:

我創建了一個帶有webview的片段,當用戶輸入他們的憑據時,我檢測到包含「submit」的重定向url,我做了一些JavaScript注入以獲取元素有oauth驗證者。然後我解散片段並返回到我的活動,並使用該oauth驗證器來使用客戶端來完成我需要的操作。

2

您可以使用第三方jar scribe.jar來實現此目的。 按如下方式調用webview授權意圖。

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); 

在授權後,您將被重定向到您的活動。在您的活動中檢索訪問令牌,如下所示。

@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); 
    } 

使用訪問令牌就可以進行網絡更新LinkedIn如下。

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()); 

} 

該活動應該在清單文件中聲明如下。

<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

您好Thasneem我正在尋找與Scribe使用linkedin進行的linkedin整合。如果你有或指導我通過相關鏈接,請給我一個示例應用程序? –

+0

請參閱以下網址瞭解更多信息。 https://開頭github上。com/fernandezpablo85/scribe-java/blob/master/src/test/java/org/scribe/examples/LinkedInExample.java。你可以從這裏下載一個示例應用程序。 – Thasneem

0

通過下面的代碼,我已經做到了成功的100%測試

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"; 

}

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

什麼是OAuthConsumer –

相關問題