2

这是我在我的 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);
    }
4

1 回答 1

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();
                    }
                }
            });           
    }
}
于 2012-06-27T13:32:14.737 回答