2012-09-28 8 views
1

다음 코드를 사용하여 내 앱에서 Facebook을 통해 로그인했습니다. Facebook SSO로이 작업을 수행해야합니다. 정확한 app_id가 있습니다.Facebook SSO가 안드로이드에서 작동하지 않습니다.

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

그리고 내 로그캣에이 줄이 나타납니다.

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/. 그리고 저는 이것을 앱에 추가했습니다. 업데이트 2 enter image description here

: 다음과 같은 이유로

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. 당신 인터넷 액세스 (Manifest.xml)에 대한 허가를받지 않았습니다.
    3. 당신은 a를 사용하지 않았습니다. 당신은 올바른 앱 ID
    관련 문제