这是我在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的Dialog。但它失败并停在 - '正在加载......'屏幕。
它只是呆在那里,甚至没有崩溃。没有日志。过了一会儿,我要么强制关闭它,要么等待它。以前有人遇到过这个问题吗?
更新
我的onActivityResultCode() -
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
mFB.authorizeCallback(requestCode, resultCode, data);
}
答案 0 :(得分:2)
我自己想通了。
当我从WebView的javascript调用Java函数时,该函数在webview的线程中运行。所以让它在UI线程上运行为我修复了一切:)
希望能帮助他人。
以上是我在上述代码中所做的唯一更改。
public class JSInterface {
public Context mContext;
JSInterface(Context c) {
mContext = c;
}
public void authorizeFacebook() {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
authorizeFacebookSSO();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}