在 Android 應(yīng)用中集成 LinkedIn API
在本教程中,我們將在我們的 Android 應(yīng)用中集成 LinkedIn 登錄 功能。愛掏網(wǎng) - it200.com在 Android app 中實(shí)現(xiàn) LinkedIn API 可以幫助用戶使用 LinkedIn 賬號登錄、分享動(dòng)態(tài)等。愛掏網(wǎng) - it200.com
要在我們的 Android 應(yīng)用中集成 LinkedIn API ,我們需要 LinkedIn 的 認(rèn)證密鑰 (客戶端 ID 和客戶端密鑰)以及應(yīng)用程序的 哈希密鑰 。愛掏網(wǎng) - it200.com
1. 在 https://www.linkedin.com/developer/apps 上創(chuàng)建 LinkedIn 開發(fā)者賬號,并點(diǎn)擊”創(chuàng)建應(yīng)用”。愛掏網(wǎng) - it200.com
2. 在“創(chuàng)建新應(yīng)用程序”表中填寫Android應(yīng)用程序的所有必填詳細(xì)信息,并接受LinkedIn API使用條款,然后點(diǎn)擊“提交”。愛掏網(wǎng) - it200.com
3.提交應(yīng)用程序詳細(xì)信息后,它會生成LinkedIn身份驗(yàn)證密鑰。愛掏網(wǎng) - it200.com現(xiàn)在我們將選擇 “默認(rèn)應(yīng)用程序權(quán)限” 。愛掏網(wǎng) - it200.com此權(quán)限授權(quán)訪問用戶帳戶的特權(quán)。愛掏網(wǎng) - it200.com在這里,我們選擇 r_basicprofile 和 “r_emailaddress” ,然后點(diǎn)擊 “更新” 。愛掏網(wǎng) - it200.com
4. 現(xiàn)在,我們需要我們的應(yīng)用程序的 ‘Hash Key’ 。愛掏網(wǎng) - it200.com它可以通過兩種不同的方式生成。愛掏網(wǎng) - it200.com
- 使用命令提示符上的命令。愛掏網(wǎng) - it200.com
Windows:
keytool -exportcert -keystore %HOMEPATH%\.android\debug.keystore -alias androiddebugkey | openssl sha1 -binary | openssl base64
Mac/Unix
keytool -exportcert -keystore ~/.android/debug.keystore -alias androiddebugkey | openssl sha1 -binary | openssl base64
通過命令提示符生成哈希鍵需要在我們的操作系統(tǒng)中安裝OpenSSL。愛掏網(wǎng) - it200.com我們可以從www.slproweb.com/products/Win32OpenSSL.html下載用于Windows的OpenSSL,而對于Mac/Unix系統(tǒng)則可以從http://www.openssl.org/source/下載。愛掏網(wǎng) - it200.com
- 在Activity.java類中使用編程代碼。愛掏網(wǎng) - it200.com
PackageInfo info = getPackageManager().getPackageInfo(
"Your Package Nane",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
對于這個(gè)應(yīng)用程序,我們將使用編程代碼為我們的應(yīng)用程序生成“哈希鍵”。愛掏網(wǎng) - it200.com
現(xiàn)在創(chuàng)建我們的應(yīng)用程序,并簡單地編寫以下代碼并運(yùn)行以生成我們的“哈希鍵”。愛掏網(wǎng) - it200.com它將在Logcat中顯示應(yīng)用程序的“哈希鍵”。愛掏網(wǎng) - it200.com
MainActivity.java
package example.com.linkedinlogindemo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import java.security.MessageDigest;
public class MainActivity extends AppCompatActivity {
public static final String PACKAGE = "example.com.linkedinlogindemo";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
computePakageHash();
}
private void computePakageHash() {
try {
PackageInfo info = getPackageManager().getPackageInfo(
"example.com.linkedinlogindemo",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (Exception e) {
Log.e("TAG",e.getMessage());
}
}
}
5. 從Logcat復(fù)制“哈希鍵”,然后將其粘貼到LinkedIn應(yīng)用程序的Mobile選項(xiàng)卡中。愛掏網(wǎng) - it200.com然后點(diǎn)擊“添加”和“更新”。愛掏網(wǎng) - it200.com這將使我們的應(yīng)用程序的“哈希鍵”被注冊到LinkedIn API。愛掏網(wǎng) - it200.com
在Android應(yīng)用中集成LinkedIn登錄的示例
讓我們創(chuàng)建一個(gè)集成LinkedIn登錄功能的Android應(yīng)用示例。愛掏網(wǎng) - it200.com在用戶成功登錄后,它會將用戶重定向到另一個(gè)活動(dòng)(ProfileActivity)并顯示用戶信息。愛掏網(wǎng) - it200.com
我們需要在項(xiàng)目中添加LinkedIn SDK for Android。愛掏網(wǎng) - it200.com可以從這里下載 https://developer.linkedin.com/downloads#androidsdk.
必填的權(quán)限
在 AndroidManifest.xml 文件中添加 Internet 權(quán)限。愛掏網(wǎng) - it200.com
<uses-permission android:name="android.permission.INTERNET" />
settings.gradle
在 settings.gradle 文件中添加 linkedin-sdk
include ':app', ':linkedin-sdk'
build.gradle(模塊)
在build.gradle文件中添加 compile project(path: ‘:linkedin-sdk’) 。愛掏網(wǎng) - it200.com
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
compile project(path: ':linkedin-sdk')
}
activity_main.xml
在activity_main.xml文件中添加以下代碼。愛掏網(wǎng) - it200.com從LinkedIn開發(fā)者網(wǎng)站 https://developer.linkedin.com/downloads 下載推薦的LinkedIn按鈕,并將其作為按鈕的背景添加進(jìn)去。愛掏網(wǎng) - it200.com
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="example.com.linkedinlogindemo.MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:textSize="20dp"
android:layout_centerHorizontal="true"
android:text="This is Login Page" />
<Button
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="17dp"
android:background="@drawable/loginbutton"
tools:layout_editor_absoluteX="58dp"
tools:layout_editor_absoluteY="437dp" />
</RelativeLayout>
MainActivity.java
在MainActivity.java類中,我們使用LISessionManager類,該類提供了創(chuàng)建和管理LISession對象(LinkedIn會話對象)的所有功能。愛掏網(wǎng) - it200.com在build方法中,scope添加’Scope.R_BASICPROFILE’和’Scope.R_EMAILADDRESS’以訪問LinkedIn用戶的基本個(gè)人資料信息和電子郵件地址。愛掏網(wǎng) - it200.com
package example.com.linkedinlogindemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.linkedin.platform.LISessionManager;
import com.linkedin.platform.errors.LIAuthError;
import com.linkedin.platform.listeners.AuthListener;
import com.linkedin.platform.utils.Scope;
public class MainActivity extends AppCompatActivity {
Button loginBtn;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loginBtn = (Button) findViewById(R.id.login_button);
textView=(TextView)findViewById(R.id.textView);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
loginHandle();
}
});
}
public void loginHandle() {
LISessionManager.getInstance(getApplicationContext()).init(MainActivity.this, buildScope(), new AuthListener() {
@Override
public void onAuthSuccess() {
// Authentication was successful. You can now do other calls with the SDK.
Intent intent=new Intent(MainActivity.this,ProfileActivity.class);
startActivity(intent);
}
@Override
public void onAuthError(LIAuthError error) {
// Handle authentication errors
Toast.makeText(getApplicationContext(),"Login Error "+error.toString(),Toast.LENGTH_LONG).show();
}
}, true);
}
private static Scope buildScope() {
return Scope.build(Scope.R_BASICPROFILE, Scope.R_EMAILADDRESS);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Add this line to your existing onActivityResult() method
LISessionManager.getInstance(getApplicationContext()).onActivityResult(this, requestCode, resultCode, data);
}
}
activity_profile.xml
現(xiàn)在,在 activity_profile.xml 文件中添加以下代碼。愛掏網(wǎng) - it200.com在這個(gè)活動(dòng)中,我們將在成功登錄后顯示用戶信息。愛掏網(wǎng) - it200.com
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
tools:context="example.com.linkedinlogindemo.ProfileActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Welcome to profile" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/userDetail"
android:text="userdetail"
android:layout_marginTop="20dp"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:textColor="#FFF"
android:text="logout"
android:id="@+id/logout_button"
android:background="#022885"
/>
</LinearLayout>
ProfileActivity.java
在APIHelper類的getRequest()方法中添加LinkedIn API URL https://api.linkedin.com/v1/people/~:(id,first-name,last-name,email-address) 它將在成功調(diào)用LinkedIn API時(shí)檢索用戶信息。愛掏網(wǎng) - it200.com
package example.com.linkedinlogindemo;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.linkedin.platform.APIHelper;
import com.linkedin.platform.LISession;
import com.linkedin.platform.LISessionManager;
import com.linkedin.platform.errors.LIApiError;
import com.linkedin.platform.listeners.ApiListener;
import com.linkedin.platform.listeners.ApiResponse;
import org.json.JSONException;
import org.json.JSONObject;
public class ProfileActivity extends AppCompatActivity {
TextView user_detail;
String firstName,lastName,userEmail;
Button logout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_profile);
user_detail=(TextView)findViewById(R.id.userDetail);
logout=(Button)findViewById(R.id.logout_button);
fetchuserData();
logout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LISessionManager.getInstance(getApplicationContext()).clearSession();
Toast.makeText(getApplicationContext(),"Logout Successfully",Toast.LENGTH_LONG).show();
Intent intent = new Intent(ProfileActivity.this, MainActivity.class);
startActivity(intent);
}
});
}
private void fetchuserData() {
String url = "https://api.linkedin.com/v1/people/~:(id,first-name,last-name,email-address)";
APIHelper apiHelper = APIHelper.getInstance(getApplicationContext());
apiHelper.getRequest(this, url, new ApiListener() {
@Override
public void onApiSuccess(ApiResponse apiResponse) {
// Success!
try {
JSONObject jsonObject = apiResponse.getResponseDataAsJson();
firstName = jsonObject.getString("firstName");
lastName = jsonObject.getString("lastName");
userEmail = jsonObject.getString("emailAddress");
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("First Name " + firstName + "\n\n");
stringBuilder.append("Last Name " + lastName + "\n\n");
stringBuilder.append("Email " + userEmail);
user_detail.setText(stringBuilder);
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onApiError(LIApiError liApiError) {
// Error making GET request!
Toast.makeText(getApplicationContext(),"API Error"+liApiError.toString(),Toast.LENGTH_LONG).show();
}
});
}
}
輸出: