本文概述
在本教程中,我们将在我们的Android应用程序中集成LinkedIn登录功能。在Android应用程序中实现LinkedIn API可以帮助用户使用LinkedIn帐户登录,分享帖子等。
要将LinkedIn API集成到我们的Android应用中,我们需要LinkedIn身份验证密钥(客户端ID和客户端密钥)和应用哈希密钥。
生成LinkedIn身份验证密钥和APP哈希密钥的步骤
1.在https://www.linkedin.com/developer/apps上创建LinkedIn开发者帐户,然后单击“创建应用程序”。
2.在“创建新应用程序”表单中填写Android应用程序的所有必需详细信息,并接受LinkedIn API使用条款,然后单击“提交”。
3.提交应用程序详细信息后,它将生成LinkedIn身份验证密钥。现在,我们将选择“默认应用程序权限”。该权限授权访问用户帐户的权限。在这里,我们选择r_basicprofile和“ r_emailaddress”,然后单击“更新”。
4.现在,我们需要为应用程序提供“哈希键”。它可以通过两种不同的方式生成。
- 在命令提示符下使用命令。
视窗:
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
要通过命令提示符生成哈希密钥,需要在我们的操作系统中安装OpenSSL。我们可以从www.slproweb.com/products/Win32OpenSSL.html在Windows上下载它,并从http://www.openssl.org/source/在Mac / Unix上下载它。
- 使用Activity.java类中的编程代码。
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));
对于此应用程序,我们将使用编程代码为我们的应用程序生成“哈希密钥”。
现在创建我们的应用程序,只需编写以下代码并运行以生成我们的“哈希密钥”。它将在Logcat中显示应用程序“哈希密钥”。
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复制“哈希密钥”,并将其粘贴到我们的LinkedIn应用程序的“移动”选项卡中。之后,单击“添加”和“更新”。这使我们的应用程序“哈希键”已在LinkedIn API中注册。
在Android应用中集成LinkedIn登录的示例
让我们创建一个在我们的Android应用程序中集成LinkedIn登录功能的示例。成功登录用户后,它将把用户重定向到另一个活动(ProfileActivity)并显示用户信息。
我们需要在项目中添加Android版LinkedIn SDK。可以从这里https://developer.linkedin.com/downloads下载
在activity_main.xml文件中添加以下代码。从LinkedIn开发人员网站https://developer.linkedin.com/downloads下载推荐的LinkedIn按钮,并将其添加为按钮的背景。
<?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类,该类提供了创建和管理LISession对象(LinkedIn会话对象)的所有功能。在构建中,范围添加了“ Scope.R_BASICPROFILE”和“ Scope.R_EMAILADDRESS”以访问用户基本个人资料信息和LinkedIn的电子邮件地址。
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
现在,将以下代码添加到activity_profile.xml文件中。在此活动中,成功登录后,我们将显示用户信息。
<?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,名字,姓氏,电子邮件地址)。它将获取有关LinkedIn API成功的用户信息。
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();
}
});
}
}
输出: