728x90

 

팝업창 스크롤바 자동 생성

<html>
<head>
  <title></title>
  <script type='text/javascript'>
    window.onload = function(){
     if((parseInt(document.getElementById('body').offsetHeight)
        - parseInt(window.document.body.clientHeight)) > 20) {
        window.document.body.scroll = "auto";
        window.resizeBy(18,0);
      }
    }
  </script>
</head>
<body>
  <div id='body'>
    팝업 내용
  </div>
</body>
</html>

부모창에서 팝업창을 띄울시 스크롤바 옵션 scrollbars=no 일때 팝업창의 내용이 길어질 경우 스크롤바롤 생성해주는 스크립트이다.

참고로, 이 스크립트는 세로길이에 대한 스크롤바만 생성하도록 한 것이다.

페이지가 로드되면 div 의 세로 길이와 창의 크기를 측정하여 20px 이상일 경우 스크롤바를 생성 이때 가로 길이 18px(스크롤바 사이즈)을 넓여 준다.

 

728x90
728x90

익스플로러 5.5 이후 부터는 스크립트로 server1.abc.com 과 live.abc.com 간의 상호 도메인이 다른 프레임이나 윈도우의 document에 관련된 작업을 시도하면 보안에러가 발생한다.

Cross-site Scripting 에 대한 MS의 말.. How Cross-site Scripting Attacks Work

파이어폭스 같은 경우에는 스크립트(Signed scripts)에서 브라우져자체에 포함(?)된 클래스(netscape.security.PrivilegeManager)를 호출하여 이를 해결할 수 있다고 한다.

Signed Scripts 에 대한 Mozilla의 말.. Signed Scripts in Mozilla

그럼에도 불구하고 다른 도메인에 대한 opener 나 parent 접근이 필요할 경우에는 JavaScript 를 통해 document.domain 을 설정해 주면된다.

<script language="javascript">
    document.domain = "공통도메인명";
</script>

상호 연결 시켜야 하는 웹 페이지에 자신들의 공통된 도메인을 지정해 주면 컨트롤이 가능해진다.

만약, server1.abc.com의 open.htm이 window.open 으로 live.abc.com을 호출하고 live.abc.com 의 child.htm이 opener 로 server1.abc.com 을 접근해야 한다면, 다음 스크립트를 두 페이지에 정의해 주면 되고, 스크립트는 페이지 어디에 위치해 있든지 특별히 상관은 없다.

<script language="javascript">
    document.domain = "abc.com";
</script>

※ 주의, 도메인 명을 잘못 입력한 경우에는 "잘못된 인수입니다." 라는 JavaScript 오류가 발생한다.

cross frame scripting 을 해결하는 다른 방법으로는 HTA가 있다.

html페이지가 아닌 hta(html application)페이지를 만들어야 한다.

 

※ 다음은 HTA에서 javascript로 iframe의 document를 참조한 예

(확장자를 hta로 저장하시고 브라우저로 실행)

<html>
    <head>
        <title>hta cross scripting</title>
        <script>
            function window.onload(){
                alert(myframe.document);
            }
        </script>
    </head>
    <body scroll="no">
        <iframe id="myframe" src="http://kin.naver.com/"></iframe>
    </body>
</html>

 

다음에, 예를 하나 들면..

kin.naver.com을 iframe에 넣고 검색어에 "스크립트"라는 단어를 넣은 후 검색버튼을 누르게 한 HTA소스이다.

<html>
    <head>
        <title>hta cross scripting</title>
        <script>
            function window.onload(){
                myframe.document.search.query.value="스크립트";
                myframe.check_query();
            }
        </script>
    </head>
    <body scroll="no">
        <iframe id="myframe" src="http://kin.naver.com/" width="100%" height="100%"></iframe>
    </body>
</html>
728x90
728x90

엔터프라이즈 관리자의 master 데이터베이스의 저장 프로시저 및 확장 저장 프로시저 폴더에서 ‘sp_’ 또는 ‘xp_’로 시작되는 수많은 시스템 저장 프로시저들을 확인할 수 있다. 시스템 저장 프로시저들은 다음과 같이 분류할 수 있다(분류명 뒤에 ‘프로시저’가 생략되어 있음).
∙ Active Directory, 카탈로그, 커서, 데이터베이스 유지 관리 계획, 분산 쿼리, 전체 텍스트 검색, 로그 전달, OLE 자동화, 복제, 보안, SQL 메일, SQL 프로필러, SQL Server 에이전트, 시스템, 웹 길잡이, XML, 일반 확장
이 중에서 가장 많이 사용하는 것이 시스템 프로시저(끝에서 네 번째)다. 이 시스템 프로시저들을 많이 알아두면 데이터베이스 구축, 시스템 관리 및 운영에 큰 도움이 된다.
지금부터 중요한 시스템 프로시저들의 구문과 간단한 설명 및 예제를 알아보기로 한다. 자세한 사항은 SQL 서버 온라인 설명서를 참고하기 바란다.


■ sp_addextendedproc

새 확장 저장 프로시저의 이름을 등록한다. 구문은 다음과 같다.

sp_addextendedproc [ @functname = ] 'procedure' , [ @dllname = ] 'dll'

다음은 xp_hello 확장 저장 프로시저를 추가하는 예제다.

USE master
EXEC sp_addextendedproc xp_hello, 'xp_hello.dll'


■ sp_addmessage

sysmessages 테이블에 새 오류 메시지를 추가한다. 구문은 다음과 같다.

sp_addmessage [ @msgnum =] msg_id , [ @severity = ] severity , [ @msgtext = ] 'msg'
  [, [@lang = ] 'language' ] [, [@with_log=] 'with_log'] [, [@replace = ] 'replace']

다음은 영어(미국)로 된 메시지를 먼저 추가한 다음, 동일한 메시지를 한국어로 추가하는 예제다.

USE master
exec sp_addmessage 50002, 16, '%d rows are in table %s', us_english, 'true', replace
exec sp_addmessage 50002, 16, '%2!의 행 개수는 %1!다.', default, 'true', replace


■ sp_addtype

사용자 정의 데이터 형식을 작성한다. 구문은 다음과 같다.

sp_addtype [ @typename = ] type,
     [ @phystype = ] system_data_type
     [ , [ @nulltype = ] 'null_type' ]
     [ , [ @owner = ] 'owner_name' ]

다음은 SQL 서버가 제공하는 varchar 데이터 형식에 기반을 둔 ssn(사회 보장 번호)이라는 사용자 정의 데이터 형식을 작성하는 예제다. ssn 데이터 형식은 11 자리수인 사회 보장 번호(999-99-9999)를 가지는 열에 사용된다. 이 열은 NULL이 될 수 없다. varchar(11)은 문장 부호(괄호)를 포함하고 있으므로 앞뒤로 작은 따옴표를 사용해야 한다.

USE master
EXEC sp_addtype ssn, 'VARCHAR(11)', 'NOT NULL'


■ sp_addumpdevice

SQL 서버에 백업 장치를 추가한다. 구문은 다음과 같다.

sp_addumpdevice [ @devtype = ] 'device_type' ,
     [ @logicalname = ] 'logical_name' ,
     [ @physicalname = ] 'physical_name'
     [ , { [ @cntrltype = ] controller_type
             | [ @devstatus = ] 'device_status'
        }
    ]

다음은 C:\Dump\Dump1.bak이라는 물리적 이름으로 MYDISKDUMP라는 디스크 백업 장치를 추가하는 예제다.

USE master
EXEC sp_addumpdevice 'disk', 'mydiskdump', 'c:\dump\dump1.bak'


■ sp_attach_db

서버에 데이터베이스를 첨부한다. 구문은 다음과 같다.

sp_attach_db [ @dbname = ] 'dbname' , [ @filename1 = ] 'filename_n' [ ,...16 ]

다음은 현재 서버에 pubs 데이터베이스로 두 파일을 첨부하는 예제다.

EXEC sp_attach_db @dbname = N'pubs',
   @filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',
   @filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs_log.ldf'


■ sp_bindefault

열 또는 사용자 정의 데이터 형식에 기본값을 바인딩한다. 구문은 다음과 같다.

sp_bindefault [ @defname = ] 'default' ,
     [ @objname = ] 'object_name'
     [ , [ @futureonly = ] 'futureonly_flag' ]

today라는 기본값이 CREATE DEFAULT 문에 의해 현재 데이터베이스에 정의되었다고 가정할 때, 이 예제는 기본값을 employees 테이블의 [hire date] 열에 바인딩한다. employees 테이블에 행이 추가되고, [hire date] 열의 데이터가 제공되지 않을 때마다 열은 today라는 기본값을 사용하게 된다.

USE master
EXEC sp_bindefault 'today', 'employees.[hire date]'


■ sp_bindrule

열 또는 사용자 정의 데이터 형식에 규칙을 바인딩한다. 구문은 다음과 같다.

sp_bindrule [ @rulename = ] 'rule' ,
     [ @objname = ] 'object_name'
     [ , [ @futureonly = ] 'futureonly_flag' ]

CREATE RULE 문에 의해 현재 데이터베이스에 today라는 규칙이 작성되었다고 가정할 때, 다음은 employees 테이블의 [hire date] 열에 이 규칙을 바인딩하는 예제다. employees에 행이 추가되는 경우, [hire date] 열에 관한 데이터가 today 규칙에 맞는지 확인한다.

USE master
EXEC sp_bindrule 'today', 'employees.[hire date]'


■ sp_bindsession

같은 SQL 서버의 인스턴스에 있는 다른 트랜잭션으로의 연결을 바인딩하거나 바인딩을 해제한다. 바운딩된 연결은 ROLLBACK TRANSACTION 또는 COMMIT TRANSACTION이 발급될 때까지 두 개 이상의 연결이 같은 트랜잭션에 참가하도록 하고 트랜잭션을 공유한다. 구문은 다음과 같다.

sp_bindsession { 'bind_token' | NULL }

다음은 지정된 바인딩 토큰을 현재 세션에 바인딩하는 예제다. 참고로, 다음 예의 바인딩 토큰은 sp_bindsession을 실행하기 전에 sp_getbindtoken을 실행하여 가져왔다.

USE master
EXEC sp_bindsession 'BP9---5---->KB?-V'<>1E:H-7U-]ANZ'


■ sp_configure

현재 서버에 대한 전역 구성 설정을 표시하거나 변경한다. 구문은 다음과 같다.

sp_configure [ [ @configname = ] 'name' ] [ , [ @configvalue = ] 'value' ]

