AndroidアプリにLINEログインを組み込む

このページでは、LINEログインの実装方法として、既存のAndroidアプリにLINE SDK for Androidを組み込む方法について説明します。LINEログインの機能を簡単に確認するには、LINEログインのAndroidスターターアプリケーションを利用できます。「AndroidアプリでLINEログインを試してみる」を参照してください。

始める前に

以下の作業が完了していることを確認します。

注:linesdk_で始まるリソースIDはSDK内のリソースと衝突する可能性があるため、使用しないでください。

チャネルを設定する

アプリをチャネルとリンクするには、コンソールの[アプリ設定]ページで以下の項目を入力します。

  • Androidパッケージ名: 必須。Google Playを起動するためのアプリケーションのパッケージ名です。
  • Androidパッケージの署名: 省略可能。複数の署名を指定するには、改行で区切ります。注:Android SDK 3.x以前を使用する場合は入力必須です。
  • Androidスキーム:省略可能。アプリを起動するためのカスタムURLスキームです。

Androidアプリ設定

SDKをダウンロードする

AndroidアプリにSDKを組み込むために、「ダウンロード」ページからLINE SDK for Androidをダウンロードします。注:最新バージョンのSDKを使用してください。以前のバージョンのSDKは非推奨です。

  1. SDKファイルのリンクをクリックし、任意のディレクトリに保存します。

SDKをインストールする

LINE SDK for Androidをインストールするには、必要なライブラリをプロジェクトにインポートし、以下の手順に従ってプロジェクトのAndroidマニフェストファイルを設定します。

ライブラリをプロジェクトにインポートする

  1. プロジェクトのlibsフォルダーに、.aarファイルをコピーします。
  2. 最上位のbuild.gradleファイルに、libsフォルダーをリポジトリとして追加します。

    allprojects {
        repositories {
            ...
            flatDir {
                dirs 'libs'
            }
        ...
        }
    }
    
  3. モジュールレベルのbuild.gradleファイルに、compileオプションを使ってSDKに対する依存性を追加します。

    dependencies {
    ...
    compile(name:'line-sdk-4.0.5', ext:'aar')
    ...
    } 
    

必要なAndroidサポートライブラリを追加する

LINE SDKには、以下のAndroidサポートライブラリが必要です。

  • appcompat v7
  • customtabs

モジュールレベルのbuild.gradleファイルのdependenciesセクションに、サポートライブラリを追加します。以下はAPIレベル25のサポートライブラリの例です。AndroidのAPIレベルに合ったバージョンのサポートライブラリを使用してください。

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:25.4.0'
    compile 'com.android.support:customtabs:25.4.0'
    ...
}

Androidマニフェストファイルを設定する

アプリがインターネットに接続する必要があることを明示するために、AndroidManifest.xmlファイルにINTERNET権限を追加します。

<uses-permission android:name="android.permission.INTERNET" />

注:ログイン呼び出しを行うアクティビティの起動モードがsingleInstanceに設定されていると、onActivityResultコールバックを正しく受け取れない場合があります。

LINEログインボタンを追加する

ユーザーがAndroidアプリにログインできるようにするために、LINEロゴがついたログインボタンを作成できます。このボタンを使って、ユーザーは認証および認可を受けることができます。

画像をダウンロードしてプロジェクトに追加する

LINEログインボタンの画像セットには、iOS、Android、デスクトップアプリ用の画像が含まれます。また、さまざまな解像度やボタンの状態に対応する、複数の画像が用意されています。ここでは、Androidフォルダー内の「通常時」および「押下時」のログインボタン画像を使用した例を紹介します。

  1. LINEログインのボタン画像をダウンロードし、抽出します。
  2. 各画面密度にあわせて、「通常時」および「押下時」のログインボタンをdrawableフォルダーに追加します。

画像を使用する

画像を使用する前に、ログインボタンのテキストを追加する必要があります。各言語で推奨されるテキストについては、「LINEログインボタンデザインガイドライン」を参照してください。また、LINEアイコンを歪みなく引き伸ばせるようにするために、画像内で引き伸ばせる部分を定義する必要があります。

  1. 各画像に対して9-patchファイルを作成し、ログインボタンテキストの伸縮する部分を定義します。
  2. アプリのログイン画面に、望ましいログインボタンテキストと共に、クリックできるテキストビューとしてボタンを追加します。
  3. ドローアブルフォルダーにselector XMLファイルを追加して、テキストビューの状態に対応する画像を定義します。

ログインアクティビティを開始する

ユーザーがログインボタンをタップすると、アプリはgetLoginIntent()を呼び出してログインインテントを取得し、ログインアクティビティを開始します。このメソッドに、コンテキストとチャネルIDを渡す必要があります。ユーザーがデバイスにLINEアプリをインストール済みの場合、LINEアプリが開き、ユーザーのLINE資格情報の入力なしでログインが実行されます。ユーザーがデバイスにLINEアプリをインストールしていない場合、ブラウザでLINEログインダイアログが開きます。ユーザーは、この画面にLINE資格情報(メールアドレスおよびパスワード)を入力します。

  1. ボタンのタップを待機するon-clickリスナーを設定します。
  2. onClickのコールバックでLineLoginApigetLoginIntent()メソッドを呼び出して、ログインインテントを取得してログインアクティビティを開始します。
  3. startActivityForResult()を呼び出してログインインテントとリクエストコードをパラメータとして渡し、認証プロセスを開始します。リクエストコードとは、リクエストを識別するための整数です。

