これが私のAndroidアプリで欲しいものです。
WebView のボタンで Java のメソッドを呼び出す必要があります。このメソッドは、facebook SDK の authorize() 関数を呼び出し、SSO/Dialog 方式の認証を行う必要があります。WebView で JavaScript メソッドを呼び出すと、アクセス トークンと期限切れトークンが WebView に返されます。
ここに私がすでに作成したものがあります。
アクティビティの onCreate() で、webview を初期化しています。
mFB = new Facebook(APP_ID);
wv = (WebView) findViewById(R.id.web_view);
wv.getSettings().setJavaScriptEnabled(true);
wv.addJavascriptInterface(new JSInterface(this), "JAVA");
wv.loadUrl("file:///android_asset/test.html");
私の資産フォルダのtest.htmlはこれです -
<script type="text/javascript">
function authorizeFacebook() {
JAVA.authorizeFacebook();
}
function showData(token, expire) {
document.getElementById('result').innerHTML = token + " >>>> " + expire;
}
</script>
JS と Java の間のインターフェースは正常に機能しています。私が確信していること。私のJSInterfaceは -
public class JSInterface {
public Context mContext;
JSInterface(Context c) {
mContext = c;
}
public void authorizeFacebook() {
Log.e("FB", "authorizeFacebook() interface called");
authorizeFacebookSSO();
}
}
public void authorizeFacebookSSO() {
mFB.authorize(FBCMTestActivity.this, new DialogListener() {
@Override
public void onFacebookError(FacebookError e) {
Log.e("FBAUTH", "FB failed + " + e.getErrorCode());
Toast.makeText(getApplicationContext(), "FBFAIL:" + e.getMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onError(DialogError e) {
Log.e("FBAUTH", "FB failed + " + e.getMessage());
Toast.makeText(getApplicationContext(), "FBFAIL:" + e.getMessage(), Toast.LENGTH_LONG).show();
}
@Override
public void onComplete(Bundle values) {
Log.e("FBAUTH", "SUCCESS");
Log.e("FBAUTH:", mFB.getAccessToken() + " " + mFB.getAccessExpires());
wv.loadUrl("javascript:showData( '" + mFB.getAccessToken() + "' , '" + mFB.getAccessExpires() + "');");
}
@Override
public void onCancel() {
}
});
}
私がFacebookアプリを持っているとき、これはうまくいきます。
ただし、Facebook アプリがない場合は、理想的には webview でダイアログを表示する必要があります。しかし、それは失敗し、「読み込み中...」画面で停止します。
そこにとどまり、クラッシュすることさえありません。ログはありません。しばらくすると、強制的に閉じるか、待つようになります。以前にこの問題に直面した人はいますか?
アップデート
私の onActivityResultCode() -
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mFB.authorizeCallback(requestCode, resultCode, data);
}