다음은 모든 구성 옵션을 설정하고 나열하는 방법을 보여 주는 예제다. 고급 구성 옵션은 먼저 show advanced option을 1로 설정함으로써 표시된다. 이렇게 변경한 다음 매개 변수 없이 sp_configure를 실행하면 모든 구성 옵션이 표시된다.

USE master
EXEC sp_configure 'show advanced option', '1'


■ sp_create_removable

이동식 미디어 데이터베이스를 작성한다. 세 개 이상(시스템 카탈로그 테이블용으로 하나, 트랜잭션 로그용으로 하나 및 데이터 테이블용으로 하나 이상)의 파일을 작성하고 이러한 파일에 데이터베이스를 놓는다. 구문은 다음과 같다.

sp_create_removable [ @dbname = ] 'dbname'
     , [ @syslogical = ] 'syslogical'
     , [ @sysphysical = ] 'sysphysical'
     , [ @syssize = ] syssize
     , [ @loglogical = ] 'loglogical'
     , [ @logphysical = ] 'logphysical'
     , [ @logsize = ] logsize
     , [ @datalogical1 = ] 'datalogical1'
     , [ @dataphysical1 = ] 'dataphysical1'
     , [ @datasize1 = ] datasize1
     ...
     , [ @datalogical16 = ] 'datalogical16'
     , [ @dataphysical16 = ] 'dataphysical16'
     , [ @datasize16 = ] datasize16 ]

다음은 데이터베이스 inventory를 이동식 데이터베이스로 만드는 것을 보여 주는 예제다.

sp_create_removable 'inventory',
   'invsys', 'c:\Program Files\Microsoft SQLServer\MSSQL\Data\invsys.mdf', 2,
   'invlog', 'c:\Program Files\Microsoft SQLServer\MSSQL\Data\invlog.ldf', 4,
   'invdata', 'c:\Program Files\Microsoft SQLServer\MSSQL\Data\invdata.ndf', 10


■ sp_dboption

데이터베이스 옵션을 표시하거나 변경한다(master 또는 tempdb 데이터베이스에서는 sp_dboption을 사용하지 말것). sp_dboption은 이전 버전과의 호환성 용도로 지원된다. 데이터베이스 옵션을 설정하려면 ALTER DATABASE를 사용한다. 구문은 다음과 같다.

sp_dboption [ [ @dbname = ] 'database' ]
     [ , [ @optname = ] 'option_name' ]
     [ , [ @optvalue = ] 'value' ]

다음은 pubs 데이터베이스를 읽기 전용으로 설정하는 예제다.

USE master
EXEC sp_dboption 'pubs', 'read only', 'TRUE'


■ sp_depends
데이터베이스 개체 종속 관계에 관한 정보(예를 들어, 테이블 또는 뷰에 종속된 뷰 및 프로시저, 뷰 및 프로시저에 종속된 테이블 또는 뷰)를 표시한다. 현재 데이터베이스 외부의 개체에 대한 참조는 보고하지 않는다. 구문은 다음과 같다.

sp_depends [ @objname = ] 'object'

다음은 Customers 테이블에 종속된 데이터베이스 개체를 나열하는 예제다.

USE Northwind
EXEC sp_depends 'Customers'


■ sp_detach_db
서버에서 데이터베이스를 분리하며, 분리하기 전에 선택적으로 모든 테이블에서 UPDATE STATISTICS를 실행한다. 구문은 다음과 같다.

sp_detach_db [ @dbname = ] 'dbname' [ , [ @skipchecks = ] 'skipchecks' ]

다음은 skipchecks를 true로 설정하여 pubs 데이터베이스를 분리하는 예제다.

EXEC sp_detach_db 'pubs', 'true'


■ sp_dropmessage
sysmessages 시스템 테이블에서 지정된 오류 메시지를 삭제한다. 구문은 다음과 같다.

sp_dropmessage [ @msgnum = ] message_number [ , [ @lang = ] 'language' ]

다음은 sysmessages에서 번호가 50001인 메시지를 삭제하는 예제다.

USE master
EXEC sp_dropmessage 50001


■ sp_droptype
systypes에서 사용자 정의 데이터 형식을 삭제한다. 구문은 다음과 같다.

sp_droptype [ @typename = ] 'type'

다음은 사용자 정의 데이터 형식인 birthday를 삭제하는 예제다. 참고로, 이 사용자 정의 데이터 형식은 반드시 이미 존재해야 하며 그렇지 않은 경우에는 오류 메시지가 반환된다.

USE master
EXEC sp_droptype 'birthday'


■ sp_executesql

여러 번 사용할 수 있거나, 동적으로 만들어진 T-SQL문 또는 일괄 처리를 실행한다. T-SQL문 또는 일괄 처리는 포함 매개 변수를 포함할 수 있다. 구문은 다음과 같다.

sp_executesql [@stmt =] stmt
[
     {, [@params =] N'@parameter_name  data_type [,...n]' }
     {, [@param1 =] 'value1' [,...n] }
]

다음은 @level이라는 포함 매개 변수를 포함한 단순 SELECT 문을 작성하고 실행하는 예제다.

execute sp_executesql
          N'select * from pubs.dbo.employee where job_lvl = @level',
          N'@level tinyint',
          @level = 35


■ sp_getbindtoken

트랜잭션에 대한 고유한 식별자를 반환한다. 이 고유한 식별자는 바인드 토큰에 참조된다. sp_getbindtoken은 클라이언트 간에 트랜잭션을 공유하는 데 사용하는 문자열 표시를 반환한다. 구문은 다음과 같다.

sp_getbindtoken [@out_token =] 'return_value' OUTPUT [, @for_xp_flag]

다음은 바인드 토큰을 가져와서 바인드 토큰의 이름을 표시하는 예제다.

DECLARE @bind_token varchar(255)
BEGIN TRAN
EXECUTE sp_getbindtoken @bind_token OUTPUT
SELECT @bind_token AS Token


■ sp_help
데이터베이스 개체(sysobjects 테이블에 나열된 모든 개체), 사용자 정의 데이터 형식 또는 SQL 서버가 공급하는 데이터 형식에 관한 정보를 보고한다. 구문은 다음과 같다.

sp_help [ [ @objname = ] name ]

다음은 sysobjects의 각 개체에 관한 정보를 나열하는 예제다.

USE master
EXEC sp_help

다음은 publishers 테이블에 관한 정보를 표시하는 예제다..

USE pubs
EXEC sp_help publishers


■ sp_helpconstraint
모든 제약 조건 유형, 사용자 정의되었거나 시스템에서 제공하는 이름, 제약 조건 유형을 정의한 열 및 제약 조건을 정의하는 표현식(DEFAULT 및 CHECK 제약 조건에만 적용)의 목록을 보고한다. 구문은 다음과 같다.

sp_helpconstraint [ @objname = ] 'table' [ , [ @nomsg = ] 'no_message' ]

다음은 authors 테이블에 관한 모든 제약 조건을 보여 주는 예제다.

USE pubs
EXEC sp_helpconstraint authors


■ sp_helpdb
지정된 데이터베이스 또는 모든 데이터베이스에 관한 정보를 보고한다. 구문은 다음과 같다.

sp_helpdb [ [ @dbname= ] 'name' ]

다음은 pubs 데이터베이스에 관한 정보를 표시하는 예제다.

exec sp_helpdb pubs

다음은 SQL 서버를 실행하고 있는 서버의 모든 데이터베이스에 관한 정보를 표시하는 예제다.

exec sp_helpdb


■ sp_helpdevice
SQL 서버 데이터베이스 파일에 관한 정보를 보고한다. sp_helpdevice는 데이터베이스 파일의 장치 용어로 사용되는 SQL Server의 이전 버전과의 호환성 용도로 사용된다. 구문은 다음과 같다.

sp_helpdevice [ [ @devname= ] 'name' ]

다음은 SQL Server의 모든 데이터베이스 장치 및 덤프 장치에 관한 정보를 보고하는 예제다.

sp_helpdevice


■ sp_helpextendedproc

현재 정의되어 있는 확장 저장 프로시저 및 프로시저(함수)가 속한 동적 연결 라이브러리의 이름을 표시한다. 구문은 다음과 같다.

sp_helpextendedproc [ [@funcname = ] 'procedure' ]

다음은 모든 확장 저장 프로시저에 관해 보고하는 예제다.

USE master
EXEC sp_helpextendedproc

다음은 xp_cmdshell 확장 저장 프로시저에 관해 보고하는 예제다.

USE master
EXEC sp_helpextendedproc xp_cmdshell


■ sp_helpfile

현재 데이터베이스와 연관된 파일의 물리적 이름 및 특성을 반환한다. 서버에 첨부하거나 서버에서 분리할 파일의 이름을 결정하는데 이 저장 프로시저를 사용한다. 구문은 다음과 같다.

sp_helpfile [ [ @filename = ] 'name' ]

다음은 pubs에 있는 파일에 관한 정보를 반환하는 예제다.

USE pubs
EXEC sp_helpfile


■ sp_helpindex

테이블 또는 뷰의 인덱스에 관한 정보를 보고한다. 구문은 다음과 같다.

sp_helpindex [ @objname = ] 'name'

다음은 sysobjects 테이블에 관한 인덱스의 유형을 보고하는 예제다.

sp_helpindex sysobjects


■ sp_helplanguage

특정한 대체 언어 또는 모든 언어에 관한 정보를 보고한다. 구문은 다음과 같다.

sp_helplanguage [ [ @language = ] 'language' ]

다음은 대체 언어인 한국어에 관한 정보를 표시하는 예제다.

sp_helplanguage korean

다음은 설치된 모든 대체 언어에 관한 정보를 표시하는 예제다.

sp_helplanguage


■ sp_helpserver
특정 원격 또는 복제 서버나 두 유형의 서버 모두에 관한 정보를 보고한다. 연결된 서버에 쿼리 작업을 하거나 접속하기 위해 서버 이름, 서버의 네트워크 이름, 서버의 복제 상태, 서버의 ID번호, 정렬 이름 및 시간 초과 값을 제공한다. 구문은 다음과 같다.

sp_helpserver [ [ @server = ] 'server' ] [ , [ @optname = ] 'option' ]
     [ , [ @show_topology = ] 'show_topology' ]

다음은 모든 서버(매개 변수 없이 sp_helpserver)에 관한 정보를 표시하는 예제다.

USE master
EXEC sp_helpserver

다음은 SEATTLE2라는 서버에 관한 모든 정보를 표시하는 예제다.

USE master
EXEC sp_helpserver 'SEATTLE2'


■ sp_helpsort

