3

私のアプリでは、ユーザーが Facebook アカウントでログインできるようにしたいと考えています。いくつかの検索の後、私はこれを理解することができますが、この方法が最善の方法だとは思いません. UI で webview を使用し、webviewclient を使用して URL の切り替えを感知しました。私が理解しているように、Android では、webviewclient ですべてのリダイレクトを処理する必要があります (Facebook リダイレクト、ユーザーが電子メールとパスワードを設定すると、いくつかのリダイレクトが発生します)。しかし、必要なのは、出力 xml を解析し、出力結果に従って決定を下すことだけです (ホーム アクティビティにリダイレクトするか、失敗するかなど)。これが私のコードです。より適切な方法が存在する場合は、提案をお願いします。

public class FbLoginActivity extends Activity {

    String fbLoginBaseUrl = "{my server url}/facebook/redirector.jsp?";
    private ProgressDialog progressBar; 
    WebView webView;
    int count = 0;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.fb_login);

        fbLoginBaseUrl += "usdId=NoSession:";
        fbLoginBaseUrl += Subroutines.getInstance().getDeviceId() + "_L";

        webView = (WebView) findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        progressBar = ProgressDialog.show(FbLoginActivity.this, "", "Page is loading...");
        webView.setWebViewClient(new HelloWebViewClient());

        webView.loadUrl(fbLoginBaseUrl);

    }

    private class HelloWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            Log.v(Subroutines.TAG, url);
            return true;
        }
        @Override
        public void onPageFinished(WebView view, String url) {
            Log.i(Subroutines.TAG, "Finished loading URL: " +url);

            // if login screen loading finishes, cancel the progressdialog..
            // twice redirecting happens to this sub url..
            String subFace = "m.facebook.com/login.php";
            if(url.indexOf(subFace) != -1 && ++count == 2){
                if (progressBar.isShowing()) {
                    progressBar.cancel();
                }
            }
            // Permission redirecting..
            String loginSub = "www.facebook.com/connect/uiserver.php?method=permissions.request";
            if(url.indexOf(loginSub) != -1){
                progressBar = ProgressDialog.show(FbLoginActivity.this, "", "Logging in...");
            }
            // finally if my server makes a response..
            String sub = "{my server url}/facebook/connect.jsp";
            if(url.indexOf(sub) != -1){
                Log.v(Subroutines.TAG, "my server makes a response..");

                // xml parsing stuff..
                // use url content to parse
            }
        }
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.e(Subroutines.TAG, "Error: " + description);
        }
    }
}
4

2 に答える 2

4

Facebook SDK を入手して、その機能を使用します。

一言で言えば、あなたはこれを行います:

public Facebook facebook = new Facebook("appID");

次に、作成時またはどこでも:

facebook.authorize(this,String[] YourNeededPermissions, new DialogListener() {
        @Override
        public void onComplete(Bundle values) {}

        @Override
        public void onFacebookError(FacebookError error) {}

        @Override
        public void onError(DialogError e) {}

        @Override
        public void onCancel() {}
    });

これはここで確認できます: http://developers.facebook.com/docs/guides/mobile/#android

于 2011-07-20T20:49:06.750 に答える
2

Facebookの登録を自分の登録と統合する際に、実際に同様の問題があります(ただし、私はAndroid開発者ではありません)。ここで Android からの Facebook 登録フローで質問した のですが、webview について知りませんでした。それは良い解決策だと思います。チャットまたは他の方法で連絡できますか?

編集: Facebook はログイン手順を更新しました: https://developers.facebook.com/docs/offline-access-deprecation/ ご覧 のとおり、SSO (またはその他のクライアント トークン) から取得したトークンは、アプリケーション (検証 token-app id-app secret があります)。エンドポイントは現在

https://graph.facebook.com/oauth/access_token?             
client_id=APP_ID&
client_secret=APP_SECRET&
grant_type=fb_exchange_token&
fb_exchange_token=EXISTING_ACCESS_TOKEN 

したがって、Android 用の facebook SDK を使用する場合の手順は次のとおりです。1) ユーザーの署名を取得する 2) サーバーにトークンを送信する 3) サーバーはアプリ ID とアプリ シークレットに対してトークンを検証します 4) 独自のセキュリティ機能を追加します

于 2012-01-17T12:52:06.850 に答える