【问题标题】:access token from linkedin for android application从linkedin访问android应用程序的令牌
【发布时间】:2011-09-21 04:18:47
【问题描述】:

首先。是否可以使用 facebook、twitter 等 android 应用程序添加linkedin?我已经阅读了很多博客,但无法在我的应用程序中实现linkedin。我已经进入了用户输入用户名和密码的应用程序的用户授权过程。但是当他输入一个 5 位数的数字时,屏幕上会出现并告诉屏幕进入应用程序主屏幕。然后填写并回车。

但问题是我如何从浏览器移回我的应用程序以及用户应该将这些数字数据放在哪里。以及何时以及如何获取访问令牌以使用用户配置文件的数据。

互联网上没有好东西可用于与android 的linkedin。我有一个图书馆http://code.google.com/p/linkedin-j/,但如何克服这种情况?不知道。任何人都可以建议我一些解决方案。谢谢。

【问题讨论】:

    标签: android oauth linkedin


    【解决方案1】:

    好的,几个小时前我遇到了同样的问题,这就是我解决它的方法:

    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 的片段,当用户输入他们的凭据时,我检测到包含“提交”的重定向 url,我进行了一些 JavaScript 注入来获取具有 oauth 验证器的元素。然后我关闭该片段并返回我的活动并使用该 oauth 验证程序来使用客户端执行我需要的操作。

    【讨论】:

      【解决方案2】:

      您可以使用第三方 jar scribe.jar 来实现此目的。 如下调用 webview intent 进行授权。

      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>
      

      【讨论】:

      • 您好 Thasneem 我正在寻找使用 Scribe 与 android 集成的linkedin。如果您有或通过相关链接指导我,能否请您给我一个示例应用程序??
      • 请查看以下网址了解更多信息。 github.com/fernandezpablo85/scribe-java/blob/master/src/test/… 。您可以从此处下载示例应用程序。
      【解决方案3】:

      通过以下代码,我已成功完成 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
      
      }
      

      }

      常量.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>
      

      【讨论】:

      • 什么是 OAuthConsumer
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2020-02-29
      • 2012-06-21
      • 1970-01-01
      • 2015-07-16
      • 2018-03-01
      • 2014-03-07
      相关资源
      最近更新 更多