Microsoft SQL Server 정렬 순서 및 문자 집합을 표시한다.
다음은 서버의 기본 정렬 순서, 문자 집합 및 주 정렬 값의 표를 표시하는 예제다.

sp_helpsort


■ sp_helpstats

지정된 테이블의 열과 인덱스에 관한 통계 정보를 반환한다. 구문은 다음과 같다.

sp_helpstats[ @objname = ] 'object_name' [ , [ @results = ] 'value' ]

다음은 Northwind 데이터베이스에 있는 모든 사용자 테이블에 대해 적절한 모든 열에 관한 단일 열 통계를 작성한 후, Customers 테이블에서 만들어진 모든 통계 결과를 보는 예제다.

use Northwind
exec sp_createstats
exec sp_helpstats 'Customers', 'ALL'


■ sp_helptext

규칙, 기본값 또는 암호화되지 않은 저장 프로시저, 사용자 정의 함수, 트리거 또는 뷰의 텍스트를 인쇄한다. 구문은 다음과 같다.

sp_helptext [ @objname = ] 'name'

다음은 pubs 데이터베이스에 있는 employee_insupd 트리거의 텍스트를 표시하는 예제다.

USE pubs
EXEC sp_helptext 'employee_insupd'


■ sp_helptrigger

현재 데이터베이스의 지정된 테이블에서 정의된 트리거의 유형을 반환한다. 구문은 다음과 같다.

sp_helptrigger [ @tabname = ] 'table' [ , [ @triggertype = ] 'type' ]

다음은 책 판매량이 10이 되면 오류 50010을 발생시키는 sales_warn이라는 트리거를 작성한 다음, sp_helptrigger가 실행되어 sales 테이블에 있는 트리거에 관한 정보를 작성하는 예제다.

USE pubs
GO
CREATE TRIGGER sales_warn
  ON sales
  FOR INSERT, UPDATE
AS
  RAISERROR (50010, 16, 10)
GO
EXEC sp_helptrigger sales

실행결과

trigger_name  trigger_owner  isupdate  isdelete  isinsert  isafter  isinsteadof
------------- -------------- --------- --------- --------- -------- ------------
sales_warn    dbo            1         0         1         1        0


■ sp_lock

잠금 관련 정보를 보고한다. 구문은 다음과 같다.

sp_lock [[@spid1 =] 'spid1'] [,[@spid2 =] 'spid2']

다음은 현재 SQL Server에서 보유하고 있는 잠금에 관한 모든 정보를 표시하는 예제다.

USE master
EXEC sp_lock

다음은 프로세스 ID 53에 대해 잠금을 포함한 정보를 표시하는 예제다 .

USE master
EXEC sp_lock 53


■ sp_monitor
SQL 서버에 대한 통계를 표시한다. 구문은 다음과 같다.

sp_monitor

결과 집합은 다음과 같은 열을 포함한다.
last_run, current_run, seconds, cpu_busy, io_busy, idle, packets_received,
packets_sent, packet_errors, total_read, total_write, total_errors, connections

다음은 SQL Server가 얼마나 많이 사용되었는지를 보고하는 예제다.

USE master
EXEC sp_monitor


■ sp_procoption

프로시저 옵션을 설정한다. 구문은 다음과 같다.

sp_procoption [ @ProcName = ] 'procedure' , [ @OptionName = ] 'option'
     , [ @OptionValue = ] 'value'

다음은 SQL 서버 서비스가 시작될 때 저장 프로시저 msp_startup가 자동으로 실행되도록 설정하는 예제다.

sp_procoption 'msp_startup', 'startup', 'true'


■ sp_recompile

저장 프로시저 및 트리거가 다음 실행시 다시 컴파일되게 한다. 구문은 다음과 같다.

sp_recompile [ @objname = ] 'object'

다음은 titles 테이블을 사용하는 저장 프로시저 및 트리거가 다음 실행 시 다시 컴파일되게 하는 예제다.

EXEC sp_recompile titles


■ sp_rename

현재 데이터베이스에서 테이블, 열 또는 사용자 정의 데이터 형식 등의 사용자 작성 개체의 이름을 변경한다. 구문은 다음과 같다.

sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name'
     [ , [ @objtype = ] 'object_type' ]

다음은 customers 테이블의 이름을 custs로 바꾸는 예제다.

EXEC sp_rename 'customers', 'custs'

다음은 customers 테이블의 contact title 열의 이름을 title로 바꾸는 예제다.

EXEC sp_rename 'customers.[contact title]', 'title', 'COLUMN'


■ sp_renamedb

데이터베이스의 이름을 변경한다. 구문은 다음과 같다.

sp_renamedb [ @dbname = ] 'old_name' , [ @newname = ] 'new_name'

다음은 accounting 데이터베이스의 이름을 financial로 바꾸는 예제다.

EXEC sp_renamedb 'accounting', 'financial'


■ sp_serveroption

원격 서버 및 연결된 서버용 서버 옵션을 설정한다. SQL 서버 2000에서는 sp_serveroption을 두 가지 새로운 옵션으로 더욱 강화하였다. use remote collation 및 collation name이 그 옵션인데 연결된 서버에서의 데이터 정렬을 지원한다. 구문은 다음과 같다.

sp_serveroption [[@server =] 'server'] [@optname =] 'option_name'
     [@optvalue =] 'option_value'

다음은 다른 SQL Server인 SEATTLE3에 해당되는 연결된 서버가 로컬 SQL Server와 데이터 정렬이 호환되도록 구성하는 예제다.

USE master
EXEC sp_serveroption 'SEATTLE3', 'collation compatible', 'true'


■ sp_settriggerorder

테이블과 연관된 어느 사후 트리거가 처음 또는 마지막으로 시작될 것인지 지정한다. 처음과 마지막 사이에 시작되는 사후 트리거는 정의되지 않은 순서로 실행된다. 구문은 다음과 같다.

sp_settriggerorder[@triggername = ] 'triggername' [@order =] 'value' ,
[@stmttype = ] 'statement_type'

다음은 갱신 트리거 MyTrigger를 처음에 실행되도록 지정하는 예제다.

sp_settriggerorder @triggername= 'MyTrigger', @order='first', @stmttype = 'UPDATE'


■ sp_spaceused

행의 수, 예약된 디스크 공간 및 현재 데이터베이스의 테이블이 사용하는 디스크 공간을 표시하거나 전체 데이터베이스가 예약하였거나 사용하는 디스크 공간을 표시한다. 구문은 다음과 같다.

sp_spaceused [[@objname =] 'objname'] [,[@updateusage =] 'updateusage']

다음은 titles 테이블에 대해 할당된(예약된) 공간, 데이터에 필요한 공간, 인덱스에 필요한 공간 및 데이터베이스 개체에 의해 예약된 사용되지 않은 공간 등에 관해 보고하는 예제다.

USE pubs
EXEC sp_spaceused 'titles'


■ sp_tableoption

사용자 정의 테이블의 옵션 값을 설정한다. sp_tableoption은text, ntext 또는 image 열이 있는 테이블에서 text in row 기능을 설정하는 데 사용할 수 있다. 구문은 다음과 같다.

sp_tableoption [ @TableNamePattern = ] 'table' [@OptionName = ] 'option_name'
     [@OptionValue = ] 'value'

다음은 Northwind 데이터베이스에서 'orders' 테이블에 대해 'text in row' 옵션을 설정하는 예제다.

EXEC sp_tableoption 'orders', 'text in row', 'ON'

다음은 Northwind 데이터베이스에서 'orders' 테이블에 대해 'text in row' 옵션을 설정하고 인라인 제한값을 1000으로 설정하는 예제다.

EXEC sp_tableoption 'orders', 'text in row', '1000'


■ sp_unbindefault

현재 데이터베이스의 열에서 또는 사용자 정의 데이터 형식에서 기본값을 바인딩 해제(제거)한다. 구문은 다음과 같다.

sp_unbindefault [@objname =] 'object_name' [ , [ @futureonly = ] 'futureonly_flag' ]

다음은 employees 테이블의 hiredate 열에서 기본값을 바인딩 해제하는 예제다.

EXEC sp_unbindefault 'employees.hiredate'


■ sp_unbindrule

현재 데이터베이스의 열에서 또는 사용자 정의 데이터 형식에서 규칙을 바인딩 해제한다. 구문은 다음과 같다.

sp_unbindrule [ @objname = ] 'object_name' [ , [ @futureonly = ] 'futureonly_flag' ]

다음은employees 테이블의 startdate 열에서 규칙을 바인딩 해제하는 예제다.

EXEC sp_unbindrule 'employees.startdate'


■ sp_updatestats

현재 데이터베이스의 모든 사용자 정의 테이블에 대해 UPDATE STATISTICS를 실행한다. 구문은 다음과 같다.

sp_updatestats [[@resample =] 'resample']

다음은 pubs 데이터베이스의 테이블에 대한 통계를 업데이트하는 예제다.

USE pubs
EXEC sp_updatestats


■ sp_who

현재 SQL 서버 사용자 및 프로세스에 관한 정보를 제공한다. 유휴 상태가 아닌 프로세스만 반환하려면 반환되는 정보를 필터링하면 된다. 구문은 다음과 같다.

sp_who [[@login_name =] 'login']

다음은 매개 변수 없이 sp_who를 사용하여 모든 현재 사용자를 보고하는 예제다.

USE ffmaster
EXEC sp_who

 

728x90

'Developer > MS SQL' 카테고리의 다른 글

SQL Server의 트랜잭션 로그 파일 축소  (0) 2007.05.06
728x90

사용할 수 있는 자료형은 5가지 

NULL: 널값

INTEGER: 1,2,3,4,6,8bytes의 정수값
(자동증가 시킬 경우 INTEGER PRIMARY KEY AUTOINCREMENT 로 표기)

REAL: 8bytes의 부동소수점값

TEXT: UTF-8, UTF-16BE, UTF-16LE인코딩의 문자열

BLOB: 입력된 그대로 저장, 바이너리 파일 등


다른 형태는 어떻게 만들면 될까? 

Boolean타입: INTEGER로 만들어서 0과 1로 구별.

Date, Time타입
      TEXT: YYYY-MM-DD HH:MM:SS.SSS 형태로 저장
      REAL: 율리우스력을 기준으로 하는 정보를 저장
      INTEGER: UTC타입으로 저장

SQLite에 숫자, 문자, 바이너리를 넣을 수 있으니 자유롭게 넣고 개발자가 알아서 정해서 사용하면 된다.

