2011-06-23 60 views
5

Trước hết. Có thể thêm linkedin với ứng dụng android như facebook, twitter không? Tôi đã đọc nhiều blog nhưng không thể triển khai linkedin trong ứng dụng của mình. Tôi đã đạt đến quy trình cấp phép người dùng cho ứng dụng nơi người dùng nhập tên người dùng và mật khẩu của họ. nhưng khi anh ta nhập vào một số có 5 chữ số xuất hiện trên màn hình và màn hình nói với màn hình chủ ứng dụng. Sau đó điền vào nó và nhấn Enter.mã thông báo truy cập từ linkedin cho ứng dụng android

Nhưng câu hỏi là làm thế nào tôi có thể di chuyển trở lại từ trình duyệt đến ứng dụng của tôi và nơi người dùng nên đặt dữ liệu số này. Và khi & làm cách nào tôi có thể nhận mã thông báo truy cập để sử dụng dữ liệu của hồ sơ người dùng.

Không có vấn đề gì trên internet để sử dụng cho linkedin với android. Tôi đã nhận được một thư viện http://code.google.com/p/linkedin-j/ nhưng cách khắc phục tình huống? Không ý kiến. Bất cứ ai có thể đề nghị tôi một số giải pháp. Cảm ơn.

Trả lời

0

Ok, tôi đã cùng một vấn đề trong một vài giờ trước và đây là cách tôi giải quyết nó:

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

và đứng về phía Hoạt động của tôi, tôi có những phương pháp:

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

    } 

chỉ để làm rõ :

Tôi tạo một đoạn với chế độ xem web và khi người dùng nhập thông tin xác thực của họ, tôi phát hiện url chuyển hướng chứa "gửi" và tôi thực hiện một số thao tác JavaScript để lấy phần tử có trình xác minh oauth. Sau đó tôi loại bỏ đoạn đó và quay trở lại hoạt động của mình và sử dụng trình xác minh oauth đó để làm những gì tôi cần bằng cách sử dụng ứng dụng khách.

2

Bạn có thể đạt được điều này bằng cách sử dụng jar bên thứ ba scribe.jar. Gọi mục đích xem web để ủy quyền như sau.

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

Khi ủy quyền, bạn sẽ được chuyển hướng đến hoạt động của mình. Truy xuất mã thông báo truy cập trong hoạt động của bạn như sau.

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

Sử dụng mã thông báo truy cập bạn có thể cập nhật mạng thành linkedin như sau.

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

} 

Hoạt động phải được khai báo trong tệp kê khai như sau.

<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

Xin chào Thasneem Tôi đang tìm tích hợp liên kết với Android bằng Scribe. Bạn có thể xin vui lòng gửi cho tôi một ứng dụng mẫu nếu bạn có hoặc hướng dẫn tôi mặc dù một liên kết có liên quan ?? –

+0

Vui lòng xem url sau để biết thêm thông tin. https: // github.com/fernandezpablo85/scribe-java/blob/master/src/test/java/org/scribe/ví dụ/LinkedInExample.java. Bạn có thể tải xuống ứng dụng mẫu từ đây. – Thasneem

0

Bằng cách làm theo i mã đã làm nó thành công 100% thử nghiệm

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

}

tập tin 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 là gì –

Các vấn đề liên quan