アンドロイドのあれこれ
[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
WebView使わずに、facebook4j のOAuth認証
※ただし、アプリ単体のみではなく、別のサーバーを用意する必要あり
Facebook4j
http://facebook4j.org/
WebViewを使わずにどういう方法がある少し検証しましたが、どうもコールバックのredirect_uriのパラメーターがFacebookのdevelopersに登録している「Website with Facebook Login」と(当たり前だが)同じものでないといけません。
Facebook4j
http://facebook4j.org/
WebViewを使わずにどういう方法がある少し検証しましたが、どうもコールバックのredirect_uriのパラメーターがFacebookのdevelopersに登録している「Website with Facebook Login」と(当たり前だが)同じものでないといけません。
サーバー側
http://example.com/fb-callback.php
FacebookActivity.java
FacebookCallbackTask.java
ブラウザーアプリから、コールバックのインテントを受け取るためにAndroidManifest.xmlにintent-filterを追加
参考記事:
Facebook4JをAndroidアプリ上で動かすサンプルコードを公開しました+α
http://blog.roundrop.jp/show/36
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