coolsharp의 놀이터

Posted by coolsharp

오늘부터 Cocos2d로 슈팅 게임 만들기 강좌에 들어간다.

 

실제가 필자가 Cocos2d로 기본 슈팅 게임을 만드는데 걸린 시간은 5일이 걸리지 않았다.

 

그만큼 Cocos2d는 잘 구성된 라이브러리이며 기능 또한 막강하여 단시일 내 퀄리티 있는 게임 개발이 가능하다.

 

Cocos2d 간결하고 편리한 라이브러리의 재미에 흠뻑 취해보자.

 

현재 다른 프로젝트 중이므로 틈틈히 시간을 내여 기 개발된 게임 소스를 가지고 포스팅을 이어가겠다.

 

Posted by coolsharp

PIN 코드를 입력하지 않기 위해서 콜백 URL을 트위터 설정에서 꼭 해야 한다.

URL은 어떤 것이든 관계 없다.

트위터를 연동하기 위해서 http://twitter4j.org/en/index.html 라이브러리를 써야 한다.

twitter4j-android-2.2.6-SNAPSHOT.zip(slimmed version for Android platform)

Posted by coolsharp

package com.coolsharp.test;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.List;

import twitter4j.Paging;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

/**
* @author coolsharp
*
*/
public class TwitterApp extends Activity {

    /**
     * Twitter instance object
     */
    private Twitter twitter;
    private AccessToken acToken = null;
    private RequestToken rqToken = null;
    private Status status = null;

    private static final String CONSUMER_KEY = "트위터에서 받아온 컨슈머 키";
    private static final String CONSUMER_SECRET = "트위터에서 받아온 컨슈머 비밀 키";
    private static final String S_CONSUMER_KEY = "CONSUMER_KEY";
    private static final String S_CONSUMER_SECRET = "CONSUMER_SECRET";
    public static Uri CALLBACK_URL = Uri.parse("wefu://twitter");

    /** 생성. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 트위터 인스턴스 얻기
        twitter = new TwitterFactory().getInstance();
        // 컨슈머 키 대입
        twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        // 버튼 리스너 등록
        Button btn = (Button) findViewById(R.id.btnAuthorize);
        btn.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
                try {
                    getToken();
                    if (null != acToken) getList();
                } catch (TwitterException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } // 토큰 발행
            }
        });
    }
    /**
     * 토큰 얻기
     * @return
     * @throws TwitterException
     */
    private boolean getToken() throws TwitterException {
        boolean res = false;
        // 토큰이 발행 되지 않았으면
        if (null == acToken) {
            // 최근 사용한 토큰 읽기
            String key = loadData(S_CONSUMER_KEY);
            String value = loadData(S_CONSUMER_SECRET);
            // 토큰 값이 모두 있으면
            if ((!key.equals("")) && (!value.equals(""))) {
                // 기존 토큰 값으로 토큰 발행
                acToken = new AccessToken(key, value);
                twitter.setOAuthAccessToken(acToken);
                res = true;
            }
            else {
                // 인증 시작
                startAuth();
            }
        } else {
        }
        if (null != acToken) {
            // 트위터 글쓰기
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            status = twitter.updateStatus("" + dateFormat.format(new Date(System.currentTimeMillis())).toString());
        }
        return res;
    }
    /**
     * 인증 시작
     * @throws TwitterException
     */
    private void startAuth() throws TwitterException {
        rqToken = twitter.getOAuthRequestToken(CALLBACK_URL.toString());
        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(rqToken.getAuthorizationURL())));
    }
    /**
     * @throws TwitterException
     */
    private void getList() throws TwitterException {
        List<Status> statuses;
        Paging page = new Paging();
        page.count(20);
        page.setPage(1);
        statuses = twitter.getHomeTimeline(page);
        for (Status status : statuses) {
            Log.i("coolsharp", status.getText());
        }
    }
    /**
     * 스트링 데이터 저장하기
     * @param Key
     * @param Data
     * @return
     */
    private boolean saveData(String Key, String Data) {
        SharedPreferences prefs = getSharedPreferences("coolsharp", MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(Key, Data);
        return editor.commit();
    }
    /**
     * 스트링 데이터 불러오기
     * @param Key
     * @return
     */
    private String loadData(String Key) {
        SharedPreferences prefs = getSharedPreferences("coolsharp", MODE_PRIVATE);
        return prefs.getString(Key, "");
    }

    /* (non-Javadoc)
     * 인텐트 생성
     * @see android.app.Activity#onNewIntent(android.content.Intent)
     */
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Uri uri = intent.getData();
        if (uri != null && CALLBACK_URL.getScheme().equals(uri.getScheme())) {
            String oauth_verifier = uri.getQueryParameter("oauth_verifier");
            try {
                acToken = twitter.getOAuthAccessToken(rqToken, oauth_verifier);
                saveData(S_CONSUMER_KEY, acToken.getToken());
                saveData(S_CONSUMER_SECRET, acToken.getTokenSecret());
            } catch (TwitterException e) {
                Log.e("coolsharp", e.getMessage());
            }
        }
    }
}


