Search Results for '프로그래밍'
1208 posts related to '프로그래밍'
- 2011/12/06 문 자열 길이 체크
- 2011/12/06 정규 표현식(Regular Expression)
- 2011/12/06 자바스크립트 연습장
- 2011/12/06 자바스크립트로 엔터 넣기
- 2011/12/06 화면상의 객체 위치,크기 1
- 2011/12/06 모든 브라우저 버전별 확인 스크립트
- 2011/12/06 페이지 스크롤끝 확인 스크립트
- 2011/12/06 스마트폰 접속시 모바일 사이트로 이동 소스 예제
- 2011/12/06 구글음성 서비스 이용처리
- 2011/12/06 부팅시 자동으로 내 서비스 올리기
- 2011/12/06 안드로이드 연락처 목록 가져오기/삭제하기 방법
- 2011/12/06 안드로이드에서 구글 계정 가져오는 방법
- 2011/12/06 안드로이드에서 SMS 목록 가져오기/삭제하기 방법 1
- 2011/12/06 안드로이드 SharedPreferences 기능 이용하기
- 2011/12/06 canvas 내용 파일저장하기
- 2011/12/06 Intent에서 앱 호출하는 방법 정리
- 2011/12/06 apk 파일 업데이트
- 2011/12/06 /system/app 권한 풀기 방법
- 2011/12/06 Intent 활용 예제 소스
- 2011/12/06 android pdf 또는 hwp 소스 실행하기
- 2011/12/06 삼성,LG 오픈소스
- 2011/12/06 Android Cookkie 와 Session 관련
- 2011/12/06 화면 계속 켜지게
- 2011/12/06 progress bar 모양 바꾸기
- 2011/12/06 VideoView - raw에 저장된 mp4 play하기 uri생성방법
- 2011/12/06 안드로이드 바코드 스캔 라이브러리( barcord scan library for android, ZXing)
- 2011/12/06 메모리 누수 관련 내용 모음 글
- 2011/12/06 안드로이드 색상코드 형식
- 2011/12/06 Intent 활용 예제
- 2011/12/06 파일 위치에 따른 미디어 재생 샘플 코드
lwTrimByte 는 문자열을 원하는 수만큼 잘라줍니다.
사 용방법은 다음과 같습니다.
a = lwGetByte(str)
b = lwTrimByte(str, 400)
function lwGetByte(s) {
var ls_str = s;
var li_str_len = ls_str.length;
var i = 0;
var li_byte = 0;
var ls_one_char = "";
var ls_str2 = "";
for(i=0; i< li_str_len; i++) {
ls_one_char = ls_str.charAt(i);
if (escape(ls_one_char).length > 4) {
li_byte += 2;
} else {
li_byte++;
}
}
return li_byte;
}
function lwTrimByte(s, nMaxByte) {
var ls_str = s;
var li_str_len = ls_str.length;
var li_max = nMaxByte;
var i = 0;
var li_len = 0;
var li_byte = 0;
var ls_one_char = "";
var ls_str2 = "";
for(i=0; i< li_str_len; i++) {
ls_one_char = ls_str.charAt(i);
if (escape(ls_one_char).length > 4) {
li_byte += 2;
} else {
li_byte++;
}
if(li_byte <= li_max) {
li_len = i + 1;
}
if(li_byte > li_max) {
ls_str2 = ls_str.substr(0, li_len);
return ls_str2;
}
}
}
/*
' ------------------------------------------------------------------
' Function : fc_chk2()
' Description : Enter키를 못치게한다.
' Argument :
' Return :
' ------------------------------------------------------------------
*/
function fc_chk2()
{
if(event.keyCode == 13)
event.returnValue=false;
}
</script>
< textarea name="txt_aaa" rows="5" cols="60" onkeyup="fc_chk_byte(this,10);" onkeypress="fc_chk2()" >
1. 정규 표현식이란.
문자열의 특정한 패턴을 표시하거나 검사하기 위한 규칙을 의미하며 어떤 문자열의 집합을 표시하는 텍스트 string이나 일반적인
텍스트 형시의 문서 등에서 문자열을 찾아내거나 검사하고 치환하는데 사용된다. 이러한 정규 표현식은 정규 표현식을 표시하는
특수문자와 정규 표현식을 검사하기 위한 함수가 있다.
2. 패턴을 표현하는 특수 문자
특수 문자 | 내용 | 해당문자열 |
. | 임의의 한 글자를 의미한다. | a.b (abc, acb, afb...) |
* | * 바로 앞의 문자가 없거나 한개 이상이 있을 경우 | a*b (b, ab, aab, aaab...) |
+ | + 바로 앞의 문자가 최소 한 개 이상일 때 | a+b (ab, aab, aaab...) |
? | ? 바로 앞의 문자가 없거나 한 개 존재하는 경우 | a?b (b, ab, cb, zb...) |
^ | ^ 뒤에 문자열과 같은 문자열로 시작한는 경우 [] 안에서 ^ 는 [] 안의 문자를 제외한 문자를 의미한다. | ^ab (ab, abc, abdr...) |
$ | $ 앞의 문자열과 같은 문자열로 끝나는 경우 | ab$ (ab, sab, aaab...) |
[] | [] 안의 문자열 중에 하나만의 문자만을 의미한다. | [a-z], [0-9], [a-zA-Z] |
{} | {} 앞의 문자열의 개수를 의미한다. | a{1-3}b (ab, aab, aaab) |
() | () 안의 문자는 그룹으로 인식한다. | a(bc){2} (abcbc) |
| | or 연산자이다. | a(b|c)d (abd, acd) |
[[:alpha:]] | 모든 알파벳의 문자 한 자를 의미한다. | [a-zA-Z]와 동일 |
[[:digit:]] | 모든 숫자 한 자를 의미한다. | [0-9]와 동일 |
[[:alnum:]] | 알파벳과 숫자중 한 자를 의미한다. | [a-zA-Z0-9]와 동일 |
[[:space:]] | 공백 문자를 의미한다. |
|
[[:punct:]] | 구두점을 의미 |
|
\ | . * + ? ^ $ [] {} () | \ 문자를 표시할때 | (\*, \\, \[1\], \|...) |
3. 정규 표현식의 특수문자 사용법
1) ^a?bc : a로 시작해서 bc로 끝나는 문자(abc로 시작하는 문자)와 bc로 시작하는 모든 문자 (예 abcd, bcd)
2) ^.a : a앞에 아무 한 문자가 있어야 하고 그 문자로 시작하고 a가 들어간 문자 (예 aa, bacd, match, para)
3) a?b$ : b로 끝나는 문자열 중에 a가 없거나 한 개 이상 존재하는 문자열 (예 b, ab, aab)
4) a?b+$ : 첫 글자는 a가 있거나 없고 b가 한 개 이상이고 b로 끝나는 문자 (예 ab, b, bb, abbb, abbbb)
5) ^ab$ : 첫 글자가 a이고 끝나는 문자가 b인 경우 (예 ab)
6) [ab]cd : a나 b중에 한 글자와 cd가 포함된 acd, bcd를 포함한 문자 (예 acd, bcd, acdse)
7) ^[a-zA-Z] : 영문자로 시작하는 모든 문자 (예 a, b, c, d, ee)
8) [^ab]cd : cd 문자열 앞에 a나 b를 제외한 문자가 있는 문자열 즉, acd와 bcd를 제외한 문자열을 의미한다. (예 scd, dcd, ffcd)
9) a{2,}b : a의 개수가 최소 2개 이상이고 다음 문자가 b인 문자 (예 aab, aaabcd, aaaab)
-------------------------------------------------------------------------------------------------------------------------------------------------
정규표현식 기초
. : 다수의 한문자
? : 0개 이상의 한문자
* : 0개 이상의 문자 또는 문자열
+ : 1개 이상의 문자 또는 문자열
(chars) : (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.
^ : 문자열의 첫문(열)을 지정합니다.
$ : 문자열의 끝 문자(열)을 지정합니다.
\(역슬래쉬) : 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.(예:(, ), [, ] . 등)
{n} : 정확히 n번 반복
{n,} : n번 이상 반복
{n,m} : n 이상 m 이하 반복
[chars] : 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.
예) [a-z] : a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T
정규표현식 단축표현들
[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현
[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현
[:digit:] : 숫자 [0-9] 와 같은 표현
[:upper:] : 대문자. [A-Z] 와 같은 표현
-------------------------------------------------------------------------------------------------------------------------------------------------
PHP는 POSIX와 Perl이라는 두 가지 스타일의 정규 표현식을 지원한다. POSIX스타일의 정규 표현식이 PHP에서 기본이지만,
Perl 스타일도 PCRE(Perl-Compitable Regular Expression)라이브러리를 사용하여 표현할수 있다.
아래의 설명은 POSIX 스타일을 기준으로 한다.
. : 문자는 줄바꿈 문자(\n)을 제외한 모든 문자를 대신할수 있다 (하나의 문자)
ex) .at : 이런 정규식은 cat, sat, mat등이 해당된다.
[a-z]at : []의 문자들은 문자 클래스라고 하고, 일치시키는 문자는 이 클래스에 속해야 한다. []안의 것들은
모두 각각 하나의 문자이다.
ex) [aeiou] : 영어의 모음에 해당되는 단어로 []안의 하나의 문자가 된다.
또한 범위를 사용해서도 표현할수 있는데 -를 사용한다.
ex) [a-zA-Z] : 대소문자 알파벳 한 문자를 의미한다.
집합의 구성원이 아니라는 표현으로 ^를 사용한다. 이는 []안에 ^가 있을경우 not이라는 의미를 가진다.
ex) [^a-z] : 소문자 알파벳 이외의 한 문자를 의미한다.
[[:alnum:]] 알파벳 문자, 숫자
[[:alpha:]] 알파벳
[[:lower:]] 소문자
[[:upper:]] 대문자
[[:digit:]] 십진법의 숫자
[[:xdigit:]] 16진법의 숫자
[[:punct:]] 구두점
[[:blank:]] 탭, 스페이스
[[:space:]] 공백 문자들
[[:cntrl:]] 컨트롤 문자들
[[:print:]] 모든 출력 가능한 문자들
[[:graph:]] 스페이스를 제외한 모든 출력 가능한 문자들
* : 패턴이 0번 이상 반복될 수 있음을 나타내고l
+ : 한번이상 반복될 수 있음을 나타낸다.
ex) [[:alnum:]]+ : 알파벳이나 숫자 한문자가 한번이상 반복. 즉, 적어도 하나이상의 알파벳이나 숫자를 의미한다.
한 문자열 뒤에 어떤 문자열이 반복해서 나타남을 정규 표현식으로 나타낸 것은 아래와 같다.
ex) (very )*large : 이는 large, very large, very very large등과 일치한다.
{}를 통해서 반복되는 횟수를 제한할 수 있다.
{3}는 세번 반복, {2, 4}은 두번에서 네번 사이로 반복, {2, }는 적어도 2번 이상 반복의 의미이다.
ex) (very ){1, 3} : very , very very , very very very 와 일치한다.
^ : 정규 표현식의 시작부분에 사용되며, 검색하는 문자열의 맨 앞부분에 이 표현이 있어야 함을 의미한다.
$ : 정규 표현식의 뒷부분에 사용되고 이 표현으로 문자열이 끝나야 됨을 의미한다.미
^[a-z]$ : a부터 z사이의 한문자를 의미한다.
| : 선택을 표현하는 경우 사용된다.
ex) com|edu|net : com이거나 edu이거나 net인경우를 의미한다.
\ : '.', '{', '$', '-', 등의 특수문자를 정규 표현식을 위한 특수문자가 아닌 문자로 사용하고 싶을때 '\'를 붙여서 사용한다.
'\'를 표현할때는 '\\'라고 써준다.
ex) \\\$ : 이 경우 \$를 찾고자 할경우를 의미하게 된다.
POSIX 정규 표현식에서의 특수문자의 의미
1) []밖에서 사용되었을때
- / : 특수문자 이스케이프
- ^ : 문자열의 처음에서 일치되어야 함
- $ : 문자열의 끝에서 일치되어야 함
- . : 줄바꿈(\n)을 제외한 모든 문자와 한개를 의미
- | : 또는의 의미
- ( : 패턴의 시작
- ) : 패턴의 끝
- * : 0번 이상 반복됨
- + : 1번 이상 반복됨
- { : 반복 횟수 지정의 시작
- } : 반복 횟수 지정의 끝
- ? : 하위 표현식을 옵션으로 취급
2) []안에서 사용되었을때
- / : 특수문자 이스케이프
- ^ : 맨 처음 시작되었을 때만 not의 의미, 이외에는 문자로 인식
- - : 문자의 범위 지정
ex) ^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$
대소영문자, 숫자, _, -, .중 한개의 문자인데 문자열의 처음에 나타나야 되고 +가 있어서 한번이상 반복된다.
그 이후 @ 문자 한문자가 있어야 되고 대소영문자, 숫자, -중 한개의 문자인데 +가 있어서 한번이상 반복된다.
그 이후 . 문자 한문자가 있어야 되고 대소영문자, 숫자, -, .중 한개의 문자인데 +가 있어서 한번이상 반복되며 끝난다.
<!--
function writ() {
newwin=open('','newwin','width=500,height=500')
newwin.document.writeln("<html><body>")
newwin.document.writeln("<center><font color=green size=4><b>결과화면</b></font></center><hr& gt;")
newwin.document.writeln("<script>")
newwin.document.writeln(document.a.b.value)
newwin.document.writeln("</script>")
newwin.document.writeln("<hr></body></html>")
}
//-->
</script>
<form name=a>
<textarea name=b cols=60 rows=15>
document.write("<font color=blue>안녕하세요?</font><br>");
document.write("<font color=red>반갑습니다</font><br>");
</textarea>
<input type=button value=미리보기 onclick=writ()>
</form>
ex)
<div id='example'>
<h2>Demo</h2>
<pre class="brush: javascript">
 // SyntaxHighlighter makes your code
 // snippets beautiful without tiring
 // your servers.
 // http://alexgorbatchev.com
 var setArray = function(elems) {
 this.length = 0;
 push.apply(this, elems);
 return this;
 }
