2011-07-20 176 views
3

在我的應用程序中,我想讓用戶能夠使用他們的Facebook帳戶登錄。經過一番搜索之後,我能夠弄清楚這一點,但我認爲這種方式並不是最好的方法。我在我的用戶界面中使用了一個webview,並使用了一個webviewclient來感知URL切換。據我所知,在Android上,我必須處理我的webviewclient中的所有重定向(Facebook重定向,當用戶設置他/她的電子郵件和密碼時發生多個重定向)。但我需要的是解析我的輸出XML並根據輸出結果做出決定(重定向到我的家庭活動或失敗等)。這是我的代碼,如果存在更合適的方法,請給出您的建議。Android Webview Facebook登錄

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)'(如果它是真的,用戶已經登錄,假授權會提示他們登錄) – IamAlexAlright

+0

謝謝,這是一個好方法,但是我的服務器處理Facebook授權。在facebook登錄後,我的服務器返回一個會話ID,並且我將這個ID和設備ID結合起來用於安全性和其他重要的事情。 – barisatbas

2

我實際上在將Facebook註冊與我自己的(但我不是Android開發人員)集成中存在類似的問題。 我在這裏問了這個問題Facebook registration flow from Android 但我不知道webview。這似乎是一個很好的解決方案,我可以通過聊天或其他方式與您聯繫嗎?

編輯: 的Facebook剛剛更新了自己的登錄過程: https://developers.facebook.com/docs/offline-access-deprecation/ 你可以看到,現在你從SSO(或任何其他客戶端令牌)獲得令牌只鏈接到你的應用程序(有一個驗證令牌應用id-app祕密)。現在 端點是

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 

所以使用Facebook SDK爲Android的步驟是: 1)獲取用戶簽約 2)發送令牌服務器 3)服務器將驗證針對其應用令牌身份證和應用程序的祕密 4)添加您自己的安全功能