coolsharp의 놀이터

뽀치로또 다운로드


신고
Posted by coolsharp Trackback 0 Comment 3

댓글을 달아 주세요

  1.  댓글주소 수정/삭제 댓글쓰기 강삼성 2012.03.07 21:42 신고

    스켄한 로또를 열면 종료됩니다 해결방법 좀 알려주세요.

    •  댓글주소 수정/삭제 Favicon of http://coolsharp.tistory.com coolsharp 2012.03.08 03:20 신고

      안녕하세요? 우선 로또 자동 스캔 앱을 다운로드 받아 주셔서 대단히 감사합니다.
      또한 정상적인 동작을 하지 못함에 죄송합니다.

      로또를 스캔하고 나서 메모리가 적은 폰의 경우 튕기는 현상이 보고 되고 있습니다.

      혹시 사용하시는 폰의 기종을 조심스레 여쭈어도 될런지요?

      아울러 다음 버전에 좀 더 메모리를 적게 사용하게 수정 계획에 있으니 혹시 이번 버전이 정상 작동을 안하더라도 너그러이 봐 주시면 감사하겠습니다.

      최대한 안정적으로 서비스 될 수 있도록 노력하겠습니다.

      감사합니다.

  2.  댓글주소 수정/삭제 댓글쓰기 조익찬 2012.05.24 22:12 신고

    숫자인식을 해보려고 하는 학부생입니다. 어찌 검색하다보니 여기까지 왔네요...
    정보가 너무나도 적습니다.
    무엇을 사용하여 구현하였는지 조그마한 힌트라도 주시면 감사하겠습니다.

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

 

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

 

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

 

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

 

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

 

신고
Posted by coolsharp Trackback 0 Comment 0

댓글을 달아 주세요

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

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

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

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

신고
Posted by coolsharp Trackback 0 Comment 0

댓글을 달아 주세요

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 Trackback 0 Comment 0

댓글을 달아 주세요

 

 

위와 같이 키가 생성 된다.

 

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

 


신고
Posted by coolsharp Trackback 0 Comment 0

댓글을 달아 주세요

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

 

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

 

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

 

https://dev.twitter.com/

 

 

Create an app을 클릭한다.

 

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

신고
Posted by coolsharp Trackback 0 Comment 0

댓글을 달아 주세요

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 Trackback 0 Comment 0

댓글을 달아 주세요

안드로이드에서 문자열을 리소스로 관리하려면 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 Trackback 0 Comment 2

댓글을 달아 주세요

  1.  댓글주소 수정/삭제 댓글쓰기 급한 개발자. 2011.07.03 02:54 신고

    감사합니다. 위의 코드를 너무 유용하게 썼습니다.

  2.  댓글주소 수정/삭제 댓글쓰기 Favicon of http://coolsharp.tistory.com coolsharp 2011.07.05 09:31 신고

    도움이 되셨다니 다행입니다.

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 Trackback 0 Comment 0

댓글을 달아 주세요