问题描述
|
首先。是否可以通过Facebook,Twitter等Android应用程序添加linkedin?我已经阅读了许多博客,但是无法在我的应用程序中实现linkedin。我已经进入应用程序的用户授权过程,在该过程中,用户输入了他的用户名和密码。但是当他输入5位数字时,屏幕上会出现,并且屏幕显示已到达应用程序主屏幕。然后填充它,然后按Enter。
但是问题是,我该如何从浏览器移回我的应用程序,以及用户应在何处放置此数字数据。以及何时及如何获取访问令牌以使用用户个人资料的数据。
互联网上没有什么好事可用于android的linkedin。我有一个图书馆http://code.google.com/p/linkedin-j/,但是如何克服情况呢?不知道。谁能建议我一些解决方案。谢谢。
解决方法
您可以使用第三方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>
, 好的,几个小时前我遇到了同样的问题,这就是我解决的方法:
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验证程序来执行我需要使用客户端的操作。
, 通过以下代码,我已经成功完成了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\";
}
AndroidManifiedt.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>