SQLite는 대용량의 데이터를 처리하기에는 적합하지 않기에 대형프로그램보다는 지금 가장 많이 사용되고 있는 안드로이드 어플 개발 등 작은 프로그램 개발에 사용된다. 즉 다수의 개발자가 아닌 소수 혹은 혼자서 개발하는 경우가 많을 것이기에 좀 더 가볍고 자유롭게 사용할 수 있게 하는 편이 더 낫다.

728x90
728x90
SQLite에서 날짜를 표시하기 위한 함수는 아래의 5가지가 있다.

date(timestring, modifier, modifier, ...) : 날짜
time(timestring, modifier, modifier, ...) : 시간
datetime(timestring, modifier, modifier, ...) : 날짜+시간
julianday(timestring, modifier, modifier, ...) : 율리우스력 날짜
strftime(format, timestring, modifier, modifier, ...) : 포맷 지정

흔히 현재 날짜를 얻을 때 date, time, datetime을 자주 사용하게 된다.
이 함수에 'now' 문자열을 넣으면 현재 날짜와 시간을 얻을 수 있고, 이는 xCurrentTime 메소드가 제공해 주는 것이라고 SQLite 공식 페이지가 말하고 있다.(-_-;;)

즉, SELECT date('now'); 를 하면 현재 날짜가 '2011-12-25' 일 형식 으로 나오고,
SELECT datetime('now'); 를 하면 현재 날짜+시간(시:분:초)이 '2011-12-25 23:30:11' 형식으로 나온다.
단, 국제표준시간(UTC) 기준의 값을 출력한다.

우리나라의 표준 시간은 국제표준시+9 이기 때문에 시간이 틀리게 출력 된다.

해결 방법은 대략 두가지.

1. localtime 값을 이용한 현재시간 구하기 

SELECT datetime('now','localtime');


위와 같이 하면 국제표준시+9 가 된 우리나라 시간이 된다.

2. 시간 값 더하기 

SELECT datetime('now','+9 hours');


국제 표준시에 +9를 해 주면 우리나라 시간이 된다.


편한게 좋기 때문에 1번 추천.

더 자세한 정보는 SQLite 공식 페이지의 Date And Time Functions 페이지를 참조 하자.

보고픈님이 정리하신 SQLitet 날짜 관련 샘플

--UTC 기준의 현재 날짜/시간
select datetime('now');
2010-08-25 04:01:46

-- 로컬 기준의 현재 날짜/시간
select datetime('now','localtime');
2010-08-25 13:02:30

--현재 로컬 기준 시간에서 10분 3.5초를 더한 시간.
select datetime('now','localtime','+3.5 seconds','+10 minutes');
2010-08-25 13:14:15

--현재 로컬 시간에 3.5초를 더하고 날짜는 돌아오는 화요일 (weekday == 0 이 일요일입니다.)
select datetime('now','localtime','+3.5 seconds','weekday 2');
2010-08-31 13:05:39

--현재 달의 마지막 날짜
SELECT date('now','start of month','+1 month','-1 day','localtime');
2010-08-31

--2004-01-01 02:34:56초부터 현재까지의 총 초
SELECT strftime('%s','now') - strftime('%s','2004-01-01 02:34:56');
209785028

--현재날짜/시간 기준에서 올해 9번째달의 첫번째 화요일
SELECT date('now','start of year','+9 months','weekday 2');
2010-10-05

-- 날짜 포맷 스타일 변경
select strftime("%Y/%m/%d %H:%M:%S",'now','localtime');
2010/08/27 09:17:22


728x90
728x90

자바스크립트(JavaScript) 객체는 그 안에 여러가지 속성과 값을 담고 있는 경우가 있는데, 그러한 객체의 속성을 조회할 때 유용한 소스이다.

function getProperty(obj) {
   for (var p in obj) {
	   // 출력형태 - 이름(타입) : 값
	   var msg = p + "(" + typeof obj[p] + ") : " + obj[p];
	   console.log(msg);
   }
}

window.location의 속성값을 알고 싶으면 getProperty(window.location);

특정 이벤트 시 내부 속성값을 알고 싶으면 getProperty(해당 이벤트 객체);

이렇게 사용하면 된다.

결과 값은 브라우저에서 F12를 눌러 콘솔(Console) 탭을 누르면 볼 수 있다.

728x90

'Developer > JavaScript' 카테고리의 다른 글

다른 도메인간 부모창과 자식창 제어  (2) 2019.01.03
JavaScript의 KeyEvent에 따른 keycode  (8) 2009.06.22
50가지의 Ajax 예제  (0) 2008.11.10
728x90

제목 잡기가 참 힘들다.

간단하게 설명할 수 있는 타이틀이 떠오르지 않는다.

이 글은 duplicateParentState와 addStatesFromChildren에 대한 내용이다.


'안드로이드에서 부모 뷰의 속성이 자식 뷰에도 동일하게 적용 되도록 하는 방법'이란 것인데, 좀 쉽게(?) 설명하자면 이런 경우다.


1. 게시판 리스트뷰가 있다.

2. 각 항목은 More 버튼을 가지고 있다.

3. More 버튼을 누르면 다음 화면으로 넘어간다.

4. More 버튼을 직접 누르지 않고 해당 아이템을 눌러도 다음 화면으로 넘어간다.

5. More 버튼을 직접 누르지 않더라도 항목이 눌리면 More 버튼도 눌림 처리 되어야 한다.


마지막 5번이 핵심 요건이다.


3번을 처리하기 위해 More 버튼에 클릭이벤트를 주고, 4번을 처리하기 위해 레이아웃(Layout)에 클릭 이벤트나 터치이벤트를 주는것은 별 문제가 아니다.

그런데, 5번을 처리하기 위해 레이아웃 클릭 시 More 버튼이 눌린 것 처럼 표현하기 위해 별도의 처리를 하는 번거로움을 duplicateParentState="true" 속성으로 해결할 수 있다.


addStatesFromChildren는 duplicateParentState와 반대의 경우로 More 버튼을 눌렀을 때 Layout이 눌림 처리 되는 것이라 이해하면 된다.


아래 예제를 참고하자

http://ingeni.tistory.com/entry/Android-duplicateParentState-부모뷰-속성을-동일하게-자식뷰에-적용하기

http://stackoverflow.com/questions/10605647/android-make-parent-selector-trigger-when-selecting-child

728x90
728x90

Eclipse에서 클래스 멤버 변수(Class Member Field) 전체를 로그로 출력하기 위한 스크립트를 자동으로 생성 할 수 있다.


이클립스 상단 메뉴의 Source > Generate toString() 을 실행하면 멤버 변수에 대한 로그 출력용 스크립트를 toString() 이라는 함수명으로 자동 생성 해 준다.


설치 된 이클립스에서 해당 기능이 없는 경우 JUtils ToString Generator Plug-in을 설치해서 사용할수도 있다.

728x90

'Developer' 카테고리의 다른 글

Regular Expressions Cheat Sheet  (2) 2009.07.02
Image Preview IE7  (3) 2008.05.13
정규표현  (0) 2008.01.29
728x90

ListView 에서 데이터 페이징을 구현 하는 방법 중 주로 사용되는 방법이 아마 이 두가지가 아닐까 싶다.

1. 맨 아래에 '더보기' 버튼을 놓는다.

2. 스크롤이 맨 아래에 닿았을 때 새로운 데이터를 불러 온다.

 

하지만, 이 두 방법은 사용자에게 정보 전달의 Delay를 발생시킨다.

빠르게, 지연없이, 정보를 쭉쭉 확인하고 싶은 사람에게는 순간순간의 Stop을 발생시키게 되는 것이다.

사용자에게 이러한 정보의 Delay를 발생시키지 않는 지연 없는 데이터 전달이 필요한 경우가 있다.

 

위에서 나온 2번에 대한 응용으로 스크롤이 가장 마지막 Data 항목까지 가지 않고, 특정 Data항목에 다다르면 다음 Data를 불러오는 방법이다.

activity_main.xml
<relativelayout
	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">

	<listview
		android:id="@+id/lv_main"
		android:layout_width="match_parent"
		android:layout_height="match_parent">
	</listview>
</relativelayout>
MainActivity.java
public class MainActivity extends Activity {
	private ListView lvMain;
	private boolean isLoading = false;
	private int mCurrentPage = 0; // 현재 페이지 번호
	private int mTotalPage = 0; // 전체 페이지 번호
	private int mItemCount= 15; // 화면에 보여줄 항목 수

	@Override
	public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
		super.onCreate(savedInstanceState, persistentState);
		setContentView(R.layout.activity_main);
		lvMain = (ListView) findViewById(R.id.lv_main);
		lvMain.setOnScrollListener(onScroll);
	}

	OnScrollListener onScroll = new OnScrollListener() {

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
		}

		@Override
		public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
			if ((totalItemCount - firstVisibleItem) < mItemCount && mCurrentPage < mTotalPage) {
				setRequestData(mCurrentPage + 1);
			}
		}
	};

	private void setRequestData(int page) {
		if (isLoading) {
			return;
		}
		isLoading = true;
		
		// TODO 데이터 통신
		// TODO 데이터 통신 완료 후 mCurrentPage값, mTotalPage값을 지정. isLoading=false로 지정.
	}
}

 

OnScrollListener에서 ListView 스크롤 시 남아있는 항목의 갯수를 체크하여 미리 데이터를 불러온다.

통신환경에 따라 차이는 있겠지만, 이런 방식으로 페이징을 구현하면 사용자가 데이터를 불러오느라 기다리는 시간을 단축시킴으로써 서비스의 신속성을 유지할 수 있다.

 

 

728x90
728x90

assets 폴더에 적용할 폰트를 넣어놓고 아래 코드를 적용한다.

여기서는 Roboto-Thin.ttf 폰트를 예로 들어 표기한다.

MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Typeface mFont = Typeface.createFromAsset(getAssets(), "Roboto-Thin.ttf");
    ViewGroup root = (ViewGroup) findViewById(R.id.mylayout);
    setFont(root, mFont);
}

public void setFont(ViewGroup group, Typeface font) {
    int count = group.getChildCount();
    View v;
    for (int i = 0; i < count; i++) {
        v = group.getChildAt(i);
        if (v instanceof TextView || v instanceof EditText || v instanceof Button) {
            ((TextView) v).setTypeface(font);
        } else if (v instanceof ViewGroup)
            setFont((ViewGroup) v, font);
    }
}

 

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mylayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Hello!"
        android:textSize="40sp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Click!"
        android:textSize="40sp" />
</LinearLayout>

 

 

728x90
728x90

Fragment에서 GoogleMap v2를 사용하는 경우...

