2012-09-28 46 views
1

我使用下面的代码在我的应用程序中通过Facebook登录。我需要使用Facebook SSO来做到这一点。我有正确的app_id。Facebook SSO不能在android中工作

package com.fb.sso; 

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.net.MalformedURLException; 

import com.facebook.android.AsyncFacebookRunner; 
import com.facebook.android.AsyncFacebookRunner.RequestListener; 
import com.facebook.android.DialogError; 
import com.facebook.android.Facebook; 
import com.facebook.android.Facebook.DialogListener; 
import com.facebook.android.FacebookError; 
import com.facebook.android.Util; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.TextView; 

public class FBSSOActivity extends Activity { 
    /** Called when the activity is first created. */ 


    public static final String APP_ID = "my_app_id"; 

    private static final String[] PERMISSIONS = new String[] { 
      "publish_stream", "read_stream", "offline_access" }; 
    private TextView mText; 
    private Handler mHandler = new Handler(); 

    private Facebook mFacebook; 
    private AsyncFacebookRunner mAsyncRunner; 
    byte[] raw; 
    private SharedPreferences mPrefs; 

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


     if (APP_ID == null) { 
      Util.showAlert(this, "Warning", 
        "Facebook Applicaton ID must be set..."); 
     } 

     // Initialize the content view 
     setContentView(R.layout.main); 

     // Initialize the Facebook session 
     mFacebook = new Facebook(APP_ID); 
     mAsyncRunner = new AsyncFacebookRunner(mFacebook); 

     mPrefs = getPreferences(MODE_PRIVATE); 
     String access_token = mPrefs.getString("access_token", null); 
     long expires = mPrefs.getLong("access_expires", 0); 
     if (access_token != null) { 
      mFacebook.setAccessToken(access_token); 
     } 
     if (expires != 0) { 
      mFacebook.setAccessExpires(expires); 
     } 

    } 

    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Log.d("FB Sample App", "onActivityResult(): " + requestCode); 
     mFacebook.authorizeCallback(requestCode, resultCode, data); 
    } 



    private class LogoutRequestListener implements RequestListener { 

     @Override 
     public void onComplete(String response, Object state) { 
      // TODO Auto-generated method stub 

Log.v("comes here>>.","sucess"); 
      // Only the original owner thread can touch its views 
      FBSSOActivity.this.runOnUiThread(new Runnable() { 
       public void run() { 
        mText.setText("Thanks for using FB Sample App. Bye bye..."); 

       } 
      }); 

      // Dispatch on its own thread 
      mHandler.post(new Runnable() { 
       public void run() { 
       } 
      }); 

     } 

     @Override 
     public void onIOException(IOException e, Object state) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onFileNotFoundException(FileNotFoundException e, 
       Object state) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onMalformedURLException(MalformedURLException e, 
       Object state) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onFacebookError(FacebookError e, Object state) { 
      // TODO Auto-generated method stub 
      Log.v("facebook error","fb error"); 
     } 
      } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.main_menu, menu); 
     return true; 
    } 


    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 

     MenuItem loginItem = menu.findItem(R.id.login); 

     if (mFacebook.isSessionValid()) { 
      loginItem.setTitle("Logout"); 


     } else { 
      loginItem.setTitle("Login"); 


     } 
     loginItem.setEnabled(true); 
     return super.onPrepareOptionsMenu(menu); 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 

     // Login/logout toggle 
     case R.id.login: 

      if (!mFacebook.isSessionValid()) { 

       mFacebook.authorize(this, new DialogListener() { 

        @Override 
        public void onComplete(Bundle values) { 
         // TODO Auto-generated method stub 

         Log.v("Entered ", "No ERRRRRRRRRRRR"); 
         SharedPreferences.Editor editor = mPrefs.edit(); 
         editor.putString("access_token", 
           mFacebook.getAccessToken()); 
         editor.putLong("access_expires", 
           mFacebook.getAccessExpires()); 
         editor.commit(); 
         Intent i=new Intent(FBSSOActivity.this,second.class); 
         startActivity(i); 

        } 

        @Override 
        public void onFacebookError(FacebookError e) { 
         // TODO Auto-generated method stub 

        } 

        @Override 
        public void onError(DialogError e) { 
         // TODO Auto-generated method stub 

        } 

        @Override 
        public void onCancel() { 
         // TODO Auto-generated method stub 

        } 

       }); 
      }else{ 

       mFacebook.setAccessToken(null); 
       mFacebook.setAccessExpires(0); 

       AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(mFacebook); 
       asyncRunner.logout(this.getBaseContext(), new LogoutRequestListener()); 
      } 

      break; 


     default: 
      return false; 

     } 
     return true; 
    } 

    } 

我登录到我的设备中预装的Facebook应用程序。我只有这个屏幕。 enter image description here

而在我的Logcat中,此行出现。

09-28 15:18:24.652: E/ActivityThread(1201): Failed to find provider info for com.facebook.katana.provider.AttributionIdProvider 

如果我从我的预装Facebook应用程序退出,我的应用程序会提示我登录,要求凭据。那时候,空白的屏幕也会出现。但是在预装的Facebook应用程序中,我可以看到我的更新(我已登录)。

更新:

现在我正在检查应用程序。我没有将它发布到市场上。我通过参考这个网站http://sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you/得到了钥匙。我将它添加到应用程序中,就像这样。 enter image description here

更新2: 现在我得到了logcat的这些行:

09-29 12:00:12.552: I/ActivityManager(73): Starting activity: Intent { cmp=com.facebook.katana/.ProxyAuth (has extras) } 
09-29 12:00:13.022: I/ActivityManager(73): Displayed activity com.facebook.katana/.ProxyAuth: 436 ms (total 436 ms) 
09-29 12:00:15.032: W/InputManagerService(73): Starting input on non-focused client [email protected] (uid=10031 pid=2233) 
09-29 12:00:15.032: W/IInputConnectionWrapper(2233): showStatusIcon on inactive InputConnection 
+0

CT hashkey你产生为您的应用正确和工作散列键? –

+0

是的。它工作正常,没有Sso。我需要实现sso。 – Manikandan

+0

尽管您可能已经配置了哈希键,但它可能是错误的。要检查它,请参阅我的这个答案中的第二条评论:http://stackoverflow.com/a/10516629/450534。这是找到正确的哈希键AFAIK的最简单方法。并且大多数搜索结果对于该错误都提示相同的事情。不正确的哈希键。 –

回答

-2

这种情况可能是由于以下原因:

  1. 你没有连接到互联网
  2. 你没有授予Internet访问权限(Manifest.xml)
  3. 您尚未使用过相应的对于应用
  4. 您没有提供正确的应用程序ID