Posted by coolsharp

 

 

위와 같이 키가 생성 된다.

 

위의 키를 가지고 연동 작업을 진행 할 수 있다.

 


Posted by coolsharp

페이스북부터 연동하려 하였으나 페이스북 계정이 생성 후 별로 사용치 않은 관계로 앱 등록이 불가능했다.

 

때문에 우선 트위터로 안드로이드 연동부터 공부 후 페이스북은 추후 연동하도록 하겠다.

 

트위터 개발자 등록 사이트는 다음과 같다.

 

https://dev.twitter.com/

 

 

Create an app을 클릭한다.

 

Name, Descriptoion, Web Site를 입력 후 생성한다.

Posted by coolsharp

Android Facebook 연동

2011. 10. 27. 14:50 : 개발

오늘부터 안드로이드에 facebook을 연동하는 방법을 모색한다.

 

그 과정에 대한 일종의 기록을 다음과 같이 기록한다.

 

다음 사이트에 안드로이드 튜토리얼이 있다.

 

http://developers.facebook.com/docs/mobile/android/build/

 

다음 페이지에 가서 새로운 앱을 등록하자.

 

create a new app on Facebook

 

허용여부를 묻는 화면에서 허용을 버튼을 클릭하자.

 

다음과 같은 화면이 나온다.

 

새 앱 만들기를 클릭하자.

 

 

App Display Name은 사용자에게 보여질 어플리케이션 이름이다.

 

App Namespace는 Open Graphic과 Canvas Page를 위한 개발 어플을 위한 네임스페이스이다.

 

계속하기를 클릭하면

 

 

자동 가입을 막기 위한 문자 입력 단계가 있다.

 

글을 입력하고 확인을 클릭한다.

 


가짜 아이디로 오해 받는 듯…

 

이렇게 좌절… 쩝

 

우선 테스트 계정으로 라도 연동해 봐야겠다.

 

http://developers.facebook.com/docs/test_users/

Posted by coolsharp
안드로이드에서 문자열을 리소스로 관리하려면 res/value/string.xml에 문자열을 입력하면 됩니다.

하지만 이 xml에는 단일 문자열 및 특수기호가 포함되지 않은 문자열을 추가할 수 없습니다.

XML 문법의 규칙에 <.>등의 문자는 바로 적용을 할 수가 없기 때문이죠.

하지만 불가능 한 것은 아닙니다. 특수문자를 처리할 수 있는 다른 방법으로 대입을 할 수가 있죠.

예를 들어 &lt;&rt;등으로 표현 할 수 있습니다.

하지만 이렇게 문자열을 관리하면 직관적이지도 않을 뿐더러 관리에 어려움이 많습니다.

XML문법에는 CDATA라는 문법이 있습니다.

CDATA 섹션안에 문자를 집어 넣으면 어떤 문자라도 표현이 가능 합니다.

즉, 특수 문자등을 표현하려면 CDATA를 이용하여 표현 할 수 있는 것이죠.

<![CDATA[
특수문자$%#^&$%*%^*$%^*^&$#%^#$@#$%@<>><><><>
줄넘김도 가능
]]>