1. SupportMapFragment를 사용하는 MapFragment를 호출
2. popBackStack()을 하고
3. 다시 MapFragment를 호출 했는데
4. android.view.InflateException과 java.lang.IllegalArgumentException을 만나게 됐다면...

MapFragment에 onDestroyView()를 Override시킨 후 아래 코드를 추가해서 해결 할 수 있다.


SupportMapFragment를 사용하는 Fragment의 onDestroyView()

@Override
public void onDestroyView() {
	super.onDestroyView();
	Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));
	FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
	ft.remove(fragment);
	ft.commit();
}
728x90

'Developer > Android' 카테고리의 다른 글

안드로이드에서 폰트 적용하기  (0) 2015.01.06
외부 앱 실행시키기  (0) 2014.06.11
안드로이드 리소스 폴더 확장 적용 순서  (0) 2014.05.30
728x90

내 어플에서 외부 앱(3rd party App)을 실행하는 방법

 

실행시킬 패키지의 Activity를 아는 경우

ComponentName compName = new ComponentName("com.package","com.package.activity");
Intent intent = newIntent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(compName);
startActivity(intent);

 

실행시킬 패키지명만 아는 경우

Intent intent = context.getPackageManager().getLaunchIntentForPackage("ParkageName");
startActivity(intent);
728x90
728x90

아래의 순서로 정해짐

 

한정자 종류 설명
MCC와 MNC mcc310.. 모바일 국가코드, SIM 카드에 저장된 모바일 네트워크 카드
언어와 지역 en
en-rUS
언어코드 :http://ko.wikipedia.org/wiki/ISO_639 : Alpha-2
한국(ko), 영어(en), 일본어(ja), 중국어(zh)
국가코드 : http://geotags.com/iso3166/countries.html
한국(ko), 영국(rGB), 미국(rUS), 덴마크(de)
화면 크기 small
normal
large
화면 크기에 따른 분류
화면 비율 long
notlong
notlong : QVGA, HVGA, VGA
Long : WQVGA, WVGA, FWVGA
방향 port
land
방향(orientation)
Dock mode car
desk
car : 자동차의 dock에 있을 경우
desk : 책상용 dock에 있을 경우
야간 모드 night
notnight
주간, 야간
픽셀 밀도 ldpi
mdip
hdpi
nodpi
ldpi
mdpi
hdpi
nodpi : 픽셀 밀도와 상관없는 비트맵 리소스를 위해서만 사용
터치 스크린 타입 notouch
stylus
finger
notouch : 터치 스크린 지원 안할 경우
stylus : 스타일러스 펜을 사용할 경우
finger : 손가락 사용
키보드 keysexposed
keyshidden
keyssoft
keysexposed : 하드웨어 키보드 보유
keyshidden : 하드웨어 있지만 사용 불가, SW 키보드 없는 상태
keyshoft : SW키보드만 지원
키보드 배열 nokeys
qwerty
12key
nokeys : 하드웨어 키 없음
qwerty : 하드웨어 키보드 보유
12key : 12key 하드웨어 보유
네비게이션 키 navexposed
navhidden
navexposed : 사용자가 네비게이션 키를 사용 가능
navhidden : 네비게이션 키 사용 불가
탐색 도구 nonav
dpad
trackball
wheel
nonav : 네비게이션 장치 없음
dpad : D-패드를 지원
trackball : 트랙볼 지원
wheel : 휠 탑재
API 레벨 v3
v4
..
안드로이드 SDK 버전에 따른 분류

 

언어코드

values는 영어
values-ko : 한국어
values-ja : 일본어
values-zh : 중국어

 

이미지

drawable-ko-hdpi
drawable-ja-hdpi
drawable-zh-hdpi

 

조합

drawable-en-rUS-land
drawable-en-rGB-hdpi
drawable-port-hdpi
values-fr-rCA

 

  ldpi(120) mdpi(160) hdpi(240)
small QVGA(240x320)
2.6 ~ 3.0 인치
   
normal WQVGA(240x400)
3.2 ~ 3.5 인치
FWQGA(240x432)
3.5 ~ 3.8 인치
HVGA(320x480)
3.0 ~ 3.5 인치
WVGA(480x800)
3.3 ~ 4.0 인치
FWVGA(480x854)
3.5 ~ 4.0 인치
large   WVGA(480x800)
4.8 ~ 5.5 인치
FWVGA(480x854)
3.5 ~ 4.0 인치
 

 

728x90
728x90


프롤로그 

안드로이드는 특유의 파편화 문제로 여러 폰을 지원하다 보면 여러 종류의 레이아웃이나 리소스를 만들어야 하는 경우가 있다.

그런데 여기서 또 문제가, 안드로이드는 OS버젼별로 해당 폴더의 인식 순서가 다르다는데 있다.


덕분에 이걸 모르면 개 삽질을 미친듯이 해야 하고 (경험담ㅋㅋㅋ)

결국 해상도별 픽셀 폴더를 만드는 짓(!)을 해서 훗날 유지보수를 어렵게 만들게 된다.

그리고는 "어쩔 수 없다" 라는 말을 할 수 밖에 없는 상황을 발생시킨다. (이게 무슨 멍멍이 같은 상황인가ㅋㅋㅋ)


안드로이드 OS별 폴더 인식 순서는 간단히 아래와 같다.



OS 4.x 의 Layout 인식 순서

자신의 sw_dp > 낮은 sw_dp > 자신의 w_dp > 낮은 w_dp > 자신의 dpi > 존재하는 dpi 폴더 중 높은 dpi > 낮은 dpi > 자신의 해상도 > 낮은 해상도 > layout


OS 3.x 의 Layout 인식 순서 

자신의 sw_dp > 낮은 sw_dp > 자신의 w_dp > 낮은 w_dp > 자신의 dpi > 자신의 해상도 > 낮은 해상도 > layout > 높은 dpi


OS 2.x 의 Layout 인식 순서 

자신의 dpi > 높은 dpi > 낮은 dpi > 자신의 해상도 > layout



그래서, 몇가지 폰의 Layout 인식 순서를 예로 들면 다음과 같다.



갤럭시S3 (OS : 4.x, 해상도 : 720 X 1280)

layout-sw360dp
layout-sw320dp
layout-w360dp
layout-w320dp
layout-xhdpi
layout-hdpi
layout-mdpi
layout-1280x720
layout-960x540
layout-800x480
layout-480x320
layout


옵티머스 2X (OS : 4.x, 해상도 : 480 X 800)

layout-sw320dp
layout-w320dp
layout-hdpi
layout-xhdpi
layout-mdpi
layout-800x480
layout-480x320
layout


갤럭시탭 (OS : 3.2, 해상도 : 1280 X 800)

layout-sw400dp
layout-sw384dp
layout-sw360dp
layout-sw320dp
layout-w400dp
layout-w384dp
layout-w360dp
layout-w320dp
layout-mdpi
layout-1024x768
layout-960x540
layout-800x480
layout-480x320
layout
layout-hdpi
layout-xhdpi


옵티머스 빅 (OS : 2.3, 해상도 : 480 X 800)

layout-hdpi
layout-xhdpi
layout-mdpi
layout-800x480
layout


옵티머스 원 (OS : 2.2, 해상도 : 320 X 480)

layout-mdpi
layout-480x320
layout-hdpi
layout-xhdpi
layout


728x90
728x90

getActionBar()는 API Level11. 즉, Android 3.0 Honeycomb 이상에서 부터 사용이 가능 하다.

그 이하에서는 getActionBar()가 null을 리턴한다.

또, 테마설정에서 NoActionbar를 설정하는 경우(예: Theme.Holo.NoActionBar)에도 null이 리턴된다.


테마설정이 아무것도 안되어 있는데 null이 리턴 되는 경우에는 application 테마설정을 Holo계열로 해주면 된다.

현재(2012년 12월 4일), Holo계열 테마는 Theme.Holo과 Theme.Holo.Light 두가지가 있다.


getActionBar()는 Holo테마를 위해 존재하는 듯...


728x90
728x90

일반적으로 어플리케이션에서 사용되는 문자열을 정의 해 놓는 string.xml 파일에 임의의 인자값을 정의하여 추후 클래스파일에서 값을 설정할 수 있습니다.

Formatting Strings라고 하며, android에서 정해진 특별한 규칙을 통해 인자값을 줄 수 있습니다.


인자값이 정의된 string resource의 형태는 아래와 같습니다.

 

string.xml

string resource에 줄수 있는 자료형은 숫자형의 d와 문자형의 s가 있습니다.
d는 Double형이고, s는 String형 입니다.


인자값 지정은 %순서$자료형 으로 합니다.
인자를 23개까지 줘 봤는데 이상없이 잘 출력되는 것으로 보아, 인자의 갯수제한은 없는 것 같습니다.
인자에 대한 값 지정은 클래스에서 getString() 메서드를 통해 할 수 있습니다.

 

MainActivity.java

 

MainActivity.java에서 사용하는 Layout은 아래와 같습니다.

 

activity_main.xml

 

위 샘플소스를 첨부하였으니 필요하신 분은 참고하시기 바랍니다.


FormattingStrings.zip



아래는 활용 예 입니다.

string 파일의 인자 순서에따라 결과가 출력 됩니다.

 


 

String형은 문자 뿐만 아니라 숫자도 에러 없이 동일한 결과를 표현 합니다.

 


 

하지만, Double형은 숫자 이외의 값이 오면 에러가 발생합니다.

 


 

string 파일에 정의된 인자의 갯수가 getString()에서 설정하는 인자보다 많으면 에러가 발생합니다.

 


 

getString()에서 설정하는 인자의 갯수가 string 파일에 정의된 인자보다 많으면 정의된 갯수 이외의 인자는 무시됩니다.

 



 

728x90
728x90

android 개발을 할 때 여러 디바이스에 대한 테스트를 할 때 가장 좋은 방법은, 필요한 디바이스를 모두 확보 하고 있는 것 이지만..
그 많은 기계를 다 보유 하고 있다는 것은 상당한 부담이다..

그래서, 울며 겨자 먹기로 느려터진 애뮬레이터 AVD(Android Virtual Device Manager)라도 사용을 해야 하는데, 그에 대한 방법을 정리 한다.


AVD 생성 

이클립스에서는, Window > AVD Manager 실행.
직접 실행 할거면, 자신이 설치 해 둔 android sdk 폴더에 있는 AVD Manager.exe를 실행.

New를 눌러 새로운 AVD(애뮬레이터)를 생성한다.




Name에 자신이 원하는 이름을 설정하고, Target에 원하는 API Level을 설정한다.

