여기서 중요한점은 @Override 를 쓰면 오류난다는 것이다.
왜냐하면 openFileChooser 메소드는 프레임웍에서 @hidden 처리되어있기때문에 sdk 에서 보이지 않기 때문이다.
하여튼 인앱브라우저에서 파일첨부를 하려고하면 저 메소드가 자동으로 호출되게 된다.
우리가 할일은 위 코드처럼 file chooser 를 열어주고 결과를 uploadMsg 로 다시 돌려주면 된다.
코드는 아래와 같다.
private static final int FILECHOOSER_RESULTCODE = 1;
private ValueCallback<Uri> uploadMessage = null;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
android 자동빌드환경을 구성할때 가장 힘들었던것이 emulator 가 켜져있어야만 테스트를 돌릴수 있다는 것이었습니다.
google 에서는 emulator 를 자동으로 켜고 부팅시까지 기다리고 자동으로 꺼주는 스크립트를 지원해주지 않는데 자동으로 빌드하기위해선 이런것들이 꼭 필요하기 때문에 직접 만들어보았습니다.
OS 는 윈도우이고 sdk 버젼은 r16 이고 ant build 환경이 갖추어져있다는 가정하에 이 문서를 작성합니다.
(ant 빌드환경 구성방법은 이전 글을 참조하세요.)
public class HelloActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.textView1); tv.setText(Constants.URL); } }
* 디렉토리 구조 만들기
- config 디렉토리를 생성하고 config_beta.properties,config_real.properties 파일을 만들어서 집어넣습니다.
- 위와같은 형태로 디렉토리 구조를 만듭니다. - config_beta.properties 파일과 config_real.properties 파일에는 beta 와 real 에서 사용될 적절한 환경변수를 집어넣습니다.
위와 같은 xml 을 작성해서 drawable 에 넣어놨다면 안드로이드 전역에서 R.drawable.btn 이라는 리소스를 사용 가능하게 됩니다.
예를들어 이 xml 을 background 로 넣은 view 는 상태가 focused, enabled 혹은 selected 될때 위 xml 에 정의된대로 바뀌게 됩니다.
이 메소드의 파라메터중 convertView 가 재활용과 관련된 파라메터 입니다.
이 convertView 파라메터에서는 재사용할 view 가 없다면 null 을 넘겨주고 있다면 해당 view 를 넘겨줍니다.
이를 이용하여 Holder 패턴을 구현하는데 대부분 아래와 같이 사용합니다.
public class ItemHolder {
public TextView textView = null;
}
public View getView(int position, View convertView, ViewGroup parent) {
ItemHolder holder = null;
if (convertView == null || convertView.getId() != R.layout.list_item) { // 재사용할 view 가 없거나 재사용할 view 가 다른 layout 으로 작성되어졌을경우 xml 새로 파싱합니다.
// convertView 에는 여기서 inflate 한 view 만 넘어오는것이 아닙니다.
// 예를들어 이 listview 에 headerView 가 있다면 headerView 역시 convertView 에 넘어오게 됩니다.
// 이럴경우 원하지 않은 결과가(거의 크래쉬) 나오기때문에 반드시 layout 이 맞는지를 비교해 줘야합니다.
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ItemHolder();
holder.textView = (TextView) convertView.findViewById(R.id.textView1); // 파싱된 결과를 holder 에 담아서 tag 로 저장해둡니다. convertView.setTag(holder);
convertView.setId(R.layout.list_item);
}
else { // 재사용할 view 가 있을경우 해당 view 의 tag 를 가져와서 ItemHolder 로 캐스팅하여 사용합니다.
holder = (ItemHolder) convertView.getTag();
}
// 여기부터는 얻어온 holder 를 이용하여 데이터를 채웁니다. holder.textView.setText(getItem(position).toString());
return convertView;
}
이런 형태를 취하는 이유는 안드로이드에서 시간이 가장 오래걸리는 작업중의 하나가 findViewById 메소드를 이용한 xml 파싱작업 이기 때문에 해당 메소드의 호출을 최소화 하기 위함입니다.
- v2.2 ad - 네트워크 연결 안되어있어도 AI 와 플레이 가능
- 전체적인 반응속도 대폭 개선
- 렌주룰완전 적용
- 서버 안정화
- v2.15 ad - 채팅 기능이 추가되었습니다.
- v2.1 ad
- 흑이 3/3/3,4/4/4 되던거 안되도록 수정
- 게임에 들어가자마자 메뉴 버튼을 누르면 튕기던 버그 수정
- 금수로 승리하면 +1 점 추가됩니다.
- 영어옵션 추가 (번역이 완벽하지 않습니다.)
- 종료예약 추가
- 사운드 추가
- 최근게임리스트 추가
- 노티가 너무 많이나오던거 수정
- v2.0 ad - 흑(선) 플레이시 3*3, 4*4, 6목 모두 안되게 수정
- 룰정보 페이지 추가 (게임룰,금수룰,점수룰 설명)
- 커뮤니케이션용 홈페이지 생성 : http://apps.silpir.net
- 여러 디바이스 대응을 위해서 레이아웃의 크기단위를 dp 로 수정
- 게임랭킹 기존 11개에서 15개 보이도록 수정
- v1.9 ad - 점수 시스템 개선 --> 30일동안 업데이트가 없는 점수데이터는 다른 유저의 점수에 영향을 미치지 않고 삭제됨
- 랭킹화면에서 원하는 유저를 클릭하면 "게임신청" 이 나와서 직접 신청할수 있는 기능
- 흑(선) 플레이시 3*3 룰을 적용받는 기능 ( 단 컴퓨터 "autobot" 은 3/3 적용받지 않음 )
- 현재 기다린 시간 표시해주는 기능
- 웹 클라이언트와 대국시 점수반영안되게 함.
- v1.82 ad
<광고 삽입>
- 사용자가 많아지다보니 서버유지가 힘들어져 서버유지 비용을 벌기위해 광고 삽입
- v1.8 beta
<노티 시스템 업데이트>
- 내가 해야할 차례라면 어플을 꺼놔도 노티가 오게 됩니다. (예를들어 게임대기를 눌러놓고 어플을 꺼놓으면 게임이 시작될때 문자온것과 똑같이 노티로 알려주게 됩니다.)
- 어플을 처음 실행하면 가장최근에 플레이한 게임으로 자동으로 이동시켜주는 기능이 있었는데 이 기능을 빼고 내가 해야할 게임들의 노티를 띄우도록 하였습니다. (여러게임을 동시에 진행하고 있다면 이 기능이 오히려 불편하기 때문입니다.)
<기타 버그수정>
- 노티로 오는 전화번호가 가려지지않고 모두 나오던것 수정
- 노티가 제대로 동작하지 않던것 수정
====== 룰 정보 =======
렌주룰 - LazyOmok 은 렌주룰을 따릅니다.
- 렌주룰은 먼저하는 흑의 유리함을 어느정도 없애기위해 개발된 룰입니다.
- 간단한 룰에대해서는 아래에 정리하였습니다.
- 그 외에 자세한 정보를 원하시면 아래 홈페이지를 이용해 주시기 바랍니다.
- http://www.renjukorea.com
게임룰 승리
- 자신의 돌을 가로,세로 혹은 대각선중의 하나로 5개 연속으로 놓으면 승리하게 됩니다.
- 백은 6개 이상 연속으로 놔도 승리 처리됩니다.
- 게임중 상대 턴인 상태에서 5분이상 기다렸을때 종료하면 승리하게 됩니다.
패배
- 상대가 먼저 승리조건을 만족시키면 패배합니다.
- 게임중 자신의 턴인 상태에서 종료하면 패배합니다.
금수룰 - LazyOmok 에서는 먼저하는 흑의 유리함을 어느정도 없애기 위해서 유저가 흑 플레이시 금수를 적용하고 있습니다.
- LazyOmok 에서 금수는 3*3, 4*4, 6목, 장목 입니다.
- 장목은 돌을 6개 이상 이어나가는것을 말합니다.
- 백과, AI(autobot)는 금수룰을 적용받지 않습니다.
- 만약 이길수 있는 자리에 금수가 겹쳐있다면 금수우선룰에 의해 놓을수 없게 됩니다.
점수룰 - 점수는 승리시 +2 점, 패배시 -2점 입니다.
- 만약 백이 금수로 승리할때에는 승점에 +1 점 추가됩니다.
- 점수는 유저랭킹과 금수승랭킹으로 나뉘어서 저장됩니다.
- 30일동안 점수의 업데이트가 없으면 자동으로 점수데이터가 초기화됩니다.
언젠가 아이폰용 한게임 고스돕을 해본적이 있습니다.
상당한 퀄리티에 잘 만들어져 있었으나 한가지 불편한점이 있었습니다.
바로 게임도중 끊기면 그 판이 날라간다는 것이지요.
이런 상황이 발생하면 폰 탓만 했는데 그게 아니라는 생각이 들었습니다.
아무리 현재 3G 가 좋아졌고 곳곳에 와이파이 존이 있다고 하지만
여러가지 다른 환경적인 요인에 의해서 순간적으로 네트웍이 끊기는 상황은 자주 나타나고 있습니다.
이러한 상황에서 끊김없는PC 에서 하던것과 똑같이 온라인게임을 만들면,
위와 같이 해당 게임이 날라가는 상황을 피할수 없게 됩니다.
그래서 좀 더 모바일 환경에 맞는 Online게임을 만들수 없을까?
라는 생각에서 나온것이 바로 “Lazy 오목 Online!” 입니다.
이 게임은 모바일에서 메시지 주고받듯이 게임을 진행할 수 있습니다.
예를들면 게임을 시작하고 자신의 차례가 되면 아래와 같은 노티가 오게됩니다.
해당 노티를 터치하면 바로 해당 게임으로 넘어가게 되고 플레이를 계속할 수 있게 됩니다.
(단 이러한 노티는 게임을 Home 키를 눌러서 백그라운드 상태로 돌려놨을때만 동작합니다. 즉 현재 게임화면을 보고있으면 노티가 오지 않습니다.)
또한 이 게임은 시간제한이 없습니다.
PC 에서처럼 모바일 환경은 언제나 게임에 집중할 수 없기 때문에 시간제한을 없앴습니다.
대신 누구나 종료할수 있도록 만들었습니다.
이렇게 시간제한 없이 게으른 플레이를 할 수 있다고 하여서 이름도 “Lazy” 입니다.^^
RECENT COMMENT