이렇게 처리된 문자는 모두 그대로 XML에 담을 수 있습니다.

자 대충 이런것이 있으니 써먹어야겠죠?

어떻게 써먹어야 할까요?

안드로이드 프로그래밍을 하다보면 문자열을 담아두어야 할 필요가 있을 것 입니다.

예를 들어, 웹페이지의 기본 태그 정보등을 문자열 리소스로 담아 두는 것이 그 한 예가 될 수 있겠네요.

다음과 같은 문자열이 있다고 합시다.

        String msg = "이런들 어떠하며 저런들 어떠하리.";
        msg += "만수산 드렁칡이 얽혀진들 그 어떠하리";
        :
        msg += "";


안드로이드에서 문자열 소스 코드에 담아 유지하면 소스가 길어질 뿐 아니라 유지보수에도 어려움이 있습니다.

그런 코드를 다음과 같이 xml을 만들어 관리를 합니다.

1. 우선 res폴더 및에 xml이라는 폴더를 만듭니다.

2. xml 폴더 및에 stringresoure.xml이라는 xml 파일을 만듭니다.

xml에 다음과 같이 입력합니다.

<?xml version="1.0" encoding="utf-8"?>
<coolsharp>
<Data>
<![CDATA[
이런들 어떠하며 저런들 어떠하리.
만수산 드렁칡이 얽혀진들 그 어떠하리
(중략)
]]>
</Data>
</coolsharp>

해당 xml을 어떻게 리소스에서 가져오는지 다음 코드를 참고하세요.

import java.io.IOException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.content.Context;
import android.content.res.XmlResourceParser;
import enspert.com.ips.phonemanager.R;

public class XMLManager {
    public String getXMLData(Context AContext, String AName) {
        XmlResourceParser parser = AContext.getResources().getXml(
                R.xml.template); // 리소스에 XML 데이터를 추가함 (res.폴더.xml파일)

        try {
            int eventType = parser.getEventType();

            while (eventType != XmlPullParser.END_DOCUMENT) {
                String name = null;

                switch (eventType) {
                case XmlPullParser.START_TAG:
                    name = parser.getName().toLowerCase();

                    if (name.equals(AName)) { // 이름이 같은 XML을 찾으면
                        // Attribute를 찾을때는 아래 코드 이용
                        // for (int i = 0;i < parser.getAttributeCount();i++) {
                        // String attribute =
                        // parser.getAttributeName(i).toLowerCase();
                        // if (attribute.equals("myattribute")) {
                        // String value = parser.getAttributeValue(i);
                        // return value;
                        // }
                        // }
                    }
                case XmlPullParser.CDSECT:
                    name = parser.getName();
                    if (name.equals(AName)) { // 이름이 같은 XML을 찾으면
                        parser.nextToken();
                        return parser.getText();
                    }
                case XmlPullParser.END_TAG:
                    name = parser.getName();
                    break;
                }

                eventType = parser.next();
            }
        } catch (XmlPullParserException e) {
            throw new RuntimeException("Cannot parse XML");
        } catch (IOException e) {
            throw new RuntimeException("Cannot parse XML");
        } finally {
            parser.close();
        }
        return "";
    }
}

이제 어떻게 사용하는지 봅시다.

XMLManager xml = new XMLManage();
xml.getXMLData( context, "Data");

다음과 같은 두 줄로 해당 문자열을 확인할 수 있습니다.

Posted by coolsharp

private void ExternalStorageCheck() {

        String state = Environment.getExternalStorageState();

 

        if (Environment.MEDIA_MOUNTED.equals(state)) {

            // We can read and write the media

            Log.i( "coolsharp", "마운트 되어 있고 쓰기도 가능함");

        } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {

            // We can only read the media

            Log.i( "coolsharp", "마운트 되어 있지만 읽기 전용");

        } else {

            // Something else is wrong. It may be one of many other states, but all we need

            //  to know is we can neither read nor write

            Log.i( "coolsharp", "마운트 되어 있지 않음");

        }

    }

Posted by coolsharp