SD Card의 Size에서 SD 메모리 용량을 적당히 설정하고..

Skin의 Resolution에서 원하는 해상도를 설정한다.
Built-in으로 설정을 하면 애뮬레이터 실행 시 우측에 하드웨어 버튼이 나타나지만, 해상도 조절을 마음대로 할 수 없다.
Resolution으로 설정을 하면 하드웨어 버튼이 나타나지 않기 때문에 키보드 단축키를 알아야 한다.

단축키는 아래 링크를 참조..
http://youngik.tistory.com/39

Hardware에서 Abstracted LCD density를 원하는 dpi로 설정한다.
( ldpi는 120, mdpi는 160, hdpi는 240, xhdpi는 320 )

Max VM application heap size는 애뮬레이터의 최대 heap size 설정이니 적당히 설정..

Device ram size도 적당히..

설정을 마치면 이렇게..



Create AVD를 누르면 새로운  AVD가 생성된다.



AVD 실행 

AVD를 실행하기 위해서는  AVD Manager를 이용하는 것이 일반적이다.

이클립스에서는, Window > AVD Manager 실행 > AVD 선택 > Start 클릭.
(이클립스를 통하지 않고 직접 실행 하는 경우, 자신이 설치 해 둔 android sdk 폴더에 있는 AVD Manager.exe를 실행)

AVD 실행이 안되는 경우도 있다.
대부분 android SDK가 위치한 경로에 공백이 있거나 한글이 포함되어 있는 경우인데, SDK 경로를 변경 하거나 Command 명령어로 직접 실행하면 해결 된다. 

AVD 실행 명령어
emulator -avd [AVD명] -scale [크기값(ex:0.8)]



AVD는 이클립스에서 App 실행시 생성 시켜도 되고, 미리 AVD를 생성 시켜놓고 App 실행을 해도 된다.
하지만, AVD가 로딩되는 속도가 매우(!!) 느리니 가급적 AVD를 먼지 띄워놓고 작업 하는 것이 좋다.

이클립스를 통해서 AVD에 App을 빌드 하다가 여러가지로 실패 하는 경우에는 command창에서 adb 명령어로 직접 apk를 설치 해주는 것이 가장 확실한 방법 이다.
adb는 android sdk 폴더의 tools 폴더에서 실행 가능하다.

command 창을 열고..

AVD가 떠 있는지 확인하기 위해 아래 명령어를 실행.
adb devices

AVD 이름이 확인 되면, apk를 설치한다.
adb install [패키지 경로][패키지 명].apk

AVD 사용 중 INSTALL_FAILED_INSUFFICIENT_STORAGE 에러를 만나게 되면, AVD 내부의 App 설치공간이 부족하다는 에러이니 용량을 확보 해 주자.

설치하려는 App이 20MB를 넘었거나, AVD에 App을 너무 많이 설치 했을 때 발생한다.

App을 많이 설치 했으면 지워서 용량 확보를 하면 되고, App 용량이 큰 경우라면 AVD의 SD 메모리 영역에 설치하면 된다.

SD 메모리 영역에 설치하는 명령
adb install -s [패키지 경로][패키지 명].apk

재설치 명령은 -r을 추가하면 됨
adb install -r -s [패키지 경로][패키지 명].apk



이렇게 하면 자신이 테스트 하고 싶은 디바이스의 해상도 대로 AVD를 마음껏 만들어 테스트 할 수 있다.
(하지만, 속도는 엄청 느리다는거..)

adb의 여러가지 명령어 들은 아래 링크를 참조.
http://forum.falinux.com/zbxe/?document_srl=533523


AVD 크기조절

AVD 해상도를 크게 하면 모니터 영역을 벗어나서 실행되기도 한다.
이때는 애뮬레이터를 실행 하기 전 나타나는 창에서 Scale display to real size에 체크 후, 자신의 모니터에 맞춰 조절하면 된다.




728x90
728x90

안드로이드 프로그래밍을 하다가 아래와 같은 에러를 만났다.

Description Resource Path Location Type Error generating final archive:
Debug Certificate expired on 11. 10. 11 오후 3:45 <프로젝트명> Unknown Android Packaging Problem

Debug 인증서 만료에 의한 Error로써, dubug.keystore 파일을 삭제하고 Debug 인증서를 갱신 해 주면 된다.

debug.keystore 파일의 위치는 'Window > Preferences > Android > Build'에서 'Default debug keystore' 항목을 참조하면 된다.
사용자 환경에 따라 다르겠지만, 일반적으로 C:\Documents and Settings\User Name\.android 에 위치해 있다.

Debug 인증서 갱신은 debug.keystore 파일을 삭제하고 프로젝트를 Build 해 줌으로 써 갱신 된다.


이 에러에 대해서 구글신(?)께 여쭤 봤지만 관련 정보가 의외로 안나와서 한참 찾았다.....
2시간 동안 나는 짜증 대마왕이 되버린....
같은 문제로 고생하는 이들이 조금이라도 빨리 해결할 수 있기를 바란다.



728x90
728x90


1. *#*#4636#*#*
This code can be used to get some interesting information about your phone and battery. It shows following 4 menus on screen:

* Phone information
* Battery information
* Battery history
* Usage statistics


2. *#*#7780#*#*
This code can be used for a factory data reset. It’ll remove following things:

* Google account settings stored in your phone
* System and application data and settings
* Downloaded applications

It’ll NOT remove:

* Current system software and bundled applications
* SD card files e.g. photos, music files, etc.

Note :-Once you give this code, you get a prompt screen asking you to click on “Reset phone” button. So you get a chance to cancel your operation.


3. *2767*3855#
Think before you give this code. This code is used for factory format. It’ll remove all files and settings including the internal memory storage. It’ll also reinstall the phone firmware.

Note:- Once you give this code, there is no way to cancel the operation unless you remove the battery from the phone. So think twice before giving this code.


4. *#*#34971539#*#*
This code is used to get information about phone camera. It shows following 4 menus:

* Update camera firmware in image (Don’t try this option)
* Update camera firmware in SD card
* Get camera firmware version
* Get firmware update counter

Note:- Never use the first option otherwise your phone camera will stop working and you’ll need to take your phone to service center to reinstall camera firmware.


5. *#*#7594#*#*
This one is my favorite one. This code can be used to change the “End Call / Power” button action in your phone. Be default, if you long press the button, it shows a screen asking you to select any option from Silent mode, Airplane mode and Power off.

You can change this action using this code. You can enable direct power off on this button so you don’t need to waste your time in selecting the option.


6. *#*#273283*255*663282*#*#*
This code opens a File copy screen where you can backup your media files e.g. Images, Sound, Video and Voice memo.


7. *#*#197328640#*#*
This code can be used to enter into Service mode. You can run various tests and change settings in the service mode.


8. *#*#232339#*#* OR *#*#526#*#* OR *#*#528#*#*
WLAN test (Use “Menu” button to start various tests)


9. *#*#232338#*#*
Shows WiFi MAC address


10. *#*#1472365#*#*
GPS test


11. *#*#1575#*#*
Another GPS test


12. *#*#232331#*#*
Bluetooth test


13. *#*#232337#*#
Shows Bluetooth device address


14. *#*#8255#*#*
This code can be used to launch GTalk Service Monitor.


15. Codes to get Firmware version information:

*#*#4986*2650468#*#* – PDA, Phone, H/W, RFCallDate

*#*#1234#*#* – PDA and Phone

*#*#1111#*#* – FTA SW Version

*#*#2222#*#* – FTA HW Version

*#*#44336#*#* – PDA, Phone, CSC, Build Time, Changelist number


16. Codes to launch various Factory Tests:

*#*#0283#*#* – Packet Loopback

*#*#0*#*#* – LCD test

*#*#0673#*#* OR *#*#0289#*#* – Melody test

*#*#0842#*#* – Device test (Vibration test and BackLight test)

*#*#2663#*#* – Touch screen version

*#*#2664#*#* – Touch screen test

*#*#0588#*#* – Proximity sensor test

*#*#3264#*#* – RAM version

Now I’ll reveal 3 hidden modes in the phone:

* Fast Boot mode
* Download mode
* Recovery mode

WARNING: All these modes are used to flash/reset phone firmware. Think twice before entering in these modes.


17. Fast Boot Mode
* Power off your phone.
* Press and hold Call and End Call/Power keys.

This mode is used to flash the phone firmware using command line tools.


18. Download Mode
* Power off your phone.
* Press and hold Volume Down, OK and End Call/Power keys.

This mode is also used to flash the phone firmware. Mostly this mode is used by GUI tools for easier and quicker flashing.


19. Recovery Mode
* Power off your phone.
* Press and hold Volume Down, Call and End Call/Power keys.

This mode is used for recovery purposes like to reset the phone firmware

Note:- Once the alert triangle is shown on screen, press “Menu” key to reset the firmware or press “Home” and “End Call/Power” keys to show recovery menu.

 

728x90
728x90

갤럭시탭 10.1을 타켓으로 하는 프로젝트를 하는 중 HoneyComb(API Level 11)에서는 기본 webview 사용 시, html 문서내의 input box에 포커스가 주어졌을 때 Background 가 날아가는(?) 현상이 있다는 것을 발견 했습니다.

Graphic Rendering과 관련있는 문제로, 이를 해결하기 위해서는 Android 3.0 (API Level 11)에서 추가된 2D Graphics Hardware Accelerated 설정을 사용 해야 합니다.


Hardware Acceleration의 사용 방법 

Hardware Acceleration은 AndroidManifest.xml 또는 해당 클래스에서 정의 할 수 있습니다.

1.AndroidManifest.xml을 이용하는 방법
AndroidManifest.xml 의 <application> 태그에 android:hardwareAccelerated="true" 속성 추가 합니다.
application 이나 activity 수준에서 하드웨어 가속 설정을 할 때 사용하며, 특정 activity에서 하드웨어 가속에 대한 설정을 해제 할 때는 아래와 같이 사용 합니다.
<application android:hardwareAccelerated="true">
     <activity android:name="MainActivity" />
     <activity android:name="SubActivity" android:hardwareAccelerated="false" />
</application>


2. 해당 클래스에 정의 하는 방법

하드웨어 가속이 필요한 윈도우에 아래 코드를 추가 합니다.
getWindow().setFlags(
     WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
     WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);


Hardware Acceleration은 HoneyComb 이상의 SDK 에서만 설정 가능 하므로, Project Build Target을 Android 3.0(API Level 11) 이상으로 설정 해야 합니다.