以下は、ユーザーがログインボタンをタップしたときにログインアクティビティを開始する方法の例です。

private static final int REQUEST_CODE = 1;
...

final TextView loginButton = (TextView) findViewById(R.id.login_button);
        loginButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                try{
                    // App-to-app login
                    Intent loginIntent = LineLoginApi.getLoginIntent(v.getContext(), Constants.CHANNEL_ID);
                    startActivityForResult(loginIntent, REQUEST_CODE);

                }
                catch(Exception e) {
                    Log.e("ERROR", e.toString());
                }
            }
        });

注:アプリ連携ログインではなく、ブラウザでLINEログインダイアログを開いてユーザーをログインさせたい場合は、getLoginIntentWithoutLineAppAuth()メソッドを使います。

ログイン結果を処理する

ユーザーのログインが完了すると、ログイン結果がアクティビティのonActivityResult()メソッドに返されます。アプリはログイン結果を処理するために、このメソッドをオーバーライドする必要があります。

LineLoginResultオブジェクトのgetResponseCode()メソッドを使用して、LINEログインが成功したかどうかを判定します。ログインに成功した場合、getResponseCode()SUCCESSを返します。それ以外の値が返った場合は、ログインに失敗したことを意味します。以下のレスポンスコードから、発生したエラーの種類を判定できます。

レスポンスコード 説明
SUCCESS ログインに成功しました。
CANCEL ユーザーがログイン処理を中止したため、ログインに失敗しました。
SERVER_ERROR サーバー側のエラーにより、ログインに失敗しました。
NETWORK_ERROR SDKがLINEプラットフォームに接続できなかったため、ログインに失敗しました。
INTERNAL_ERROR 原因不明のエラーにより、ログインに失敗しました。

アプリによるログイン結果の処理方法については、以下を参考にしてください。

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode != REQUEST_CODE) {
        Log.e("ERROR", "Unsupported Request");
        return;
    }

    LineLoginResult result = LineLoginApi.getLoginResultFromIntent(data);

    switch (result.getResponseCode()) {

        case SUCCESS:     
        // Login successful

            String accessToken = result.getLineCredential().getAccessToken().getAccessToken();

            Intent transitionIntent = new Intent(this, PostLoginActivity.class);
            transitionIntent.putExtra("line_profile", result.getLineProfile());
            transitionIntent.putExtra("line_credential", result.getLineCredential());
            startActivity(transitionIntent);
            break;

        case CANCEL:    
        // Login canceled by user
            Log.e("ERROR", "LINE Login Canceled by user!!");
            break;

        default:
        // Login canceled due to other error
            Log.e("ERROR", "Login FAILED!");
            Log.e("ERROR", result.getErrorData().toString());
    }
}

アクセストークンを取得する

ログイン結果には、ユーザーのアクセストークンが入ったLineCredential()オブジェクトが含まれています。上の例に示すとおり、以下のコードを使用してアクセストークンを取得できます。

String accessToken = result.getLineCredential().getAccessToken().getAccessToken();

ログイン直後にユーザープロフィールを取得する

ユーザーがログインすると、LINE SDKによって自動的にユーザーのプロフィール情報が取得されます。ユーザーのプロフィール情報には、表示名、ユーザーID、ステータスメッセージ、およびプロフィール画像が含まれます。LineLoginResultオブジェクトのgetLineProfileメソッドを呼び出して、この情報にアクセスします。以下のコードは、上の例から引用したものです。ログイン結果からユーザーのプロフィール情報を取得し、インテントに渡す方法を説明しています。

Intent transitionIntent = new Intent(this, PostLoginActivity.cla
transitionIntent.putExtra("display_name", result.getLineProfile().getDisplayName());
transitionIntent.putExtra("status_message", result.getLineProfile().getStatusMessage());
transitionIntent.putExtra("user_id", result.getLineProfile().getUserId());
transitionIntent.putExtra("picture_url", result.getLineProfile().getPictureUrl().toString

LineApiClientインターフェースを使用する

LineApiClientインターフェースのメソッドを呼び出して、SDKを使用します。SDKを使うには、スタティック変数のlineApiClientオブジェクトを作成して初期化します。

  1. さまざまなメソッドを呼び出すオブジェクトのスタティック変数を作成します。
private static LineApiClient lineApiClient;
  1. アクティビティのonCreate()メソッドで、lineApiClient変数を以下のとおりに初期化します。初期化にはチャネルIDとコンテキストが必要です。
LineApiClientBuilder apiClientBuilder = new LineApiClientBuilder(getApplicationContext(), );
lineApiClient = apiClientBuilder.build();

注:Android SDKのメソッドの実行にはネットワーク通信が伴うため、メインスレッドで呼び出すとNetworkOnMainThreadExceptionsが発生します。AsyncTaskを使ってメソッドを呼び出すことで、この問題を回避できます。

次のステップ

これで、あなたのAndroidアプリにLINEログインの機能が追加されました。ユーザーは自分のLINEアカウントを使ってアプリにログインでき、アプリ側ではアクセストークンとユーザープロフィール情報を取得できます。Android SDKのその他の機能については、以下のページを参照してください。


ご意見やご要望がある場合

LINEプラットフォームのドキュメントやサービスについてご不明な点があるときは、まずCommunityサイトの「Q&A」ページをご覧ください。疑問が解決しない、またはドキュメントの内容やLINEプラットフォームの機能についてご要望があれば、以下のボタンをクリックするか、GitHubのLINE Platform feedbackリポジトリにイシューを作成してお知らせください。