2011-07-20 11 views
3

私のアプリでは、ユーザーが自分のFacebookアカウントでログインできるようにしたいと考えています。いくつかの検索の後、私はこの方法が最良の方法だとは思わないが、これを理解することができる。私は自分のUIでwebviewを使い、URL切り替えを検知するwebviewclientを使いました。私が理解しているように、Androidでは、私は自分のwebviewclientのリダイレクトをすべて処理する必要があります(Facebookのリダイレクト、ユーザーが自分のメールアドレスとパスワードを設定するといくつかのリダイレクトが発生します)。しかし、私が必要とするのは、私の出力xmlを解析し、出力結果(私の家の活動や失敗などにリダイレクト)に応じて決定することです。ここに私のコードは、より適切な方法が存在する場合は、あなたの提案を与えてください。Android Webview Facebook Login

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

私は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() {} 
    }); 

あなたをこれを見ることができますhere: http://developers.facebook.com/docs/guides/mobile/#android

+0

また、[ここ](https://github.com/facebook/facebook-android-sdk/blob/master/examples/simple/src/ com/facebook/android/SessionStore.java)では、簡単にFacebookのセッションを保存できます。あなたはfacebook.authorizeの前に 'SessionStore.restore(facebook、this)'をチェックすることができます。もしfalseであればログインが促されます) – IamAlexAlright

+0

ありがとう、これは良い方法ですが、私のサーバーはFacebookの承認を処理します。 Facebookのログイン後、私のサーバーはセッションIDを返し、私はこのIDとデバイスIDをセキュリティと他の重要なもののために組み合わせて使用​​しました。 – barisatbas

2

私は実際にfacebook登録を自分のものと統合する際に同様の問題を抱えています(しかし私はAndroid開発者ではありません)。 私はここで質問したFacebook registration flow from Android しかし、私はwebviewについて知りませんでした。それは良い解決策のようです、私はチャットや他の手段であなたに連絡することはできますか?

EDIT: Facebookはちょうど彼らのログイン手順更新:あなたが見ることができるように、今、あなたはSSO(または他のクライアントトークン)から入手トークンは、あなたのアプリケーションにリンクされている(検証トークンアプリがある https://developers.facebook.com/docs/offline-access-deprecation/ をid-appシークレット)。 エンドポイントは、だから、手順があるアンドロイドのためのFacebookのSDKを使用して、今

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 

です:ユーザーが 2に署名します) 1)サーバー 3にトークンを送信)サーバーは、そのアプリに対してトークンを検証しますIDとアプリの秘密 4)独自のセキュリティ機能を追加