Hardware Acceleration에 대한 더욱 자세한 정보는 아래 링크를 참조 하시기 바랍니다.
http://android-developers.blogspot.com/2011/03/android-30-hardware-acceleration.html



728x90
728x90

안드로이드는 대기 모드로 들어가게 되면 베터리 소모를 줄이기 위해서 wifi 모드를 해제한다.
이때, 인터넷으로 데이터를 주고 받는 중이거나, 스트리밍을 하고 있는 중 이라면 wifi가 꺼지고 3G가 활성화 되고, 3G는 사용자의 요금으로 이어진다.
이런 상황을 위해 백그라운드 실행 중에도 wifi 상태를 유지 해야 할 필요가 있다.

백그라운드 실행 중에도 wifi 상태를 유지하기 위해서는 android.net.wifi.WifiManager.WifiLock 을 이용해서 wifi상태를 유지시켜줘야 한다.

이에 대해 소개한 포스트 링크
http://drcarter.tistory.com/entry/Android-안드로이드-개발-시-주의사항-백그라운드-실행시-주의할-점


wifi 는 디스플레이 다음으로 베터리 소모를 많이 일으키는 요소 TOP5 에 들어간다.
위 포스트에서도 언급하고 있지만, wifi를 유지한다는 것은 베터리 소모를 촉진 시킨다는 것을 의미한다.

그래서, 본 문제는..
wifi 모드를 유지하면 요금은 세이브 되지만, 베터리 소모가 많아지고..
wifi 모드를 해제하면 베터리는 절약 되지만, 요금이 발생 하는..
그런 딜레마가 발생한다..

단순하게 생각하면, 돈 나가는 것 보다 베터리 나가는게 낫지만
상황에 따라서는 아닐수도 있는..
역시, 대세는 데이터 무제한..


728x90
728x90
안드로이드에서 가끔 Unable to start activity ComponentInfo 에러가 발생하는 경우가 있다.

시작 Activity와 관련이 있기 때문에 이 경우 시작과 관련된 부분을 검토 해 보면 되는데,
시작 Activity의 setContentView() 부분이나, AndroidManifest.xml 파일의 내용 등을 확인 해 보면 된다.

그런데, 아주 가끔 아무 이유도 없이, 아무 이상도 없는데도 Unable to start activity ComponentInfo 오류가 발생한다.

이럴때는, AndroidManifest.xml 파일에 임의 주석을 추가 한다던지 등의 프로그램과 관련 없는 내용을 수정하여 AndroidManifest 파일에게 변경을 인식하게 해 주고 원상복귀 하여 저장 후 실행하면 정상적으로 작동하기도 한다.

신비한 안드로이드...
728x90
728x90

android 3.0~3.1의 Honeycomb 에서 java.lang.IllegalStateException: trying to requery an already closed cursor 에러를 만나게 된다면, startManagingCursor() 사용을 막으십시오.

startManagingCursor()는 Activity의 라이프사이클에 따라 알아서 커서를 관리해주기 때문에 편리한 메소드 이지만, Honeycomb 에서는 이것으로 인해 에러가 발생하는 상황이 있습니다.

Honeycomb의 버그인지, 아니면 무슨 이유가 있는 것인지 알 수는 없으나 android 2.3 디바이스 까지는 아무 문제 없던 소스가 Honeycomb 디바이스에서는 에러를 꾸엑꾸엑 뱉어내면서 죽어버리는 현상이 있습니다.

Honeycomb에서는 Cursor 사용 후 직접 close() 처리를 하는 것이 좋을 것 같습니다.


번역된 외국 사이트를 많이 봐서 그런가..
왠지 말투가 번역기 스럽다...
728x90

'Developer > Android' 카테고리의 다른 글

Unable to start activity ComponentInfo 에러  (3) 2011.08.18
Android Intent 활용 사례  (0) 2011.06.28
웹페이지에서 Activity 호출하기  (0) 2011.06.22
728x90

안드로이드에서 Intent로 앱을 호출하는 방법 정리

 

연락처

연락처 조회

Intent intent = new Intent(Intent.ACTION_VIEW,
    Uri.parse("content://contacts/people/" + String.valueOf(contact.getId())));
startActivity(intent);

연락처 등록

Intent intent = new Intent(Intent.ACTION_INSERT,
    Uri.parse("content://contacts/people"));
startActivity(intent);

연락처 수정

Intent intent = new Intent(Intent.ACTION_EDIT,
    Uri.parse("content://contacts/people/" + String.valueOf(contact.getId())));
startActivity(intent);

연락처 삭제

Intent intent = new Intent(Intent.ACTION_DELETE,
    Uri.parse("content://contacts/people/" + String.valueOf(contact.getId())));
startActivity(intent);

 

전화

* 권한 설정 (AndroidManifest.xml)
전화 걸기 : CALL_PHONE = "android.permission.CALL_PHONE"
긴급 통화 : CALL_PRIVILEGED = "android.permission.CALL_PRIVILEGED"
폰 상태 읽기 : READ_PHONE_STATE = "android.permission.READ_PHONE_STATE"
폰 상태 수정 : MODIFY_PHONE_STATE = "android.permission.MODIFY_PHONE_STATE"
브로드케스팅 수신 : PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS"
전화 걸기 이전 : ACTION_NEW_OUTGOING_CALL = "android.intent.action.NEW_OUTGOING_CALL"

전화걸기 화면

Intent intent = new Intent(Intent.ACTION_DIAL,
    Uri.parse("tel:" + TelNumber));
startActivity(intent);

전화걸기

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + TelNumber));
startActivity(intent);

 

SMS

* 권한 설정 (AndroidManifest.xml)
수신 모니터링 : RECEIVE_SMS = "android.permission.RECEIVE_SMS"
읽기 가능 : READ_SMS = "android.permission.READ_SMS"
발송 가능 : SEND_SMS = "android.permission.SEND_SMS"
SMS Provider로 전송 : WRITE_SMS = "android.permission.WRITE_SMS"
                            : BROADCAST_SMS = "android.permission.BROADCAST"

SMS 발송 화면

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("sms_body", "The SMS text");
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

SMS 보내기

Intent intent = new Intent(Intent.ACTION_SENDTO,
    Uri.parse("smsto://01012341234"));
intent.putExtra("sms_body", "The SMS text");
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);

 

이메일

이메일 발송 화면

Intent intent = new Intent(Intent.ACTION_SENDTO,
    Uri.parse("mailto:" + contact.getEmail()));
startActivity(intent);

 

브라우저

Browser에서 URL 호출하기

Intent intent = new Intent(Intent.ACTION_VIEW,
    Uri.parse("http://www.google.com/"));
startActivity(intent);

브라우저에서 검색

Intent intent = new Intent(Intent.ACT ION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY, "검색어");
startActivity(intent);

 

지도

지도 보기

Uri uri = Uri.parse ("geo: 38.00, -35.03");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

 

안드로이드 마켓

안드로이드 마켓에서 Apps 검색

Uri uri = Uri.parse("market://search?q=pname:전제_패키지_명");  
//--- 예) market://search?q=pname:com.jopenbusiness.android.smartsearch
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent); 

안드로이드 마켓의 App 상세 화면

Uri uri = Uri.parse("market://details?id=전제_패키지_명");
//--- 예) market://details?id=com.jopenbusiness.android.smartsearch
Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
startActivity(intent);

 

설정화면

각 설정별 Activity Action : http://developer.android.com/reference/android/provider/Settings.html

 

* Activity Action 예시
WiFi : android.provider.Settings.ACTION_WIFI_SETTINGS
Bluetooth : android.provider.Settings.ACTION_BLUETOOTH_SETTINGS
디스플레이 : android.provider.Settings.ACTION_DISPLAY_SETTINGS

설정화면 부르기 (WiFi의 예)

Intent intent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

 

728x90
728x90

WebView를 이용하는 프로그램이 웹페이지에서 Activity를 호출하는 방법

아래와 같은 html 문서가 있을 때

test.html
<html>
	<body>
		<a href="app://application">Activity 호출</a>		
	</body>
</html>

app://application 링크를 통해 Activity를 호출하기 위해서 java 파일을 아래와 같이 작성한다
MainActivity.java

url.startsWith 메소드를 통해 url 시작 정보를 읽어 오는 방법이다.
같은 기능을 indexOf 메소드를 이용해서도 구현할 수 있다.
if 구문을 아래와 같이 변경 하면 된다.
indexOf 사용

검색하다 보니 AndroidManifest.xml 파일에 intent-filter를 추가해야 한다는 글이 많았는데, 난 추가 안해도 잘 돼서 패스.. (난, Android 2.3 에서 테스트 했음)
어쨌든 intent-filter는 TargetActivity에 추가해야 하며, 내용은 아래와 같다.
AndroidManifest.xml

마지막으로 MainActivity.java 파일에서 사용한 main Layout 파일은 아래와 같다.
main.xml





728x90

'Developer > Android' 카테고리의 다른 글

Android Intent 활용 사례  (0) 2011.06.28
AndroidManifest.xml 구조  (0) 2011.05.09
Android 외장메모리 경로 추출  (0) 2011.04.26
728x90

manifest 파일은 작성된 안드로이드 어플리케이션에 대한 주요 정보들을 가지고 있다.
때문에, 프로그램을 분석할 때 가장 먼저 보게 되는 곳이 manifest 파일이다.
이때, 구조를 잘 이해하고 있으면 manifest 파일을 해석 하는데 많은 도움이 된다.

출처 : http://developer.android.com/guide/topics/manifest/manifest-intro.html

AndroidManifest.xml


728x90
728x90

getExternalStorageDirectory() 메서드는 external storage directory를 가져온다.
그리고, getAbsolutePath() 메서드는 경로의 Root를 가져온다.
이 두가지를 조합해서 아래와 같이 사용하면 된다.

안드로이드에서 SD카드를 이용한 외장메모리 영역 뿐만 아니라 내부의 확장메모리영역의 주소값을 가져 올 때도 사용 가능.

import java.io.File;
import android.os.Environment;

public String getSDPath() {
    File extSt = Environment.getExternalStorageDirectory();
    String SDPath = extSt.getAbsolutePath();
    return SDPath;
}

 

728x90

'Developer > Android' 카테고리의 다른 글

AndroidManifest.xml 구조  (0) 2011.05.09
Android 2.3(Gingerbread) 에서 추가된 기능  (0) 2011.04.18
TabActivity 구현  (0) 2011.01.17
728x90
Froyo는 Java5 기반이었으나 Gingerbread는 Java6 기반으로 Java API를 업그레이드하여 일부 java.*, javax.* 패키지의 API가 변경됨
그 외 일부 Android 개선사항이 반영되어 android.* 패키지의 API가 변경됨
변경된 메소드는 Android Developers의 Android API Differences Report 문서 참조

