'프로그래밍/Facebook API'에 해당되는 글 2건

  1. 2013.07.25 페이스북 설정 방법 keystore
  2. 2013.06.23 Facebook Login Flow for Android
2013.07.25 23:14

2011년 6월 15일 수요일

안드로이드 페이스북(facebook) 연동 #1

안드로이드에서 페이스북을 연계하여 글 작성하는 방법에 대해 정리하였습니다.

1. 페이스북 계정 생성및 앱아이디 얻기
2. 해시키 생성하기
3. 샘플 예제 설치하기
4. 샘플 예제 변경하여 포스트 하기

먼저 페이스북 연계방식은 OAuth 방식입니다.
트위터는 XAuth 방식을 지원하여 로그인 창을 앱마다 꾸밀수가 있는데 페이스북은 OAuth방식만 지원되기 때문에 웹뷰로 페이스북에서 서비스하고 있는 로그인창에서 로그인을 해야 됩니다.
폰에 facebook 기본 어플이 있다면 SSO를 지원하기 때문에 별도의 로그인창없이 버튼하나로 연계가 가능합니다.

1. 페이스북 계정 생성및 앱아이디 얻기

 - facebook.com 으로 접속하여 계정을 생성합니다.

 - 로그인 하고 맨아래에 '개발자' 링크를 클릭합니다.

 - 맨위 탭에 '내앱'을 클릭합니다.

 - 좌측 상단의 새 앱만들기 버튼을 클릭하여 앱을 만들면 앱ID가 생성됩니다.
   * 어플에 페이스북을 연계하기 위해서 앱에 이 앱ID를 넣어 줘야 합니다.

 - 오른쪽에 '설정관리'를 클릭하고 들어갑니다.
 - 좌측메뉴에 '모바일 및 기타 기기' 를 클릭하면 맨아래 안드로이드 해시키를 넣어주는 부분이 있습니다. 
 위에 설정하였던 SSO 기능을 사용하려면 해시키를 생성하여 여기에 넣어주고 저장하면 됩니다. 
 SSO기능을 사용하지 않으려면 비워두어도 됩니다.

2. 해시키 생성하기

 - http://developers.facebook.com/  페이스북 개발자 페이지의 왼쪽메뉴에서 '모바일앱' 을 클릭합니다.

- 중간에 Android 개발 정보에 보면 해시키 생성 방법이 있습니다.

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore 
| openssl sha1 -binary
| openssl base64

 위 명령어를 보면 keytool과 openssl 이 있습니다.
 keytool은 jre의 bin폴더에 있고 openssl은 따로 설치를 해줘야 합니다.

 * openssl 설치
 http://gnuwin32.sourceforge.net/packages/openssl.htm 접속합니다.
Complete package, except sources 를 다운받아 설치합니다.

위 명령어를 실행하기위해 path 에 jre 의 bin폴더와 openssl 설치한 bin폴더를 넣어 줍니다.

 - 위 명령어를 보면 -keystore ~/.android/debug.keystore 부분이 나옵니다.
  어플 개발 완료후 생성할 키 값입니다.
  앞의 androiddebugkey 은 별칭이고 ~/.android/debug.keystore 는 경로입니다.
  윈도우로 개발하면 ~/.android/debug.keystore -> C:\android\keysotre 이런식으로 됩니다.
  위 값을 잘못넣어줘도 해시키가 생성이 되니 정확히 넣어줘야 올바른 해시키가 생성이 됩니다. 몇번 잘못 넣어줘서 굉장히 고생한 부분입니다.  연계를 안하려고 까지 하다가 에러 부분을 찾았습니다. --;;
 - 생성한 해쉬키값을 위의 페이스북 페이지에 넣어주고 저장합니다.


3. 샘플 예제 설치하기는 다음 포스트로~

