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 に答える