아래는 Tstore Developer Center에서 제공하는 내용임.

NFC 관련

가) NfcAdapter, NdefMessage, NdefRecord 로 구성된 android.nfc 패키지가 추가됨.
NfcAdapter는 NFC H/W에 대한 핸들을 제공하며,NDEF(NFC Data Exchange Format)의 개별 레코드는 NdefRecord, 레코드의 셋은 NdefMessage로 표현됨

나) NFC 지원 단말은 NFC Service가 백그라운드에서 구동되며 NFC 태그를 읽으면 읽혀진 NDEFMessage를 extra data로 하는 ACTION_TAG_DISCOVERED intent를 브로드캐스트하므로 NFC 기능을 활용하는 App은 AndroidManifest.xml에 아래의 intent-filter 엘리먼트를 포함해야 함
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>

다) NFC 기능을 활용하는 App은 아래 퍼미션을 AndroidManifest.xml에 명시해야 하며, 구동 시 NfcAdapter의 isEnabled() 메소드를 호출해서 단말의 NFC 지원여부를 확인해야 함
<uses-permission android:name="android.permission.NFC">

라) NFC 기능을 활용하는 App은 구글마켓에서 NFC 미지원 단말에게 노출되지 않기 위해 AndroidManifest.xml에 아래 엘리먼트를 포함해야 함
<uses-permission android:name="android.permission.NFC">


센서 관련

자이로를 포함한 신규 센서를 활용하는 App은 구글마켓에서 미지원 단말에게 노출되지 않기 위해 AndroidManifest.xml에 아래 엘리먼트 중 필요한 항목을 포함해야 함
<uses-feature android:name="android.hardware.sensor.gyroscope" android:required="true">
<uses-feature android:name="android.hardware.sensor.barometer" android:required="true">


카메라 관련

단말의 특정 카메라를 선택하기 위해 Camera 클래스에 카메라의 개수를 확인하고, 특정 카메라의 정보를 획득하고, 특정 카메라를 선택하는 메소드들이 추가되고, 각 카메라의 캠코더 기능 또한 선택해서 확인할 수 있음


음향효과 관련 

음향효과를 제공하기 위해 android.media.audiofx 패키지가 추가되었으며, Equalizer, Virtualizer, BassBoost, PresetReverb, EnvironmentalReverb 등 음향효과 클래스가 추가됨
각 음향효과는 트랙별 또는 전체에 적용될 수 있으며, 트랙별로 음향효과를 적용하기 위해 AutioTrack 클래스와 MediaPlayer 클래스가 수정됨


멀티미디어 프레임웍 관련

가) 멀티미디어 프레임웍이 Opencore가 완전히 제거되고 Stagefright로 대체됨.
일반 App에는 영향이 없으나 DRM 등 멀티미디어 프레임웍의 플러그인 형태의 App은 수정 개발해야 함

나) JPEG 메타데이터의 위치정보 중 위도/경도 외에 고도 태그를 읽을 수 있는 API가 추가됨


다운로더 관련 

가) HTTP 기반의 파일 다운로드를 제공하는 DownloadManager 백그라운드 서비스가 추가됨.
App은 바인더를 통해 DownloadManager에게 다운로드를 요청,쿼리,취소할 수 있음

나) 각 다운로드 항목은 인디케이터에 표시되며 사용자가 항목을 클릭하면 DownloadManager가 AC-TION_NOTIFICATION_CLICKED intent를 브로드캐스트하므로,  다운로드를 요청한 App은 broadcast receiver를 통해 필요한 동작을 할 수 있음

다) 단말이 재부팅되거나 네트워크 연결상태가 변경되면 DownloadManager가 자동으로 이어받기를 진행하며 다운로드 파일은 디폴트로 공용 폴더에 저장되나 다운로드 요청 시 다른 폴더를 저장폴더로 설정할 수 있음


StrictMode 관련 

가) Android App의 메인 쓰레드는 반응성을 높이기 위해 UI관련 이벤트를 주로 처리하며 파일 I/O 또는 네트워크 I/O는 별도 쓰레드에서 처리하는 것이 좋음.
또한, DB접속을 명시적으로 종료하지 않으면 일시적인 메모리 leak이 발생하며 DB접속에 부하가 발생하므로 DB접속을 명시적으로 종료해야 함

나) StrictMode는 App의 메인 쓰레드에서 I/O가 발생하는지, DB접속이 명시적으로 종료되지 않는지 검출하기 위해 신규 제공되는 디버깅 목적의 클래스임


UI 프레임웍 관련 

가) View와 Widget에서 오버스크롤링 지원 추가

나) Touch spoofing을 막기 위해 Toast 등에 가려진 View가 터치 이벤트를 받지 않는 기능 추가

다) 입력이벤트와 입력장치에 대한 베이스클래스를 정의하여 일관된 이벤트 hierarchy를 구성하여 입력이벤트와 입력장치에 대한 속성을 확인할 수 있도록 함

라) 멀티포인트 멀티터치 트래킹이 가능하도록 MotionEvent 클래스 확장함. 각 터치포인트는 “pointer ID”로 관리됨.

마) 텍스트 선택 컨트롤을 일반 App에서 활용 가능하도록 BaseInputConnection, InputConnection, In-putConnectionWrapper 클래스 확장

바) ActivityInfo에 화면 orientation 항목이 추가되고, RunningAppProcessInfo에 empty, background, service, foreground, visible 외에 perceptible 항목이 추가됨 (백그라운드 뮤직 플레이어 등의 용도)

사) Notification 텍스트와 아이콘 스타일을 정의하기 위한 항목 추가함


대(xlarge) 화면 지원 관련 

가) Froyo의 고해상도(xhdpi) 지원에 이어 7인치 이상의 대화면(xlarge) 지원을 추가함.

나) App은 AndroidManifest.xml에 아래 엘리먼트를 추가하여 대화면 지원 여부를 명시할 수 있음
<supports-screens android:xlargeScreens=”true”/”false”>

다) App 패키징 시 대화면용 App 리소스는 xlarge 폴더에 두어야 함


그래픽 관련 

가) OpenGL ES 2.0 메소드 중 Froyo에서 지원되지 않은 glDrawElements()와 glVertexAttribPointer()를 추가함

나) YV12 픽셀포맷 지원을 추가함


Content Provider 관련 

가) 검색 결과를 바로 재생하기 위한 PLAY_FROM_SEARCH intent가 MediaStore에 추가됨. 음성인식을 통한 미디어 재생에 활용함.

나) 특정 App의 관리화면과 응용프로그램관리 초기화면으로 바로 진입할 수 있도록 Settings에 APPLICATION_DETAILS_SETTINGS intent와 MANAGE_ALL_APPLI CATIONS_SETTINGS intent가 추가됨

다) SIP 주소를 저장할 수 있도록 ContactsContract에 ContactsContract.CommonData Kinds.SipAddress 타입 추가됨


Location 관련 

가) LocationManager에게 위치정보를 요청해서 wake lock이나 WiFi lock을 유발한 App을 트랙킹하여 응용프로그램관리 메뉴의 App별 배터리 사용 정보에 반영함

나) Activity는 LocationManager의 requestLocationUpdates() 또는 requestSingleUpdate() 메소드를 통해 위치정보를 주기적 또는 일회성으로 업데이트받도록 등록할 수 있음.
위치정보 제공자는 명시적으로 선택하거나, Criteria 클래스를 통해 특정 조건 (정확도, 전력소모량, 속도, 비용 등)에 맞는 제공자 선택 가능


Storage 관련 

가) OBB(Opaque Binary Blob) 지원을 위한 StorageManager 클래스 추가됨.
OBB 파일은 마운트해서 사용하는 별도의 파티션이고 StorageManager는 특정 OBB의 마운트여부 확인, 마운트, 언마운트를 수행함

나) Android 2.3은 외장SD가 없는 단말도 허용함.
외장SD를 필요로하는 App은 isExternalStorageRe-movable() 메소드를 통해 외장SD 존재 여부 확인 가능


Package Manager 관련 

가) 패키지정보에 최초설치시간과 최종업데이트시간 필드 추가됨

나) 특정 컨텐츠 프로바이더에 대한 정보를 제공하는 getProviderInfo() 메소드 추가됨

추가된 screenOrientation 속성 값

설명

reverseLandscape

상하가 뒤집힌 Landscape 화면

reversePortait

상하가 뒤집힌 Portrait 화면

sensorLandscape

Landscape 모드이되 상하 선택은 센서 활용

sensorPortrait

Portrait 모드이되 상하 선택은 센서 활용

fullSensor

Landscape, Portrait, 상하 선택에 센서 활용



728x90

'Developer > Android' 카테고리의 다른 글

Android 외장메모리 경로 추출  (0) 2011.04.26
TabActivity 구현  (0) 2011.01.17
삼성 갤럭시탭 AVD Add-on Link  (0) 2010.11.08
728x90

TabActivity의 내용을 구현하는 방법에는 일반적으로 다음과 같은 방법이 있다.

1. Layout xml을 이용하는 방법
2. 다른 java class를 이용하는 방법
3. TabActivity class에서 직접 생성하는 방법

Layout xml을 TabActivity에서 호출

아래와 같은 내용의 xml Layout이 있는 경우

layout_tab1.xml

해당 id를 호출

testTab1.java


class를 TabActivity에서 호출

java파일 testTab2_1, testTab2_2, testTab2_3 이 아래와 같이 있는 경우

testTab2_1.java

testTab2_2.java

testTab2_3.java

intent로 해당 class를 호출

testTab2.java


TabActivity에서 직접 내용 생성

TabContentFactory 인터페이스를 이용.
TabContentFactory 인터페이스는 createTabContent를 정의하며, 탭 호스트로부터 전달된 태그명으로부터 뷰를 생성해 리턴하는 역할을 한다.

testTab3.java

728x90
728x90

Android 기반의 태블릿 PC인 삼성 갤럭탭 AVD (Android Virtual Devices) 입니다.
이클립스에 ADT(Android Development Tool)가 설치된 상태에서
Window > Android SDK and AVD Manager > Available Packages > Add Add-on Site
를 눌러 아래주소를 입력하면 삼성 갤럭시탭 AVD를 생성할 수 있습니다.

follow @AndroidDev: http://twitter.com/AndroidDev#
GALAXY Tab Info: http://galaxytab.samsungmobile.com/

사용자 삽입 이미지




728x90

+ Recent posts