댓글 6개:

  1. 안녕하세요. 블로그 잘 보았습니다.

    근데 해시값이 문젠지 모르겠는데요..

    한번 로그인 후 로그인 버튼 창 아래에 Login Failed: invalid_key 라고 뜨는 데요...
    해시값 생성 할때

    keytool -exportcert -alias androiddebugkey -keystore C:\android\keystore
    | openssl sha1 -binary
    | openssl base64

    이런 식으로 등록 했는데.. 이거 때문에 문제가 있는건가요??

    답글
  2. 제가 블로그에 조금 햇갈리게 적어놓았네요. ;;
    C:\android\keystore 는 폴더를 넣은신것 같습니다.
    파일 이름까지 넣으셔야 되고 올바로 넣으셨다면 비밀번호를 다시 물어봅니다. 
    이렇게 하시면 잘 되실꺼에요^^

    답글
  3. 안녕하세요.. 답글 보고 수정하여...

    해시값 생성하는 걸 

    keytool -exportcert -alias androiddebugkey -keystore C:\Documents and Settings\Administrator\.android\debug.keystore
    | openssl sha1 -binary
    | openssl base64

    이런식으로 했는데도.. 아닌거 같은데요.. keystore 경로를 잡아 주라는 뜻이 아니였나요????

    답글
  4. 안녕하세요. keystore경로에 공백이 들어가 있으면 안됩니다.
    따움표로 묶어서 넣어주세요^^
    "C:\Do~~" 이런식으로요~

    답글
  5. 안녕하세요 해시키 구하는 방법에서요

    "C:\program Files\android\debug.keystore" 이렇게
    해주었는데... 파일이 없다고 나오는데
    android 폴더가보니깐 

    android-sdk 이 폴더만 있는데.. debug.keystore라는건 없네요.. 
    그래서 폴더를 debug.keytore 이 이름으로 만들고 실행하니깐 폴더가 있지만 비어있다고 나오는데 

    어떻게 해야하나요 ㅠ

    답글
  6. 안녕하세요.
    윗분의 debug.keystore 는 마켓에 앱등록시 필요한 keystore 파일입니다.
    먼저 저 키 파일을 생성후 그 파일의 경로를 적어주셔야 합니다.


신고

'프로그래밍 > Facebook API' 카테고리의 다른 글

페이스북 설정 방법 keystore  (0) 2013.07.25
Facebook Login Flow for Android  (0) 2013.06.23
Posted by hoonihoon85 hoonihoon
2013.06.23 21:48

https://developers.facebook.com/docs/howtos/androidsdk/3.0/login-with-facebook/


perfect code 


I'm trying Facebook Android SDK 3.0 tutorial but I'm facing a problem. When I clicked the login button and logged in using my facebook account, im expecting to see my button's text to change to logout as what the tutorial (http://developers.facebook.com/docs/howtos/androidsdk/3.0/login-with-facebook/) states but it did not happen. I added log to see if it passes by onActivityResult as suggested by thisquestion. Here's my log:

MainFragment   Unknown State: OPENING
MainFragment   onActivityResult
MainFragment   Logged out...

Please help. I don't know where did I get wrong and what to do next?

MainFragment.java

public class MainFragment extends Fragment{

    private static final String TAG = "MainFragment";
    private UiLifecycleHelper uiHelper;
    private Session.StatusCallback callback = new Session.StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
            onSessionStateChange(session, state, exception);
        }
    };

    private void onSessionStateChange(Session session, SessionState state, Exception exception) {
        if (state.isOpened()) {
            Log.i(TAG, "Logged in...");
        } else if (state.isClosed()) {
            Log.i(TAG, "Logged out...");     
        } else {
            Log.d(TAG, "Unknown state: " + state);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        uiHelper = new UiLifecycleHelper(getActivity(), callback);
        uiHelper.onCreate(savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();

        // For scenarios where the main activity is launched and user
        // session is not null, the session state change notification
        // may not be triggered. Trigger it if it's open/closed.
        Session session = Session.getActiveSession();
        if (session != null && (session.isOpened() || session.isClosed()) ) {
            onSessionStateChange(session, session.getState(), null);
        }

        uiHelper.onResume();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        uiHelper.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG, "onActivityResult");
    }

    @Override
    public void onPause() {
        super.onPause();
        uiHelper.onPause();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        uiHelper.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        uiHelper.onSaveInstanceState(outState);
    }   

    @Override
    public View onCreateView(LayoutInflater inflater,
            ViewGroup container, 
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.main, container, false);      

        LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
        authButton.setFragment(this);    

        return view;
    }
}

MainActivity.java

public class MainActivity extends FragmentActivity {

    private MainFragment mainFragment;
    private static final String TAG = "MainActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            // Add the fragment on initial activity setup
            mainFragment = new MainFragment();
            getSupportFragmentManager()
            .beginTransaction()
            .add(android.R.id.content, mainFragment)
            .commit();
        } else {
            // Or set the fragment from restored state info
            mainFragment = (MainFragment) getSupportFragmentManager()
            .findFragmentById(android.R.id.content);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.facebook.widget.LoginButton
        android:id="@+id/authButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
    />

</LinearLayout>


신고

'프로그래밍 > Facebook API' 카테고리의 다른 글

페이스북 설정 방법 keystore  (0) 2013.07.25
Facebook Login Flow for Android  (0) 2013.06.23
Posted by hoonihoon85 hoonihoon