忍者ブログ

アンドロイドのあれこれ

WebView使わずに、facebook4j のOAuth認証
※ただし、アプリ単体のみではなく、別のサーバーを用意する必要あり

Facebook4j
http://facebook4j.org/


WebViewを使わずにどういう方法がある少し検証しましたが、どうもコールバックのredirect_uriのパラメーターがFacebookのdevelopersに登録している「Website with Facebook Login」と(当たり前だが)同じものでないといけません。

Facebook Developers

サーバー側
http://example.com/fb-callback.php
<?php
$query = $_GET;
$code = $query['code'];
//ブラウザーアプリから認証アプリへもどるように
header("Location: demofacebook://NewsFeedActivity?code=".$code);


FacebookActivity.java
public class FacebookActivity extends Activity {
public static AccessToken _accessToken = null;
public static OAuthAuthorization _oauth = null;

private String appId = "xxxxxxx";
private String appSecret = "xxxxxxxxxxxxxxxxxx";
private String permissions = "email,publish_stream";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button reqOAuth = (Button)findViewById(R.id.request_oauth);
reqOAuth.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
//facebookにoauthリクエストする
startOAuth();
}

});
}

//facebookにoauthリクエストする
private void startOAuth() {
Configuration conf = ConfigurationContext.getInstance();
_oauth = new OAuthAuthorization(conf);
_oauth.setOAuthAppId(appId, appSecret);
_oauth.setOAuthPermissions(permissions);
String status = String.valueOf(System.currentTimeMillis()) + UUID.randomUUID().toString();
String url = null;
try {
url = _oauth.getOAuthAuthorizationURL( URLEncoder.encode("http://b0ne.me/fb-callback.php" , "UTF-8"), status);
} catch (Exception e) {
}
//ブラウザーアプリへ移動、OAuth Codeを取得するために
startActivity(new Intent(Intent.ACTION_VIEW , Uri.parse(url)));
finish();
}

@Override
protected void onResume(){
super.onResume();

// http://example.com/fb-callback.phpからコールバックを受け取るとき
Uri uri = getIntent().getData();
if (uri != null && uri.toString().startsWith("demofacebook://NewsFeedActivity")) {
getAccessTokenFromCallback(uri.getQueryParameter("code"));
}
}

//accessTokenの取得
private void getAccessTokenFromCallback(String code) {
FacebookCallbackTask task = new FacebookCallbackTask(this);
task.execute(code);
}

//FacebookCallbackTaskからの結果
public void setAccessToken(AccessToken accessToken) {
//accssToken.getToken()で取得
_accessToken = accessToken;
}

}


FacebookCallbackTask.java
public class FacebookCallbackTask extends AsyncTask<String, Integer, AccessToken>{

private FacebookActivity mActivity;

public FacebookCallbackTask(FacebookActivity activity) {
mActivity = activity;
}

@Override
protected AccessToken doInBackground(String... params) {
AccessToken accessToken = null;
String oauthCode = params[0];
try {
accessToken = NewsFeedActivity._oauth.getOAuthAccessToken(oauthCode);
} catch (FacebookException e) {
Log.e("OAUTH_ERROR", e.getErrorMessage());
}
return accessToken;
}

@Override
protected void onPostExecute(AccessToken result){
if (result != null) {
mActivity.setAccessToken(result);
} else {
Log.v("ERR","callback task error.");
}
}
}


ブラウザーアプリから、コールバックのインテントを受け取るためにAndroidManifest.xmlにintent-filterを追加
....
<activity android:name=".FacebookActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="demofacebook" />
</intent-filter>
</activity>
....


参考記事:
Facebook4JをAndroidアプリ上で動かすサンプルコードを公開しました+α
http://blog.roundrop.jp/show/36


COMMENT
NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 
PR
© Android Advent
powered by 忍者ツールズ / 忍者ブログ / [PR]