</pre>

</div>
<HTML>
<HEAD>
<TITLE> 화면상의 객체 위치,크기 </TITLE>
<SCRIPT LANGUAGE="JavaScript" >
<!--
function getBounds(tag)
{
var ret = new Object();
if(document.all) {
var rect = tag.getBoundingClientRect();
ret.left = rect.left + (document.documentElement.scrollLeft || document.body.scrollLeft);
ret.top = rect.top + (document.documentElement.scrollTop || document.body.scrollTop);
ret.width = rect.right - rect.left;
ret.height = rect.bottom - rect.top;
} else {
var box = document.getBoxObjectFor(tag);
ret.left = box.x;
ret.top = box.y;
ret.width = box.width;
ret.height = box.height;
}
return ret;
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<BR><BR><BR><BR><BR>
<span id="youranytag" style="border:1px solid ;width:500px;">aa</span>
<!--
var box = getBounds(document.getElementById('youranytag'));
var str = "left:"+box.left+"/top:"+box.top+"/width:"+box.width+"/height:"+box.height;
alert(str);
//-->
</SCRIPT>
</BODY>
</HTML>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
<script type="text/javascript">
// InternetVersion
function getInternetVersion(ver) {
var rv = -1; // Return value assumes failure.
var ua = navigator.userAgent;
var re = null;
if(ver == "MSIE"){
re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
}else{
re = new RegExp(ver+"/([0-9]{1,}[\.0-9]{0,})");
}
if (re.exec(ua) != null){
rv = parseFloat(RegExp.$1);
}
return rv;
}
//브라우저 종류 및 버전확인
function browserCheck(){
var ver = 0; // 브라우저 버전정보
if(navigator.appName.charAt(0) == "N"){
if(navigator.userAgent.indexOf("Chrome") != -1){
ver = getInternetVersion("Chrome");
alert("Chrome"+ver+"입니다.");
}else if(navigator.userAgent.indexOf("Firefox") != -1){
ver = getInternetVersion("Firefox");
alert("Firefox"+ver+"입니다.");
}else if(navigator.userAgent.indexOf("Safari") != -1){
ver = getInternetVersion("Safari");
alert("Safari"+ver+"입니다.");
}
}else if(navigator.appName.charAt(0) == "M"){
ver = getInternetVersion("MSIE");
alert("MSIE"+ver+"입니다.");
}
}
</script>
</head>
<body>
<input type="button" value="브라우저판별" onclick="browserCheck();">
</body>
</html>
========================================================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<script>
var Station = {
check : function (type, checkStr, checkPoint)
{
var name = "ETC";
for ( var list in checkPoint )
{
if (checkStr.indexOf(list) != -1)
{
name = checkPoint[list];
}
}
escape("this." + type + " = function () { return name }") ;
return name;
},
os : function ()
{
var checkStr = navigator.platform.toLowerCase();
var checkPoint =
{
"win" : "WINDOW", "mac" : "MAC", "unix" : "UNIX", "linux" : "LINUX"
}
return this.check("os", checkStr, checkPoint );
},
browser : function ()
{
var checkStr = navigator.userAgent.toLowerCase();
var checkPoint =
{
"msie 6" : "IE6" , "msie 7" : "IE7", "firefox" : "FF", "navigator" : "NETSCAPE", "opera" : "OPERA"
}
return this.check("browser", checkStr, checkPoint);
}
}
document.write("OS : " + Station.os() + "<br/>");
document.write("Browser : " + Station.browser() + "<br/>");
</script>
</body>
</html>
function scrollEnd(){
var scrollheight = document.compatMode == "CSS1Compat" ? document.documentElement.scrollHeight :
document.body.scrollHeight;
var clientHeight = document.compatMode == "CSS1Compat" ? document.documentElement.clientHeight :
document.body.clientHeight;
var ScrollTop = document.compatMode == "CSS1Compat" ? document.documentElement.scrollTop :
document.body.scrollTop;
var scrollPos = scrollheight - ScrollTop;
if (clientHeight == scrollPos) { // 스크롤 바가 맨 밑에 위치한다면
alert ("끝까지 확인함!!");
}
<BODY onscroll=scrollEnd();>
<script type="text/javascript">
var mobileKeyWords = new Array('iPhone', 'iPod', 'BlackBerry', 'Android', 'Windows CE', 'LG', 'MOT', 'SAMSUNG', 'SonyEricsson');
for (var word in mobileKeyWords){
if (navigator.userAgent.match(mobileKeyWords[word]) != null){
location.href = "http://m.naver.com";
break;
}
}
</script>
구글번역에서 소리를 제공하는 url를 이용하여 간단한 TTS 구현 예제
<HTML>
<HEAD>
<TITLE> 구글음성서비스 </TITLE>
<META name="Generator" content="EditPlus">
<META name="Author" content="">
<META name="Keywords" content="">
<META name="Description" content="">
<SCRIPT type="text/javascript">
<!--
function doVoice(){
var str = document.getElementById("txt").value;
var urlPar="http://translate.google.co.kr/translate_tts?ie=UTF-8&q="+encodeURI(str)+"&tl=ko&prev=input";
document.getElementById("bgs").src =urlPar;
document.getElementById("view").innerText=encodeURI(str);
}
//-->
</SCRIPT>
</HEAD>
<BODY>
한글을 입력해주세요<br>
<INPUT type="text" name="txt" id="txt">
<INPUT type="button" value="음성듣기" onclick="javascript
<div id="view"></div>
<bgsound id="bgs">
</BODY>
</HTML>
일단 퍼미션을 지정합니다.
<receiver android:name=".BootBroadcast" android:enabled="true"
android:exported="false"
android:label="androesServiceManager"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
BooBroadcast.java
static final String TAG = "ANDROES";
private final String BOOT_ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
//리시버가 발동시 나의 서비스 실행
Logger.d(TAG, "BOOT_ACTION : onReceive");
if (intent.getAction().equals(BOOT_ACTION)) {
// boot 시 shared값을 못불러오네~음
final SharedPreferences prefs = context.getSharedPreferences("androesPrefName", 0);
String status = prefs.getString("status", "");
Logger.d(TAG, "BOOT_ACTION : " + status);
if (status.equals("start")) {
// Logger.d(TAG, "BOOT_ACTION : cylost service ON");
context.startService(new Intent(context, androesService.class));
} else {
// Logger.d(TAG, "BOOT_ACTION : cylost service OFF");
}
}
}
}
방법은 Call Log 가져오는 방법과 유사합니다.
AndroidManifest.xml 에 퍼미션 추가
< uses-permission android:name="android.permission.READ_CONTACTS" />
PhoneBook.java
{
// 주소록 URI
Uri people = Contacts.CONTENT_URI;
// 검색할 컬럼 정하기
String[] projection = new String[] { Contacts._ID, Contacts.DISPLAY_NAME, Contacts.HAS_PHONE_NUMBER };
// 쿼리 날려서 커서 얻기
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
// managedquery 는 activity 메소드이므로 아래와 같이 처리함
return getContentResolver().query(people, projection, null, selectionArgs, sortOrder);
// return managedQuery(people, projection, null, selectionArgs, sortOrder);
}
public void phoneBook() {
try {
Cursor cursor = getURI(); // 전화번호부 가져오기
int end = cursor.getCount(); // 전화번호부의 갯수 세기
Logger.d("ANDROES", "end = "+end);
String [] name = new String[end]; // 전화번호부의 이름을 저장할 배열 선언
String [] phone = new String[end]; // 전화번호부의 이름을 저장할 배열 선언
int count = 0;
if(cursor.moveToFirst())
{
// 컬럼명으로 컬럼 인덱스 찾기
int idIndex = cursor.getColumnIndex("_id");
do
{
tempItem = new TempItem();
// 요소값 얻기
int id = cursor.getInt(idIndex);
String phoneChk = cursor.getString(2);
if (phoneChk.equals("1")) {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = " + id, null, null);
while (phones.moveToNext()) {
phone[count] = phones
.getString(phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
}
name[count] = cursor.getString(1);
// 개별 연락처 삭제
// rowNum = getBaseContext().getContentResolver().delete(RawContacts.CONTENT_URI, RawContacts._ID+ " =" + id,null);
// LogCat에 로그 남기기
// Logger.i("ANDROES", "id=" + id +", name["+count+"]=" + name[count]+", phone["+count+"]=" + phone[count]);
count++;
} while(cursor.moveToNext() || count > end);
}
} catch (IOException e) {
e.printStackTrace();
}
}
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCOUNT_MANAGER" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
ReadGooleAccount.java
Account[] accts = mgr.getAccounts();
final int count = accts.length;
Account acct = null;
for(int i=0;i<count;i++) {
acct = accts[i];
Logger.d("ANDROES", "Account - name="+acct.name+", type="+acct.type);
}
관련사이트)
http://blog.naver.com/cwj3688?Redirect=Log&logNo=20121677208
http://blog.naver.com/cwj3688?Redirect=Log&logNo=20123259451
AndroidManifest.xml 에 퍼미션 추가
< uses-permission android:name="android.permission.WRITE_SMS" />
SMSList.java
public static final String MESSAGE_TYPE_SENT = "2";
public static final String MESSAGE_TYPE_CONVERSATIONS = "3";
public static final String MESSAGE_TYPE_NEW = "new";
public void SMSList() {
try {
// Retrieve All SMS
/*
Inbox = "content://sms/inbox"
Failed = "content://sms/failed"
Queued = "content://sms/queued"
Sent = "content://sms/sent"
Draft = "content://sms/draft"
Outbox = "content://sms/outbox"
Undelivered = "content://sms/undelivered"
All = "content://sms/all"
Conversations = "content://sms/conversations"
addressCol= mCurSms.getColumnIndex("address");
personCol= mCurSms.getColumnIndex("person");
dateCol = mCurSms.getColumnIndex("date");
protocolCol= mCurSms.getColumnIndex("protocol");
readCol = mCurSms.getColumnIndex("read");
statusCol = mCurSms.getColumnIndex("status");
typeCol = mCurSms.getColumnIndex("type");
subjectCol = mCurSms.getColumnIndex("subject");
bodyCol = mCurSms.getColumnIndex("body");
*/
Uri allMessage = Uri.parse("content://sms/");
cur = this.getContentResolver().query(allMessage, null, null, null, null);
count = cur.getCount();
Logger.i( TAG , "SMS count = " + count);
String row = "";
String msg = "";
String date = "";
String protocol = "";
while (cur.moveToNext()) {
row = cur.getString(cur.getColumnIndex("address"));
msg = cur.getString(cur.getColumnIndex("body"));
date = cur.getString(cur.getColumnIndex("date"));
protocol = cur.getString(cur.getColumnIndex("protocol"));
// Logger.d( TAG , "SMS PROTOCOL = " + protocol);
String type = "";
if (protocol == MESSAGE_TYPE_SENT) type = "sent";
else if (protocol == MESSAGE_TYPE_INBOX) type = "receive";
else if (protocol == MESSAGE_TYPE_CONVERSATIONS) type = "conversations";
else if (protocol == null) type = "send";
Logger.i( TAG , "SMS Phone: " + row + " / Mesg: " + msg + " / Type: " + type + " / Date: " + date);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void SMSDelete() {
Uri deleteUri = Uri.parse("content://sms");
int count = 0;
Cursor c = this.getContentResolver().query(deleteUri, null, null,
null, null);
while (c.moveToNext()) {
try {
// Delete the SMS
String pid = c.getString(0);
// Get id;
String uri = "content://sms/" + pid;
// count = this.getContentResolver().delete(Uri.parse(uri),null, null);
} catch (Exception e) {
}
}
}
참고사이트)
http://blog.naver.com/algorithmlab?Redirect=Log&logNo=70098254191
http://mobdev.olin.edu/mobdevwiki/FrontPage/Tutorials/SMS%20Messaging#Catch_the_new_SMS_message
http://stackoverflow.com/questions/2584058/android-querying-the-sms-contentprovider
http://youropensource.com/projects/559-get-All-SMS-messages-in-the-Android
http://stackoverflow.com/questions/2183680/delete-sms-in-android-1-5
SharedPreferences : 화면의 내용이 초기화 되지 않고 유지되는 기능이다.
일반적으로 설정 기능을 구현하고자 할 때 주로 사용되는 것으로 유용하게 쓰일것으로 생각되어 포스팅합니다.
* SampleSharedPreferences.java
...
public class SampleSharedPreferences extends Activity {
private SharedPreferences pref = null;
private EditText nameEditText = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 입력된 정보를 저장하기 위해 Class & Method 호출
pref = getSharedPreferences("com.androes.whitepaper",Activity.MODE_PRIVATE);
nameEditText = (EditText) findViewById(R.id.nameEditText);
// 값 호출
nameEditText.setText(pref.getString("nation", ""));
}
...
@Override
protected void onStop() {
super.onStop();
// 저장을 위해 Edit객체 호출
SharedPreferences.Editor editor = pref.edit();
// 값 변경
editor.putString("nation", nameEditText.getText().toString());
// 변경된 값 저장
editor.commit();
}
}
SharedPreferences 는 임시변수나 작은 크기의 설정 및 환경변수 정보를 저장하기 적합하지만,
다양하고 용량이 큰 데이터 저장시에는 파일 및 sqlite를 사용하는것을 권장합니다.
* 데이터 저장위치(DDMS 나 adb 툴을 이용)
ex. /data/data/com.androes.exrate/shared_prefs/com.androes.exrate.xml
# cat com.androes.exrate.xml
< ?xml version='1.0' encoding='utf-8' standalone='yes' ?>
< map>
< string name="nation">KOR</string>
< /map>
단, 위 파일은 루팅하셔야만 확인할 수 있다는 점 잊지마세요^^
저도 루팅 안하고 이거 찾느라 바보같이 쌩쇼를 했네요..ㅠㅠ
그럼 님들 저처럼 삽질 마시고 유용하게 잘 사용하시길...^^
p.s) Summary
SharedPreferences prefs = getSharedPreferences("CyLostPrefName", MODE_PRIVATE);
Editor ed = prefs.edit();
ed.putString("gmailID", "snazzy7979");
ed.putString("gmailPWD", "pwd12345");
ed.commit();
// REMOVE
SharedPreferences prefs = getSharedPreferences("androesPrefName", MODE_PRIVATE);
Editor ed = prefs.edit();
ed.remove("gmailID");
ed.remove("gmailPWD");
// ed.clear();
ed.commit();
// READ
SharedPreferences prefs = getSharedPreferences("androesPrefName", MODE_PRIVATE);
String gmailID = prefs.getString("gmailID", "");
String gmailPWD = prefs.getString("gmailPWD", "");
private void saveView( View view )
{
String path =
Environment.getExternalStorageDirectory().getAbsolutePath();
Bitmap b = Bitmap.createBitmap(
view.getWidth(), view.getHeight(), Bitmap.Config.RGB_565);
if(b!=null){
try {
File f = new File(path+"/notes");
f.mkdir();
File f2 = new File(path + "/notes/"+title+".png");
Canvas c = new Canvas( b );
view.draw( c );
FileOutputStream fos = new FileOutputStream(f2);
if ( fos != null )
{
b.compress(Bitmap.CompressFormat.PNG, 100, fos );
fos.close();
}
//setWallpaper( b );
} catch( Exception e ){
Log.e("testSaveView", "Exception: " + e.toString() );
}
}
}연락처 Intent
- 연락처 조회
intent = new Intent(Intent.ACTION_VIEW,
Uri.parse("content://contacts/people/" +
String.valueOf(contact.getId())));
startActivity(intent);
- 연락처 등록
intent = new Intent(Intent.ACTION_INSERT,
Uri.parse("content://contacts/people"));
startActivity(intent);
- 연락처 수정
intent = new Intent(Intent.ACTION_EDIT,
Uri.parse("content://contacts/people/" +
String.valueOf(contact.getId())));
startActivity(intent);
- 연락처 삭제
intent = new Intent(Intent.ACTION_DELETE,
Uri.parse("content://contacts/people/" +
String.valueOf(contact.getId())));
startActivity(intent);
전화 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 Intent
- 권한 설정 (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"
- 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://" + contact.getHandphone()));
intent.putExtra("sms_body", "The SMS text");
intent.setType("vnd.android-dir/mms-sms");
startActivity(intent);
이메일 Intent
- 이메일 발송 화면
Intent intent = new Intent(Intent.ACTION_SENDTO,
Uri.parse("mailto:" + contact.getEmail()));
startActivity(intent);
브라우저 Intent
- Browser에서 URL 호출하기
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);
지도 Intent
- 지도 보기
Uri uri = Uri.parse ("geo: 38.00, -35.03");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
안드로이드 마켓 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);
갤럭시S의 Intent
- 패키지명과 클래스명으로 App 호출
intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("패키지명", "전체_클래스명"));
startActivity(intent);
- 전화, SMS
- 전화번호부 : com.android.contacts, com.sec.android.app.contacts.PhoneBookTopMenuActivity
- 전화 : com.sec.android.app.dialertab, com.sec.android.app.dialertab.DialerTabActivity
- 최근기록 : com.sec.android.app.dialertab, com.sec.android.app.dialertab.DialerTabDialerActivity
- 메시지 : com.sec.mms, com.sec.mms.Mms
- 이메일 : com.android.email, com.android.email.activity.Welcome
- 일정 : com.android.calendar, com.android.calendar.LaunchActivity
- 인터넷 : com.android.browser, com.android.browser.BrowserActivity
- Google의 Android용 앱
- 검색 : com.google.android.googlequicksearchbox, com.google.android.googlequicksearchbox.SearchActivity
- 음성 검색 : com.google.android.voicesearch, com.google.android.voicesearch.RecognitionActivity
- Gmail : com.google.android.gm, com.google.android.gm.ConversationListActivityGmail
- 지도 : com.google.android.apps.maps, com.google.android.maps.MapsActivity
- 위치찾기 : com.google.android.apps.maps, com.google.android.maps.LatitudeActivity
- YouTube : com.google.android.youtube, com.google.android.youtube.HomeActivity
- 토크 : com.google.android.talk, com.google.android.talk.SigningInActivity
- Goggles : com.google.android.apps.unveil, com.google.android.apps.unveil.CaptureActivity
- Google 번역 : com.google.android.apps.translate, com.google.android.apps.translate.HomeActivity
- Reader : com.google.android.apps.reader, com.google.android.apps.unveil.CaptureActivity
- Voice : com.google.android.apps.googlevoice, com.google.android.apps.googlevoice.SplashActivity
- Google 별지도 : com.google.android.stardroid, com.google.android.stardroid.activities.SplashScreenActivity
- 카메라 : com.sec.android.app.camera, com.sec.android.app.camera.Camera
- TV : com.sec.android.app.dmb, com.sec.android.app.dmb.activity.DMBFullScreenView
- Android 관리
- 환경 설정 : com.android.settings, com.android.settings.Settings
- 작업 관리자 : com.sec.android.app.controlpanel, com.sec.android.app.controlpanel.activity.JobManagerActivity
- 마켓 : com.android.vending, com.android.vending.AssetBrowserActivity
File apkFile = new File("/sdcard/ApkTest.apk");
Uri apkUri = Uri.fromFile(apkFile);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType( Uri.fromFile(apkFile), "application/vnd.android.package-archive");
startActivity(intent);
this.finish(); // 현재 액티비티 종료
/system/app 권한 풀기 방법 1
1. 올릴 apk 파일을 준비한다.
2. emulator를 실행시킬 때, 다음과 같이 파티션 정보를 준다.
> emulator -avd [avd 이름] -partition-size [size]
ex) avd 이름 : avd2
size : 128
====> 요놈을 안 해준상태로 밀어 넣으면 Out of memory 에러가 난다.
참고로, partition이 필요한 이유는 > adb shell df 로 확인할 수 있겠다.
3. remount 시키며 권한을 준다.
> adb remount rw
4. 밀어 넣는다.
> adb push [ .apk] /system/app
/system/app 권한 풀기 방법 2
1. 단말과 연결하신후 adb shell 커맨드에서 다음과 같이 입력하셔서 이미지 리마운트를 합니다.
# mount -w -o remount -t rfs /dev/stl5 /system
2. 그리고 기존에 apk가 깔려있는 폴더와 파일의 권한을 변경합니다.
# chmod 777 /system/app
# chmod 777 /system/app/MusicPlayer.apk (뮤직어플의 경우)
Uri uri = Uri.parse("http://www.google.com");
Intent it = new Intent(Intent.ACTION_VIEW,uri);
startActivity(it);
// 구글맵 띄우기
Uri uri = Uri.parse("geo:38.899533,-77.036476");
Intent it = new Intent(Intent.Action_VIEW,uri);
startActivity(it);
// 구글 길찾기 띄우기
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=출발지주소&daddr=도착지주소&hl=ko");
Intent it = new Intent(Intent.ACTION_VIEW,URI);
startActivity(it);
// 전화 걸기
Uri uri = Uri.parse("tel:xxxxxx");
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);
Uri uri = Uri.parse("tel.xxxxxx");
Intent it = new Intent(Intent.ACTION_CALL,uri);
// 퍼미션을 잊지 마세요. <uses-permission id="android.permission.CALL_PHONE" />
// SMS/MMS 발송
Intent it = new Intent(Intent.ACTION_VIEW);
it.putExtra("sms_body", "The SMS text");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);
// SMS 발송
Uri uri = Uri.parse("smsto:0800000123");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
it.putExtra("sms_body", "The SMS text");
startActivity(it);
// MMS 발송
Uri uri = Uri.parse("content://media/external/images/media/23");
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra("sms_body", "some text");
it.putExtra(Intent.EXTRA_STREAM, uri);
it.setType("image/png");
startActivity(it);
// 이메일 발송
Uri uri = Uri.parse("mailto:xxx@abc.com");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.setType("text/plain");
startActivity(Intent.createChooser(it, "Choose Email Client"));
Intent it = new Intent(Intent.ACTION_SEND);
String[] tos = {"me@abc.com"};
String[] ccs = {"you@abc.com"};
it.putExtra(Intent.EXTRA_EMAIL, tos);
it.putExtra(Intent.EXTRA_CC, ccs);
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.setType("message/rfc822");
startActivity(Intent.createChooser(it, "Choose Email Client"));
// extra 추가하기
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(it, "Choose Email Client"));
// 미디어파일 플레이 하기
Intent it = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/song.mp3");
it.setDataAndType(uri, "audio/mp3");
startActivity(it);
Uri uri = Uri.withAppendedPath(
MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
// 설치 어플 제거
Uri uri = Uri.fromParts("package", strPackageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
startActivity(it);
// APK파일을 통해 제거하기
Uri uninstallUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);
// APK파일 설치
Uri installUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);
// 음악 파일 재생
Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3");
returnIt = new Intent(Intent.ACTION_VIEW, playUri);
// 첨부파일을 추가하여 메일 보내기
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3");
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(it, "Choose Email Client"));
// 마켓에서 어플리케이션 검색
Uri uri = Uri.parse("market://search?q=pname:pkg_name");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
// 패키지명은 어플리케이션의 전체 패키지명을 입력해야 합니다.
// 마켓 어플리케이션 상세 화면
Uri uri = Uri.parse("market://details?id=어플리케이션아이디");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);
// 아이디의 경우 마켓 퍼블리싱사이트의 어플을 선택후에 URL을 확인해보면 알 수 있습니다.
// 구글 검색
Intent intent = new Intent();
intent.setAction(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY,"searchString")
startActivity(intent);
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if (file.getName().endsWith(".pdf")){
try{
SAMSUNG, LG, Smart Phone Android Open Source
구글링을 통해 소스는 많이 있지만 자바코드에서 특정 웹페이지를 호출해서 session.getId() 를 찍어본 결과
호출 할 때 마다 다른 값이 나오더군요..뭐 근데.. 방법은 의외로 간단한 거였더군요.. 어쩌면 당연한 거였다는..
일단은 session.getId() 값이 같은 값이 나와야 합니다.. 이 값이 계속 바뀐다면 아무리 삽질을 한들 안되겠지요..
HttpClient httpclient = new DefaultHttpClient(); 이부분을 멤버변수로 바로 선언해 버립니다...
보통 다른 소스들은 호출할 때 마다 계속 재 생성하는데.. 재생성을 안하니 유지가 됩니다..ㅋ 그리고 JSESSIONID를 쿠키로 구우면 OK...
setSyncCookie() 안에 들어 있는 코드는 구글링을 통해 얻은 소스입니다.. 많이들 보셨을듯..하네요.. 바뀐부분은 List<Cookie> cookies = ((DefaultHttpClient)httpclient).getCookieStore().getCookies();
이부분인데.. HttpClient 는 getCookieStroe 메소드가 없어서 위처럼 형변환 해줬습니다..
쿠키로 구을 때 Log 찍어보시면 token값과 JSESSIONID도 같이 구워집니다..
그리고 CookieSyncManager.getInstance().startSync(); 가 되면
웹뷰와 연동 됩니다.. 이렇게 안하면 웹뷰에서 접속하는 것과 HttpClient에서 접속하는 것이 따로 놀더군요...
응용해 보시길 바랍니다.. 더 좋은 방법이 있다면 조언해주시구요^^
public class AndroidTet extends Activity {
public HttpClient httpclient = new DefaultHttpClient(); //멤버변수로 선언
public CookieManager cookieManager;
public String domain = "http://192.168.0.44";
public void onCreate(Bundle savedInstanceState) {
...
CookieSyncManager.createInstance(this);
cookieManager = CookieManager.getInstance();
CookieSyncManager.getInstance().startSync();
...
setSyncCookie();
...
public void onResume() {
super.onResume();
CookieSyncManager.getInstance().startSync();
}
public void onPause() {
super.onPause();
if (CookieSyncManager.getInstance() != null) {
}
protected void onDestroy() {
super.onDestroy();
if (cookieManager != null) {
}
public void setSyncCookie() {
Log.e("surosuro", "token transfer start ---------------------------");
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("token", "TEST");// 넘길 파라메터 값셋팅token=TEST
HttpParams params = new BasicHttpParams();
HttpPost post = new HttpPost(domain+/androidToken.jsp");
post.setParams(params);
HttpResponse response = null;
BasicResponseHandler myHandler = new BasicResponseHandler();
String endResult = null;
try {
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
try {
response = httpclient.execute(post);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
endResult = myHandler.handleResponse(response);
} catch (HttpResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
List<Cookie> cookies = ((DefaultHttpClient)httpclient).getCookieStore().getCookies();
if (!cookies.isEmpty()) {
for (int i = 0; i < cookies.size(); i++) {
// cookie = cookies.get(i);
String cookieString = cookies.get(i).getName() + "="
+ cookies.get(i).getValue();
Log.e("surosuro", cookieString);
cookieManager.setCookie(domain, cookieString);
}
}
Thread.sleep(500);
} catch (Exception ex) {
ex.printStackTrace();
}
}
1. layout/main.xml의 progress bar의 android:progressDrawable 속성을 설정한다.
<ProgressBar
android:progressDrawable="@drawable/new_drawable"
...
</ProgressBar>
2. res/drawable/new_drawable.xml 파일을 생성한다.
각 스타일을 설정한다.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+android:id/background" android:drawable="@drawable/backgroundProgress" />
<item android:id="@+android:id/secondaryProgress" android:drawable="@drawable/secondaryProgress" />
<item android:id="@+android:id/progress" android:drawable="@drawable/progress" />
</layer-list>
3. res/drawable 디렉토리 밑에 다음의 파일을 생성한다.
backgroundProgress.png
secondaryProgress.png
progress.png
png파일을 생성하지 않고 drawable로 작성하려면
2b. res/drawable/new_drawable.xml 파일을 다음과 같이 설정한다.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<corners android:radius="0dip" />
<gradient
android:startColor="#ff9d9e9d"
android:centerColor="#ff5a5d5a"
android:centerY="0.75"
android:endColor="#ff747674"
android:angle="270"
/>
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="0dip" />
<gradient
android:startColor="#80ffd300"
android:centerColor="#80ffb600"
android:centerY="0.75"
android:endColor="#a0ffcb00"
android:angle="270"
/>
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="0dip" />
<gradient
android:startColor="#ff0000"
android:centerColor="#00ff00"
android:centerY="0.75"
android:endColor="#0000ff"
android:angle="0"
/>
<stroke android:width="3dp" color="#000000"/>
<padding android:left="10dp" android:top="10dp"
android:right="10dp" android:bottom="10dp" />
</shape>
</clip>
</item>
</layer-list>
바코드 스캔 라이브러리를 소개하려고 한다.
이름이 zxing이다.
소개를 그대로 인용하면
Multi-format 1D/2D barcode image processing library with clients for Android, Java
다중포멧 1D/ 2D 바코드 이미지 프로세싱 라이브러리, Android, Java 클라이언트 용
Project 사이트는 http://code.google.com/p/zxing/ 이다.
라이센스는 Apache License 2.0 이다.
android 뿐만아니라 iPhone같은 다양한 모바일 기기를 지원한다.
라이브러리를 받아서 빌드한뒤 샘플을 만들어 봤는데 1 시간 밖에 걸리지 않았다.
라이브러리 빌드를 위해서는 ant를 설치해야한다.
1. zxing의 core 디렉토리로 이동한뒤 ant명령어를 입력하여 빌드 한다 결과물로 core.jar가 생성된다.
2. Android 프로젝트를 생성한다.
3. Android 프로젝트의 lib 디렉토리를 생성한뒤 core.jar를 안드로이드 lib에 복사
4. Android 프로젝트의 build path에 /lib/core.jar를 추가해 준다.
5. zxing의 android-integration의 java파일을 Android 프로젝트의 src로 복사한다.
6. 적당한 패키지 경로를 수정해 준다.
7. 버튼을 추가하고 IntentIntegrator.initiateScan 바코드 스캔함수를 호출한다.
public class ZxingTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
View scan = findViewById(R.id.scan);
scan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
IntentIntegrator.initiateScan(ZxingTest.this);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//super.onActivityResult(requestCode, resultCode, data);
IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
if (scanResult != null) {
// handle scan result
TextView scanResultText = (TextView) findViewById(R.id.scanResult);
String text = "format="+scanResult.getFormatName()+", data:"+scanResult.getContents();
scanResultText.setText(text);
}
}
}
8. onActivityResult에서 결과를 받아서 처리한다
가끔씩 마주치게 되는 "OutOfMemoryError : bitmap size exceeds VM budget" 에러는 메모리 누수가 주요 원인이다.
이와 관련된 링크를 모아봤다.
* 액티비티가 멈출 때 비트맵을 재활용(즉 GC)되게 하라.
http://stackoverflow.com/questions/1949066/java-lang-outofmemoryerror-bitmap-size-exceeds-vm-budget-android
http://stackoverflow.com/questions/2191407/changing-imageview-content-causes-outofmemoryerror
- bitmap 이미지인 경우 recycle() 호출
- onPause에서 수행하는게 좋음
- ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle();
* 이미지를 미리 줄여서 읽어들여라
http://chiyo85.tistory.com/entry/Android-Bitmap-Object-Resizing-Tip
http://www.memofy.com/memofy/show/1008ab7f2836ab7f01071c2dbfe138/outofmemory-exception-when-decoding-with-bitmapfactory
- BitmapFactory.Options.inSampleSize 활용
* Activity Context에 대한 참조(reference)를 오랫동안 유지하지 말아라
http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
(한글 번역 : http://blog.naver.com/huewu/110082062273 )
- Drawable.setCallback(null) 사용
- WeakReference를 가진 static 내부 클래스
- 이미지를 static 변수로 처리하지 말것.
* 외부 클래스의 상태에 의존하지 않는 내부 클래스는 static으로 선언하라
- 내부 클래스는 외부 클래스를 크게 만들며 또한 외부클래스 객체가 필요 이상으로 오래 살아있게 되어 메모리를
더 차지할 수 있다.
- 외부 클래스의 상태 필드에 접근하지 않는(즉, 외부 객체의 상태에 의존하지 않는) 내부 클래스는 static으로 선언.
* Attacking memory problems on Android
http://ttlnews.blogspot.com/2010/01/attacking-memory-problems-on-android.html
안드로이드 색상코드 형식
AA : 투명도, 00~FF(투명~불투명)
RR : 적색, 00~FF
GG : 녹색, 00~FF
BB : 청색, 00~FF
형식 종류
- #AARRGGBB
- #RRGGBB
- #RGB
이미지 배경을 투명하게하는 값
android:Background = "#00FF0000"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | // 웹페이지 띄우기 Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity(it); // 구글맵 띄우기 Uri uri = Uri.parse( "geo:38.899533,-77.036476" ); Intent it = new Intent(Intent.Action_VIEW,uri); startActivity(it); // 구글 길찾기 띄우기 Intent it = new Intent(Intent.ACTION_VIEW,URI); startActivity(it); // 전화 걸기 Uri uri = Uri.parse( "tel:xxxxxx" ); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity(it); Uri uri = Uri.parse( "tel.xxxxxx" ); Intent it = new Intent(Intent.ACTION_CALL,uri); // 퍼미션을 잊지 마세요. <uses-permission id="android.permission.CALL_PHONE" /> // SMS/MMS 발송 Intent it = new Intent(Intent.ACTION_VIEW); it.putExtra( "sms_body" , "The SMS text" ); it.setType( "vnd.android-dir/mms-sms" ); startActivity(it); // SMS 발송 Uri uri = Uri.parse( "smsto:0800000123" ); Intent it = new Intent(Intent.ACTION_SENDTO, uri); it.putExtra( "sms_body" , "The SMS text" ); startActivity(it); // MMS 발송 Intent it = new Intent(Intent.ACTION_SEND); it.putExtra( "sms_body" , "some text" ); it.putExtra(Intent.EXTRA_STREAM, uri); it.setType( "image/png" ); startActivity(it); // 이메일 발송 Uri uri = Uri.parse( "mailto:xxx@abc.com" ); Intent it = new Intent(Intent.ACTION_SENDTO, uri); startActivity(it); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com" ); it.putExtra(Intent.EXTRA_TEXT, "The email body text" ); it.setType( "text/plain" ); startActivity(Intent.createChooser(it, "Choose Email Client" )); Intent it = new Intent(Intent.ACTION_SEND); String[] tos = { "me@abc.com" }; String[] ccs = { "you@abc.com" }; it.putExtra(Intent.EXTRA_EMAIL, tos); it.putExtra(Intent.EXTRA_CC, ccs); it.putExtra(Intent.EXTRA_TEXT, "The email body text" ); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text" ); it.setType( "message/rfc822" ); startActivity(Intent.createChooser(it, "Choose Email Client" )); // extra 추가하기 Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text" ); sendIntent.setType( "audio/mp3" ); startActivity(Intent.createChooser(it, "Choose Email Client" )); // 미디어파일 플레이 하기 Intent it = new Intent(Intent.ACTION_VIEW); it.setDataAndType(uri, "audio/mp3" ); startActivity(it); Uri uri = Uri.withAppendedPath( MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1" ); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); // 설치 어플 제거 Uri uri = Uri.fromParts( "package" , strPackageName, null ); Intent it = new Intent(Intent.ACTION_DELETE, uri); startActivity(it); // APK파일을 통해 제거하기 Uri uninstallUri = Uri.fromParts( "package" , "xxx" , null ); returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri); // APK파일 설치 Uri installUri = Uri.fromParts( "package" , "xxx" , null ); returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); // 음악 파일 재생 returnIt = new Intent(Intent.ACTION_VIEW, playUri); // 첨부파일을 추가하여 메일 보내기 Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text" ); sendIntent.setType( "audio/mp3" ); startActivity(Intent.createChooser(it, "Choose Email Client" )); // 마켓에서 어플리케이션 검색 Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); // 패키지명은 어플리케이션의 전체 패키지명을 입력해야 합니다. // 마켓 어플리케이션 상세 화면 Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); // 아이디의 경우 마켓 퍼블리싱사이트의 어플을 선택후에 URL을 확인해보면 알 수 있습니다. // 구글 검색 Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, "searchString" ) startActivity(intent); |
Audio :
*패키지의 assets/audio/oh.mp3 플레이
AssetFileDescriptor atd = getAssets().openFd("audio/oh.mp3");
MediaPlayer audio_play = new MediaPlayer();
audio_play.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
audio_play.start();
*패키지의 res/raw/oh.mp3 플레이
MediaPlayer audio_play = MediaPlayer.create(context, R.raw.oh);
audio_play.start();
*파일시스템의 /data/oh.mp3 플레이
MediaPlayer audio_play = new MediaPlayer();
audio_play.setDataSource("/data/oh.mp3");
audio_play.start();
Video :
*파일시스템의 /data/oh.mp4 플레이
VideoView video = (VideoView)findViewById(R.id.video);
MediaController nc = new MediaController(this);
nc.setMediaPlayer(video);
video.setVideoPath("/data/oh.mp4");
video.start();
*패키지의 res/raw/oh.mp4 플레이
VideoView video = (VideoView) findViewById(R.id.video);
video.setVideoURI(Uri.parse("android.resource://패키지명/" + R.raw.파일이름));
video.setMediaController(new MediaController(this));
video.requestFocus();
video.start();