集成Line登陆

1. 集成Line登陆

官网开发者后台
官网开发文档
官方 github Demo
1. project build.gradle
// project build.gradle
buildscript {
    ......
    dependencies {
        // 依赖line sdk 5.0.1后gradle3.0.0会构建失败,因此直接升到最新版本
        classpath 'com.android.tools.build:gradle:3.3.1' 
        ......
    }
}
allprojects {
    repositories {
        jcenter() // line sdk仓库存放,没有就添加上
        ......
    }
}
复制代码
2. module build.gradle
// module build.gradle
android {
    defaultConfig {
        ......
        // 最小版本为17
        minSdkVersion 17 
        ......
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    ......
}
dependencies {
    ......
    // 添加Line sdk依赖
    implementation 'com.linecorp:linesdk:5.0.1'
}
复制代码
3. LoginActivity.class
集成登陆功能
  • 先验证token是否有效,token有效则能够使用LineApiClient 获取token和userId;token无效须要跳转到Line app登陆(若是没安装Line app则打开浏览器进行网页受权)
  • token有效状态下,用户信息均可以经过LineApiClient获取。
  • LineApiClient 的方法由于须要访问网络,因此都须要在子线程调用。
// LoginActivity.class
public class LoginActivity extends Activity {

    private static final int REQUEST_CODE = 1000;

    // Line API 调用,保持单例,token有效状态下,用户信息均可以经过LineApiClient获取
    private static LineApiClient lineApiClient;

    public static LineApiClient getLineApiClient(Context context) {
        if (lineApiClient == null) {
            synchronized (LoginActivity.class) {
                if (lineApiClient == null) {
                    LineApiClientBuilder apiClientBuilder = new LineApiClientBuilder(context, Constants.LINE_CHANNEL_ID);
                    lineApiClient = apiClientBuilder.build();
                }
            }
        }
        return lineApiClient;
    }

    public void login() {
        AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
            try {
                // 检测token有效性
                if (getLineApiClient(LoginActivity.this).verifyToken().isSuccess()) {
                    String accessToken = getLineApiClient(LoginActivity.this).getCurrentAccessToken().getResponseData().getTokenString();

                    LineProfile profile = getLineApiClient(LoginActivity.this).getProfile().getResponseData();
                    String userId = profile.getUserId();
                    loginSuccess(userId, accessToken);
                    //TODO 获取token和userId,执行本身的登陆业务逻辑
                    return;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try{
                // 调起line app受权登陆
                LineAuthenticationParams params = new LineAuthenticationParams.Builder().scopes(Arrays.asList(Scope.PROFILE)).build();
                Intent loginIntent = LineLoginApi.getLoginIntent(activity, Constants.LINE_CHANNEL_ID, params);
                startActivityForResult(loginIntent, REQUEST_CODE);
            } catch(Exception e) {
                e.printStackTrace();
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode != REQUEST_CODE) {
            return;
        }
        LineLoginResult result = LineLoginApi.getLoginResultFromIntent(data);
        switch (result.getResponseCode()) {
            case SUCCESS:
                try {
                    String accessToken = result.getLineCredential().getAccessToken().getTokenString();
                    String userId = result.getLineProfile().getUserId();
                    String displayName = result.getLineProfile().getDisplayName();
                    //TODO 获取token和userId,执行本身的登陆业务逻辑
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;
            case CANCEL:
                // Login CANCEL! 
                break;
            default:
                // Login FAILED! 
        }
    }

    public void logOut() {
        AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
            try {
                getLineApiClient(LoginActivity.this).logout();
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
}
复制代码

开发中遇到的问题和解决方案都在代码写了注释。

相关文章
相关标签/搜索