LoginSignup
13
14

More than 5 years have passed since last update.

AndroidでOAuth2を使ってDropboxの認証をする

Last updated at Posted at 2015-03-24

まぁタイトルの通りですが、とりあえず認証済みかを確認して認証していない場合は認証ページを出して認証後AccessTokenを保存し、それを元にDropboxAPIのインスタンスを作る所までまとめておきます。

公式のドキュメントにもチュートリアルがあるのでこっちを参考にしてもどうぞ。

簡潔なアジェンダ

1.DropboxAPIを使用する為に必要なAppの登録方法
2.DropboxSDKのダウンロードAndroidStudioでの組み込み方法
3.AndroidManifest.xmlの編集
4.Activityにコードを書いていく

Appを作成

ここにアクセスすると右側に「Create app」があるのでクリックします。
すると、次のような質問をされるので「Dropbox API app」を選択します。
スクリーンショット 2015-03-24 18.03.15.png
選択すると、「ファイルとデータストアを使用するのか」といった質問を受けるのでそれぞれ答えていきます。
最後にアプリケーションの名前を入力するよう促されるので入力しておしまいです。

DropboxからSDKを取ってくる

ここからSDKを落とします。
スクリーンショット 2015-03-24 17.47.48.png

SDKをAndroidStudioのプロジェクトに組み込む

落としたSDKを展開すると、libの中にjarファイルが2つあります。
スクリーンショット 2015-03-24 17.49.27.png
このファイルをプロジェクト内にあるlibsに放り込みます。
スクリーンショット 2015-03-24 17.54.33.png
そして、AndroidStudioの上部にある次のボタンを押して読み込ませます。
スクリーンショット 2015-03-24 17.56.48.png

AndroidManifest.xmlの編集

認証には com.dropbox.client2.android.AuthActivity というActivityを使用するため、AndroidManifestに記述します。
この時、dataのandroid:schemeにAppKeyを入力する必要があります。注意する点として、db-の後ろに追記する必要があることです。
また、uses-permissionでINTERNETを許可するようにもしておきます。

        <activity
            android:name="com.dropbox.client2.android.AuthActivity"
            android:configChanges="orientation|keyboard"
            android:launchMode="singleTask">
            <intent-filter>

                <data android:scheme="db-(AppKey)" />

                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

全体的にはこのような内容になります。

AndroidManifest.xml
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.dropbox.client2.android.AuthActivity"
            android:configChanges="orientation|keyboard"
            android:launchMode="singleTask">
            <intent-filter>

                <data android:scheme="db-57b86cj98uo2nwl" />

                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.BROWSABLE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

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

Activityにコードを記述

認証情報を保持するためにSharedPreferencesを用いますが、まずはそれを管理するクラスを作成します。

DropboxUtils.java
public class DropboxUtils {
    private static final String TOKEN = "token";
    private static final String PREF_NAME = "dropbox";
    public static final String APPKEY = "appkey";
    public static final String APPKEYSECRET = "appsecret";
    private Context context;

    public DropboxUtils(Context context) {
        this.context = context;
    }

    public void storeOauth2AccessToken(String secret){
        SharedPreferences preferences = context.getSharedPreferences(PREF_NAME,
                Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(TOKEN, secret);
        editor.commit();
    }

    public AndroidAuthSession loadAndroidAuthSession() {
        SharedPreferences preferences = context.getSharedPreferences(PREF_NAME,
                Context.MODE_PRIVATE);
        String token = preferences.getString(TOKEN, null);
        if (token != null) {
            AppKeyPair appKeys = new AppKeyPair(APPKEY, APPKEYSECRET);
            return new AndroidAuthSession(appKeys,token);
        } else {

            return null;
        }
    }

    public boolean hasLoadAndroidAuthSession() {
        return loadAndroidAuthSession() != null;
    }

}

そして、MainActivityに認証処理を記述します。
onCreate()で先ほど作成したDropboxUtilsのインスタンスを作成し、認証済みであるのかをチェックします。
未認証であれば認証ページ、認証済みであれば認証情報を取得してDropboxAPIのインスタンスを作成します。

@Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dropboxUtils = new DropboxUtils(this);

        //認証済みかを確認
        if(!dropboxUtils.hasLoadAndroidAuthSession()){
            AppKeyPair appKeys = new AppKeyPair(DropboxUtils.APPKEY, DropboxUtils.APPKEYSECRET);
            AndroidAuthSession session = new AndroidAuthSession(appKeys);
            mDBApi = new DropboxAPI<>(session);
            mDBApi.getSession().startOAuth2Authentication(this); //認証していない場合は認証ページを表示
        }else {
            mDBApi = new DropboxAPI<>(dropboxUtils.loadAndroidAuthSession()); //SharedPreferencesから認証情報取得
        }
    }

認証ページで認証が終わると、onResume()でAccessTokenの取得を行い保存します。

@Override
    protected void onResume() {
        super.onResume();
        if (mDBApi.getSession().authenticationSuccessful()) {
            try {
                mDBApi.getSession().finishAuthentication();
                dropboxUtils.storeOauth2AccessToken(mDBApi.getSession().getOAuth2AccessToken());
                Toast.makeText(this,"認証しました",Toast.LENGTH_SHORT).show();
            } catch (IllegalStateException e) {

            }
        }
    }

全体的なコードはこのようになります。

MainActivity.java
public class MainActivity extends ActionBarActivity {

    private DropboxAPI<AndroidAuthSession> mDBApi;
    private DropboxUtils dropboxUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dropboxUtils = new DropboxUtils(this);

        //認証済みかを確認
        if(!dropboxUtils.hasLoadAndroidAuthSession()){
            AppKeyPair appKeys = new AppKeyPair(DropboxUtils.APPKEY, DropboxUtils.APPKEYSECRET);
            AndroidAuthSession session = new AndroidAuthSession(appKeys);
            mDBApi = new DropboxAPI<>(session);
            mDBApi.getSession().startOAuth2Authentication(this); //認証していない場合は認証ページを表示
        }else {
            mDBApi = new DropboxAPI<>(dropboxUtils.loadAndroidAuthSession()); //SharedPreferencesから認証情報取得
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mDBApi.getSession().authenticationSuccessful()) {
            try {
                // Required to complete auth, sets the access token on the session
                mDBApi.getSession().finishAuthentication();
                dropboxUtils.storeOauth2AccessToken(mDBApi.getSession().getOAuth2AccessToken());
                Toast.makeText(this,"認証しました",Toast.LENGTH_SHORT).show();
            } catch (IllegalStateException e) {

            }
        }
    }
}

これで実装は終了です。

実際の動作

実際に動作を確認してみます。
まず、認証をしていないため認証ページへ自動的に遷移します。
スクリーンショット 2015-03-24 19.02.40.png
リクエストの許可をすると、MainActivityへ戻ります。
スクリーンショット 2015-03-24 19.03.21.png
再度、アプリを立ち上げると認証済みであるため認証ページへは遷移せずそのままMainActivityが動きます。
スクリーンショット 2015-03-24 18.59.55.png

13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14