2017.03.07 04:59


Android Studio 에서 Android Version N 이상의 모바일단말을 구동시에 아래와 같은 에러가 발생하는경우 JDK 의 버전을 최신으로 업데이트 해주어야 한다.


Error:(1, 1) A problem occurred evaluating project ':app'.

java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0


# 문제해결 방법

Download latest java jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

In Android Studio , go to File > Project Structure > SDK Location > select JDK Location path to point to the new jdk installed (Ex: C:\Program Files\Java\jdk1.8.0_111 )


저작자 표시
신고


Posted by injunech
2017.03.05 10:30


Android Studio 단축키 Eclipse와 똑같이 설정하기


어쩔수 없이 안드로이드 스튜디오를 쓰는데, 역시 이전에 쓰던 버릇을 고치기가 쉽지 않다.
다른건 어쩔수 없다 쳐도 단축키는 바꿀수가 있는데...


"File > Settings ... " 메뉴로 가서...


"Keymap > Eclipse" 를 지정하면 이클립스에서 사용하던 단축키와 동일하게 바꿔 준다.

저작자 표시
신고


Posted by injunech
2017.02.28 15:16


자바 프로그램을 윈도우 서비스에 등록하는 방법입니다.
여러가지 방법이 있지만 가장 간단하고 편리한 Java Service를 사용하는 방법입니다.
 
  1. JavaService를 받는다.
 
  2. .bat 파일로 서비스 등록에 필요한 내용을 작성한다.
 
  3. 서비스 등록 .bat 파일 예


@set TARGET_APP=com.program.myprogram
@set JVM_PATH="C:\Program Files\Java\jre1.6.0_03\bin\client\jvm.dll"
@set MyProgram_BIN="C:\Program Files\MyProgram\bin"
@set OUT_LOG="C:\Program Files\MyProgram\log\stdout.log"
@set ERR_LOG="C:\Program Files\MyProgram\log\stderr.log"
 
@set CLASSPATH="C:\Program Files\MyProgram\lib\msbase.jar";%CLASSPATH%
@set CLASSPATH="C:\Program Files\MyProgram\lib\mssqlserver.jar";%CLASSPATH%
...
 
@JavaService.exe -install MyProgram %JVM_PATH% -Djava.class.path=%CLASSPATH% -Xms64M -Xmx128M -start %TARGET_APP% -out %OUT_LOG% -err %ERR_LOG% -current %MyProgram_BIN% -description "MyProgram Service"


각 변수는 다음과 같습니다.
     TARGET_APP : main() 이 포함된 클래스명입니다.

     JVM_PATH : 옵션에서 설명하겠지만 서비스 등록에 사용하는 jvm.dll 파일의 경로입니다.

     MyProgram_BIN : 서비스에 등록될 자바 프로그램의 실행 경로입니다.

     CLASSPATH : 자바 프로그램 실행에 필요한 클래스 파일들의 경로입니다.


 Java Service가 사용하는 각 옵션 값은 다음과 같습니다.
      -install MyProgram : 윈도우 서비스에 MyProgram 란 이름으로 등록
 
      %JVM_PATH% : Java 서비스 등록을 위해 사용하는 dll. JDK나 JRE가 설치된 곳에 있음.
                               {JDK_HOME}/jre/bin/[server|client]/jvm.dll
                               {JRE_HOME}/bin/[server|client]/jvm.dll
 
       -Djava.class.path : 프로그램 실행을 위한 Java Classpath.
      
       -Xms64M -Xmx128M : class path 이후에는 Java VM 옵션
 
       -start : main() 메소드가 있는 시작 클래스명
 
       -out : 서비스 등록 후 출력하는 로그
 
       -err : 서비스 등록 후 출력하는 에러 로그
 
       -current : 프로그램의 실행 위치
 
       -description : 서비스에 등록될때 해당 서비스의 설명 내용


위와 같은 .bat 파일을 만들어 실행을 하면 서비스로 등록이 됩니다.
등록된 서비스를 해제하기 위해서 아래와 같은 커맨드를 실행합니다.
.bat 파일로 만들어도 되고요.


JavaService.exe -uninstall MyProgram



저작자 표시
신고


Posted by injunech
2017.02.27 19:06


안드로이드 화면을 그리는 xml 에서 특수문자를 사용하면 아래와 같은 에러 메시지가 발생함을 보실수 있습니다.


[잘못된 예]

   <TextView

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="TEST & CHAR"

     />


[에러 메시지]

 Multiple annotations found at this line:

- The entity name must immediately follow the '&' in the entity reference.

- [I18N] Hardcoded string "HOME & TECH", should use @string resource


특수문자를 사용하기 위해서는 string에 선언해 놓고 불러서 쓰는 방법이 있습니다만 귀찮은 관계로 유니코드형태로 입력을 해보도록 하겠습니다. 특수문자의 유니코드를 알기 위해서는 구글링링을 하면 됩니다. 하지만 저는 또한 귀찮은 관계로 컴퓨터에 내장된 프로그램을 이용해서 찾아보도록 하겠습니다.


[해결 방법]

시작버튼>실행>charmap 입력





원하는 특수문자 선택




& 같은 경우는 U+0026: Ampersand 라고 표시됨을 볼수 있습니다.

3.  이제 xml 로 돌아가서

 역슬래시 0026 --> \u0026 로 입력을 해주면 됩니다.



[특수문자 사용한 xml 예시]

     <TextView

         android:layout_width="wrap_content"

         android:layout_height="wrap_content"

         android:text="HOME \u0026 TECH"

      />



출처: http://al02000.tistory.com/4 

저작자 표시
신고


Posted by injunech
2017.02.27 13:04


내장된 ArrayList의 사용법

생성

ArrayList를 사용하기 위해서는 우선 ArrayList 객체를 만들어야 합니다.

1
ArrayList<Integer> numbers = new ArrayList<Integer>();

ArrayList는 java.util.ArrayList에 포함되어 있기 때문에 import를 해주셔야 합니다.

1
import java.util.ArrayList;

추가

엘리먼트를 추가 할 때는 add 메소드를 사용합니다. add는 배열에 단순히 더해지는 것이기 때문에 빠르게 동작합니다.

1
2
3
4
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);

특정 위치에 추가하고 싶다면 메소드 add의 첫번째 인자로 인덱스를 지정합니다.

1
numbers.add(1, 50);

자바의 배열은 크기가 고정되어 있습니다. 데이터를 추가하는 과정에서 내부적으로 사용하는 배열이 꽉차면 기존의 배열 대비 크기가 2배 큰 새로운 배열을 만들고 기존의 데이터를 새로운 배열로 복제합니다. 덕분에 프로그래머는 ArrayList의 크기에 신경쓰지 않고 편리하게 프로그램을 만들 수 있습니다. 하지만 배열의 크기를 키우는 과정에서 많은 부하가 발생합니다. 이런 기능은 List 데이터 스트럭쳐의 본질적인 기능이라고 할 수는 없습니다. 따라서 우리 수업에서는 다루지 않습니다. 궁금하신 분은 Dynamic Array를 참고해주세요.

삭제

특정 인덱스에 위치하는 엘리먼트를 삭제할 때는 remove를 사용합니다.

1
numbers.remove(2);

가져오기

엘리먼트를 가져올 때는 get을 사용합니다. 이때 내부적으로 배열을 이용하기 때문에 매우 빠르게 엘리먼트를 가져올 수 있습니다.

1
numbers.get(2);

반복

자바에서는 ArrayList를 탐색하기 위한 방법으로 iterator을 제공합니다. 이것은 주로 객체지향 프로그래밍에서 사용하는 반복기법입니다. 우선 Iterator 객체를 만들어야 합니다.

1
Iterator it<Integer> = numbers.iterator();

Iterator 객체는 numbers 객체 내부에 저장된 값을 하나씩 순회하면서 탐색할 수 있도록 돕는 객체입니다.

1
2
3
while(it.hasNext()){
System.out.println(it.next());
}

it.next() 메소드를 호출할 때마다 엘리먼트를 순서대로 리턴합니다. 만약 더 이상 순회할 엘리먼트가 없다면 it.hasNext()의 값은 false가 되면서 while문이 종료 됩니다.

단순 출력을 위해서 순회를 하지는 않겠지요? 순회 과정에서 필요에 따라서는 엘리먼트를 삭제/추가하는 작업을 해야 할 것입니다. 그런 경우 아래와 같이 처리할 수 있습니다.

1
2
3
4
5
6
while(it.hasNext()){
int value = it.next();
if(value == 30){
it.remove();
}
}

it.remove()는 it.next()를 통해서 반환된 numbers의 엘리먼트를 삭제하는 명령입니다.

조금 더 편리한 방법도 있습니다.

1
2
3
for(int value : numbers){
System.out.println(value);
}


전체코드

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
package list.arraylist.api;
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
System.out.println("add(값)");
System.out.println(numbers);
numbers.add(1, 50);
System.out.println("\nadd(인덱스, 값)");
System.out.println(numbers);
numbers.remove(2);
System.out.println("\nremove(인덱스)");
System.out.println(numbers);
System.out.println("\nget(인덱스)");
System.out.println(numbers.get(2));
System.out.println("\nsize()");
System.out.println(numbers.size());
System.out.println("\nindexOf()");
System.out.println(numbers.indexOf(30));
Iterator it = numbers.iterator();
System.out.println("\niterator");
while (it.hasNext()) {
int value = (int) it.next();
if (value == 30) {
it.remove();
}
System.out.println(value);
}
System.out.println(numbers);
System.out.println("\nfor each");
for (int value : numbers) {
System.out.println(value);
}
System.out.println("\nfor");
for (int i = 0; i < numbers.size(); i++) {
System.out.println(numbers.get(i));
}
}
}



출처 : https://opentutorials.org/module/1335/8711



저작자 표시
신고


Posted by injunech
2017.02.21 21:15


View 절대 좌표값 구하는 방법


View.getLocatioinOnScreen(int[]);

위와 같은 함수를 사용하면 전체 스크린상의 절대 위치의 좌표를 구할수 있다.

예시로 아래와 같이 사용하면 된다.


 public boolean chkTouchInside(View view, int x, int y) {
 int[] location = new int[2];
 view.getLocationOnScreen(location);
 if (x >= location[0]) {
  if (x <= location[0] + view.getWidth()) {
   if (y >= location[1]) {
    if (y <= location[1] + view.getHeight()) {
     return true;
    }
   }
  }
 }
 return false;
} 


저작자 표시
신고


Posted by injunech
2017.02.21 10:36




ASCII 코드표

ASCII 코드표
문자10진수16진수2진수

(null)

0

00

00000000

1

01

00000001

2

02

00000010

3

03

00000011

4

04

00000100

5

05

00000101

6

06

00000110

7

07

00000111

8

08

00001000

9

09

00001001

10

0A

00001010

11

0B

00001011

12

0C

00001100

13

0D

00001101

14

0E

00001110

15

0F

00001111

16

10

00010000

17

11

00010001

18

12

00010010

19

13

00010011

20

14

00010100

§

21

15

00010101

-

22

16

00010110

23

17

00010111

24

18

00011000

25

19

00011001

26

1A

00011010

27

1B

00011011

28

1C

00011100

29

1D

00011101

30

1E

00011110

31

1F

00011111

(공백)

32

20

00100000

!

33

21

00100001

"

34

22

00100010

#

35

23

00100011

$

36

24

00100100

%

37

25

00100101

&

38

26

00100110

'

39

27

00100111

(

40

28

00101000

)

41

29

00101001

*

42

2A

00101010

+

43

2B

00101011

´

44

2C

00101100

-

45

2D

00101101

.

46

2E

00101110

/

47

2F

00101111

0

48

30

00110000

1

49

31

00110001

2

50

32

00110010

3

51

33

00110011

4

52

34

00110100

5

53

35

00110101

6

54

36

00110110

7

55

37

00110111

8

56

38

00111000

9

57

39

00111001

:

58

3A

00111010

;

59

3B

00111011

<

60

3C

00111100

=

61

3D

00111101

>

62

3E

00111111

?

63

3F

00111111

64

40

01000000

A

65

41

01000001

B

66

42

01000010

C

67

43

01000011

D

68

44

01000100

E

69

45

01000101

F

70

46

01000110

G

71

47

01000111

H

72

48

01001000

I

73

49

01001001

J

74

4A

01001010

K

75

4B

01001011

L

76

4C

01001100

M

77

4D

01001101

N

78

4E

01001110

O

79

4F

01001111

P

80

50

01010000

Q

81

51

01010001

R

82

52

01010010

S

83

53

01010011

T

84

54

01010100

U

85

55

01010101

V

86

56

01010110

W

87

57

01010111

X

88

58

01011000

Y

89

59

01011001

Z

90

5A

01011010

[

91

5B

01011011

92

5C

01011100

]

93

5D

01011101

^

94

5E

01011110

95

5F

01011111

96

60

01100000

a

97

61

01100001

b

98

62

01100010

c

99

63

01100011

d

100

64

01100100

e

101

65

01100101

f

102

66

01100110

g

103

67

01100111

h

104

68

01101000

i

105

69

01101001

j

106

6A

01101010

k

107

6B

01101011

l

108

6C

01101100

m

109

6D

01101101

n

110

6E

01101110

o

111

6F

01101111

p

112

70

01110000

q

113

71

01110001

r

114

72

01110010

s

115

73

01110011

t

116

74

01110100

u

117

75

01110101

v

118

76

01110110

w

119

77

01110111

x

120

78

01111000

y

121

79

01111001

z

122

7A

01111010

{

123

7B

01111011

|

124

7C

01111100

}

125

7D

01111101

-

126

7E

01111110

127

7F

01111111

Ç

128

80

10000000

ü

129

81

10000001

é

130

82

10000010

â

131

83

10000011

ä

132

84

10000100

à

133

85

10000101

å

134

86

10000110

ç

135

87

10000111

ê

136

88

10001000

ë

137

89

10001001

è

138

8A

10001010

ï

139

8B

10001011

î

140

8C

10001100

ì

141

8D

10001101

Ä

142

8E

10001110

Å

143

8F

10001111

É

144

90

10010000

æ

145

91

10010001

Æ

146

92

10010010

Ô

147

93

10010011

Ö

148

94

10010100

Ò

149

95

10010101

û

150

96

10010110

ù

151

97

10010111

ÿ

152

98

10011000

ö

153

99

10011001

Ü

154

9A

10011010

155

9B

10011011

£

156

9C

10011100

¥

157

9D

10011101

Pt

158

9E

10011110

ƒ

159

9F

10011111

á

160

A0

10100000

í

161

A1

10100001

ó

162

A2

10100010

ú

163

A3

10100011

ñ

164

A4

10100100

Ñ

165

A5

10100101

ª

166

A6

10100110

167

A7

10100111

¿

168

A8

10101000

169

A9

10101001

¬

170

AA

10101010

½

171

AB

10101011

¼

172

AC

10101100

¡

173

AD

10101101

«

174

AE

10101110

»

175

AF

10101111

176

B0

10110000

177

B1

10110001

178

B2

10110010

179

B3

10110011

180

B4

10110100

181

B5

10110101

182

B6

10110110

183

B7

10110111

184

B8

10111000

185

B9

10111001

186

BA

10111010

187

BB

10111011

188

BC

10111100

189

BD

10111101

190

BE

10111110

191

BF

10111111

192

C0

11000000

193

C1

11000001

194

C2

11000010

195

C3

11000011

196

C4

11000100

197

C5

11000101

198

C6

11000110

199

C7

11000111

200

C8

11001000

201

C9

11001001

202

CA

11001010

203

CB

11001011

204

CC

11001100

205

CD

11001101

206

CE

11001110

207

CF

11001111

208

D0

11010000

209

D1

11010001

210

D2

11010010

211

D3

11010011

212

D4

11010100

213

D5

11010101




저작자 표시
신고

'Computer > Etc' 카테고리의 다른 글

ASCII Code Table  (0) 2017.02.21
정규식 문법 이해  (0) 2015.04.05
2015년 프로그래밍 언어 사용률  (0) 2015.03.05
[Tistory] 티스토리 본문 폭 변경하기  (0) 2015.02.22
[Git] Git 설치 및 초기 설정  (0) 2015.02.16


Posted by injunech
2017.02.19 23:31


다음팟과 카카오TV의 통합으로 인해 다음 팟플레이어의 스킨이 누런색으로 도배가 됐다.

기존에 다음팟 기본 스킨의 색상과 깔끔함이 무척이나 마음에 들었는데

지금은 무척 마음에 안든다...


업데이트된 이후 누런색으로 도배된 팟플레이어


그래서 예전 다음팟플레이어의 Skin 을 사용할 수 있는 방법을 공유 !!

아래와 같이 따라하시면 됩니다.


OldDefault.dsf

DaumPot.dsf



위의 Skin 파일을 다운로드 받아 DAUM Pot을 설치한 경로의 Sking 폴더상에 넣어준다.


C:\Program Files\DAUM\PotPlayer\Skins

C:\Program Files (x86)\DAUM\PotPlayer\Skins


업데이트 이후에 아래의 스크린샷과 같이 스킨을 설정해준다.

참 쉽죠??



변경된 팟플레이어 스킨~! 굳!


저작자 표시
신고

'Life > Etc..' 카테고리의 다른 글

F 전투기 시리즈 이름  (0) 2017.06.20
다음팟플레이어 스킨  (0) 2017.02.19
베토벤9번 합창 교향곡 4악장  (0) 2017.01.05
온도 단위의 정보  (0) 2016.11.14
롯데마트 휴무일  (0) 2015.03.15
홈플러스 휴무일  (0) 2015.03.15


Posted by injunech
2017.02.19 01:07


Color 지정방법에 대한 다양한 방법 소개


You can use various functions from the Color class to get the same effect of course.

  • holder.text.setTextColor(Color.RED);

  • Color.parseColor (Manual) (like LEX uses)

    text.setTextColor(Color.parseColor("#FFFFFF"));
  • Color.rgb and Color.argb (Manual rgb) (Manual argb) (like Ganapathy uses)

    holder.text.setTextColor(Color.rgb(200,0,0));
    holder.text.setTextColor(Color.argb(0,200,0,0));
  • And of course, if you want to define your color in an XML file, you can do this:

    <color name="errorColor">#f00</color>

    because the getColor() function is deprecated1, you need to use it like so:

    ContextCompat.getColor(context, R.color.your_color);
  • You can also insert plain HEX, like so:

    myTextView.setTextColor(0xAARRGGBB);

    Where you have an alpha-channel first, then the color value.

Check out the complete manual of course, public class Color extends Object.


https://developer.android.com/reference/android/graphics/Color.html#parseColor(java.lang.String)



저작자 표시
신고


Posted by injunech
2017.02.15 09:31


타이젠 네이티브 앱을 개발하려면 네이티브 API를 사용해야합니다.

그리고 일부 네이티브 API는 별도의 Privilege 권한이 있어야 사용할 수 있습니다.


타이젠 네이티브 API에 어떤 Privilege가 있는지 살펴보고,

어떤 식으로 관리되고 있는지 훔쳐보도록 하겠습니다.


Tizen 2.3으로 오픈된 소스를 기반으로 정리하였습니다.



타이젠 SDK에서 관리하는 Privilege를 찾아보았습니다.

git://review.tizen.org/sdk/doc/content의 master브랜치,

api-reference/native/tools/privilege_desc.txt 파일에 Privilege가 명시되어 있습니다.

privilege_desc.txt를 그대로 가져오고,

각각 한글로 간단하게 번역해두었습니다.


http://tizen.org/privilege/account.read
Allows the application to read accounts.
계정을 읽을 수 있습니다.

http://tizen.org/privilege/account.write    
Allows the application to create, update, and delete accounts.    
계정을 생성, 수정, 삭제할 수 있습니다.

http://tizen.org/privilege/alarm    
Allows the application to set an alarm and wake the device up at the scheduled time.    
알람을 설정하고 디바이스를 알람시간에 깨울 수 있습니다.

http://tizen.org/privilege/application.launch    
Allows the application to be opened conditionally or to open another application.    
앱을 상황에 맞게 열거나 다른 앱을 런칭할 수 있습니다.

http://tizen.org/privilege/appmanager.kill    
Allows the application to close another application.
다른 앱을 닫을 수 있습니다.

http://tizen.org/privilege/appmanager.launch    
Allows the application to manage another application opening conditionally.    
다른 앱을 조건에 맞게 열 수 있습니다.

http://tizen.org/privilege/appmanager.setting    
Allows the application to read and update default application preferences.    
디폴트 앱의 설정을 읽고 수정할 수 있습니다.

http://tizen.org/privilege/appsetting    
Allows the application to manage application settings.
앱의 설정을 관리할 수 있습니다.    

http://tizen.org/privilege/appusage    
Allows the application to receive notifications about foreground application changes.    
foreground에 있는 앱의 변화를 받을 수 있습니다.

http://tizen.org/privilege/appwidgetprovider.install    
Allows the application to add Dynamic Box to the home screen.    
다이나믹박스를 홈스크린에 추가할 수 있습니다.

http://tizen.org/privilege/audiomanager.route    
Allows the application to set audio input and output routes and receive notifications about route events.    
오디오 입출력 경로를 설정하고 경로이벤트에 대한 알림을 받을 수 있습니다.

http://tizen.org/privilege/audiorecorder    
Allows the application to manage audio recording.    
오디오레코딩을 관리할 수 있습니다.

http://tizen.org/privilege/bluetooth.admin    
Allows the application to change Bluetooth settings, such as turning Bluetooth on or off, and setting the local device name.    
블루투스 설정을 변경할 수 있습니다. - 블루투스 on / off, 로컬 디바이스 이름 변경

http://tizen.org/privilege/bluetooth.gap    
Allows the application to use the Generic Access Profile (GAP), for example, to scan for and pair devices.    
Generic Access Profile(GAP)을 사용할 수 있습니다. - 페어 디바이스를 스캔하기 등

http://tizen.org/privilege/bluetooth.health    
Allows the application to use the Health Device Profile (HDP), for example, to send health data.    
Health Device Profile을 사용할 수 있습니다. - 헬스 데이타 보내기 등

http://tizen.org/privilege/bluetooth.opp    
Allows the application to use the Object Push Profile (OPP), for example, to send files.
Object Push Profile을 사용할 수 있습니다. - 파일 보내기 등

http://tizen.org/privilege/bluetooth.spp    
Allows the application to use the Serial Port Profile (SPP), for example, to send serial data.    
Serial Port Profile을 사용할 수 있습니다. - 시리얼 데이타 보내기 등

http://tizen.org/privilege/bluetoothmanager    
Allows the application to change Bluetooth system settings related to privacy and security, such as the visible mode.    
블루투스 시스템 설정(프라이버시, 시큐리티)을 변경할 수 있습니다. - visible 모드 등

http://tizen.org/privilege/bookmark.read    
Allows the application to read bookmarks.    
북마크를 읽을 수 있습니다.

http://tizen.org/privilege/bookmark.write    
Allows the application to create, update, and delete bookmarks.    
북마크를 생성, 수정, 삭제할 수 있습니다.

http://tizen.org/privilege/calendar.read    
Allows the application to read schedule and task information.    
스케쥴과 업무 정보를 읽을 수 있습니다.

http://tizen.org/privilege/calendar.write
Allows the application to create, update, and delete schedule and task information.    
스캐쥴과 업무 정보를 생성, 수정, 삭제할 수 있습니다.

http://tizen.org/privilege/callforward
Allows the application to control the call forwarding service.    
콜 포워딩 서비스를 컨트롤할 수 있습니다.

http://tizen.org/privilege/camera
Allows the application to manage device cameras to preview and capture pictures.
프리뷰를 보고 사진을 찍을 수 있습니다.

http://tizen.org/privilege/cellbroadcast
Allows the application to manage the Cell Broadcast Service (CBS).    
Cell Broadcast Service를 관리할 수 있습니다.

http://tizen.org/privilege/certificate.read
Allows the application to read certificates.    
인증서를 읽을 수 있습니다.

http://tizen.org/privilege/certificate.write
Allows the application to add, update, and delete certificates.    
인증서를 추가, 수정, 삭제할 수 있습니다.

http://tizen.org/privilege/contact.read
Allows the application to read contacts.
연락처 정보를 읽을 수 있습니다.

http://tizen.org/privilege/contact.write
Allows the application to add, update, and delete contacts.    
연락처 정보를 추가, 수정, 삭제할 수 있습니다.

http://tizen.org/privilege/content.read
Allows the application to read content.    
컨텐츠를 읽을 수 있습니다.

http://tizen.org/privilege/content.write
Allows the application to create, update, and delete content.    
컨텐츠를 추가, 수정, 삭제할 수 있습니다.

http://tizen.org/privilege/customnetaccount
Allows the application to use the Internet with a specified bearer.
특정 배러와 함께 인터넷을 사용할 수 있습니다.

http://tizen.org/privilege/datacontrol.consumer
Allows the application to access specific data exported by other applications.
다른 앱이 준 데이타에 접근할 수 있습니다.

http://tizen.org/privilege/dns
Allows the application to provide the Domain Name Service (DNS).    
Domain Name Service를 제공할 수 있습니다.

http://tizen.org/privilege/download
Allows the application to manage HTTP downloads.    
HTTP 다운로드를 관리할 수 있습니다.

http://tizen.org/privilege/geolocationpermission.read
Allows the application to read geolocation permissions.    
지리정보 권한을 읽을 수 있습니다.

http://tizen.org/privilege/geolocationpermission.write
Allows the application to delete geolocation permissions.    
지리정보 권한을 지울 수 있습니다.

http://tizen.org/privilege/http
Allows the application to communicate with the HTTP server.    
HTTP 서버와 통신할 수 있습니다.

http://tizen.org/privilege/ime
Allows the application to provide a way to input characters and symbols into an associated input field.    
소프트웨어 키보드를 제공할 수 있습니다.

http://tizen.org/privilege/imemanager
Allows the application to manage the installed input methods.    
설치된 소프트웨어 키보드를 관리할 수 있습니다.


http://tizen.org/privilege/inputmanager
Allows the application to generate touch and key events, and capture screens.    
터치, 키 이벤트를 만들고 스크린을 캡쳐할 수 있습니다.


http://tizen.org/privilege/location
Allows the application to use the user location data.  
유저의 지리데이터를 이용할 수 있습니다.  

http://tizen.org/privilege/lockmanager
Allows the application to unlock the device.    
디바이스를 언락할 수 있습니다.

http://tizen.org/privilege/messaging.read
Allows the application to receive messages, and to retrieve messages from the message boxes.    
메시지를 받고 메시지박스에서 메시지를 긁어올 수 있습니다.

http://tizen.org/privilege/messaging.write
Allows the application to write SMS, MMS, and email messages.    
SMS, MMS와 이메일을 쓸 수 있습니다.

http://tizen.org/privilege/netstatisticsmanager
Allows the application to reset network statistics.    
네트워크 정보를 리셋할 수 있습니다.

http://tizen.org/privilege/network.account
Allows the application to manage network accounts.    
네트워크 계정을 관리할 수 있습니다.

http://tizen.org/privilege/network.connection
Allows the application to manage network connections.    
네트워크 커넥션을 관리할 수 있습니다.

http://tizen.org/privilege/network.statistics
Allows the application to read network statistics.    
네트워크 정보를 읽을 수 있습니다.

http://tizen.org/privilege/networkmanager
Allows the application to update system network accounts.
시스템 네트워크 계정을 수정할 수 있습니다.

http://tizen.org/privilege/nfc.admin
Allows the application to change NFC settings, such as turning NFC on or off.    
NFC 설정을 변경할 수 있습니다. - NFC on / off

http://tizen.org/privilege/nfc.common
Allows the application to use NFC common features.    
NFC 공통 기능을 사용할 수 있습니다.

http://tizen.org/privilege/nfc.p2p
Allows the application to push NFC messages to other devices.    
다른 기기에 NFC 메시지를 푸쉬할 수 있습니다.

http://tizen.org/privilege/nfc.tag
Allows the application to read and write NFC tag information.    
NFC 태그정보를 읽고 쓸 수 있습니다.

http://tizen.org/privilege/nfcmanager
Allows the application to change NFC system settings, such as turning on or off reserved push, which sends predefined NDEF messages.    
NFC 시스템 설정을 변경할 수 있습니다. - 예약 푸쉬를 on / off 하기

http://tizen.org/privilege/notification
Allows the application to provide user notifications, such as messages and badges.    
유저 알림을 제공할 수 있습니다. - 메시지나 배지

http://tizen.org/privilege/package.info
Allows the application to receive package information.    
패키지 정보를 받을 수 있습니다.

http://tizen.org/privilege/packagemanager.info
Allows the application to receive detailed package information.    
자세한 패키지 정보를 받을 수 있습니다.

http://tizen.org/privilege/packagemanager.install
Allows the application to install or uninstall application packages.    
앱 패키지를 설치 혹은 삭제할 수 있습니다.

http://tizen.org/privilege/packagemanager.setting
Allows the application to set package configurations.    
패키지 설정값을 변경할 수 있습니다.

http://tizen.org/privilege/power
Allows the application to hold and control power states.    
파워 상태를 유지하거나 조절할 수 있습니다.

http://tizen.org/privilege/privacymanager.read
Allows the application to read privacy settings.    
프라이버시 설정값을 읽을 수 있습니다.

http://tizen.org/privilege/privacymanager.write
Allows the application to change privacy settings.   
프라이버시 설정을 변경할 수 있습니다.  

http://tizen.org/privilege/privilegemanager.read
Allows the application to read privilege information.    
프라이버스 정보를 읽을 수 있습니다.

http://tizen.org/privilege/push
Allows the application to receive push notifications.    
푸쉬 알림을 받을 수 있습니다.

http://tizen.org/privilege/secureelement
Allows the application to access to secure smart card chip such as UICC/SIM, embedded secure element, or secure SD card.    
UICC/SIM 카드에 접근할 수 있습니다.

http://tizen.org/privilege/setting
Allows the application to update or read user settings.    
유저 설정을 읽거나 수정할 수 있습니다.

http://tizen.org/privilege/settingmanager.read
Allows the application to read security or privacy settings.    
시큐리티나 프라이버시 설정을 읽을 수 있습니다.

http://tizen.org/privilege/settingmanager.write
Allows the application to change security or privacy settings.    
시큐리티나 프라이버시 설정을 변경할 수 있습니다.

http://tizen.org/privilege/shortcut.install
Allows the application to add and remove shortcuts from the home screen.    
홈스크린에서 숏컷을 추가 혹은 삭제할 수 있습니다.

http://tizen.org/privilege/smstrigger
Allows the application to receive SMS messages from a specified port.
특정 포트로부터 SMS 메시지를 받을 수 있습니다.

http://tizen.org/privilege/socket
Allows the application to communicate with other devices and servers.
다른 디바이스나 서버와 통신할 수 있습니다.

http://tizen.org/privilege/system
Allows the application to access system information.
시스템 정보에 접근할 수 있습니다.

http://tizen.org/privilege/systemmanager
Allows the application to access secure system information.
보안 시스템 정보에 접근할 수 있습니다.

http://tizen.org/privilege/telephony
Allows the application to retrieve telephony information, such as network, SIM, and call details.
텔레포니 정보를 긁어올 수 있습니다. - Network, SIM, Call 상제정보

http://tizen.org/privilege/telephonymanager
Allows the application to configure the mobile networks.
모바일 네트워크를 설정할 수 있습니다.


http://tizen.org/privilege/uimanager
Allows the application to manage UI properties.    
UI 속성을 관리할 수 있습니다.

http://tizen.org/privilege/userprofile.read
Allows the application to read the user profile.
유저 프로파일을 읽을 수 있습니다.

http://tizen.org/privilege/userprofile.write
Allows the application to manage the user profile.
유저 프로파일을 관리할 수 있습니다.

http://tizen.org/privilege/vibrator
Allows the application to turn on and use vibrate.
진동키능을 켜겨나 사용할 수 있습니다.

http://tizen.org/privilege/videorecorder
Allows the application to manage video recording with the camera.
카메라를 사용하여 비디오 녹화를 할 수 있습니다.

http://tizen.org/privilege/wappush
Allows the application to manage WAP push messages.
WAP 푸쉬 메시지를 관리할 수 있습니다.

http://tizen.org/privilege/web.privacy
Allows the application to manage the user data stored by the Web control or browser.
웹컨트롤이나 브라우저에서 저장된 유저데이터를 관리할 수 있습니다.

http://tizen.org/privilege/web.service
Allows the application to display Web content or use the Web content-related API.
웹컨텐트를 표시하고 웹컨텐트 관련 함수를 사용할 수 있습니다.

http://tizen.org/privilege/wifi.admin
Allows the application to manage Wi-Fi on the device, such as turning Wi-Fi on or off, and connecting to AP.
Wi-Fi를 관리할 수 있습니다. - 와이파이를 on / off 하고, AP에 접속하기

http://tizen.org/privilege/wifi.read
Allows the application to request Wi-Fi information.
Wi-Fi 정보를 요청할 수 있습니다.

http://tizen.org/privilege/wifi.wifidirect.admin
Allows the application to manage Wi-Fi Direct on the device.
Wi-Fi Direct 기능을 관리할 수 있습니다.

http://tizen.org/privilege/wifi.wifidirect.read
Allows the application to request Wi-Fi Direct information.
Wi-Fi Direct 정보를 요청할 수 있습니다.

http://tizen.org/privilege/wifimanager
Allows the application to manage the Wi-Fi system settings, such as updating AP information.
Wi-Fi 시스템 설정을 관리할 수 있습니다. - AP 정보 갱신 등


위에서 기술된 Privilege를 앱에서 사용하는 것이지요.

플랫폼 버전마다 사용할 수 있는 Privilege는 다를 수 있습니다.


SDK에서 개발할 때는,

- Project Explorer에서 자신의 프로젝트 내에 있는 tizen-manifest.xml 선택

- Tizen Manifest Editor에서 Privileges 탭 선택

- Add 버튼을 눌러 Privilege를 추가할 수 있습니다.



SDK 외부에서 개발할 경우에는,

각 앱의 xml파일에 직접 Privilege를 기술해야 합니다.


<?xml version="1.0" encoding="utf-8" ?>
<manifest xmlns="http://tizen.org/ns/packages" package="org.tizen.data-provider-slave" version="1.0.0" install-location="auto" support-mode="screen-reader">
    <!-- ... 생략 ... -->
    <ui-application appid="org.tizen.data-provider-slave" exec="/usr/apps/org.tizen.data-provider-slave/bin/data-provider-slave" nodisplay="true" multiple="true" type="capp" taskmanage="false">
    <!-- ... 생략 ... -->
    </ui-application>
    <privileges>
        <privilege>http://tizen.org/privilege/location</privilege>
        <privilege>http://developer.samsung.com/tizen/privilege/privacymanager.read</privilege> <!-- weather -->
    </privileges>
    <!-- ... 생략 ... -->
</manifest>


위의 코드는 git://review.tizen.org/apps/livebox/data-provider-slave의 tizen_2.3 브랜치,

org.tizen.data-provider-slave.xml 파일에서 따왔습니다.

SDK 외부에서 개발하는 앱은 위처럼 자신에게 필요한 Privilege를 xml 파일에 직접 추가해야 하지요.


Security/Tizen 2.X smack-privilege-config


앱에 추가된 Privilege는,

앱이 설치되는 시점에 Privilege 레벨에서 Smack 레벨로 변경됩니다.


git://review.tizen.org/framework/security/smack-privilege-config의 tizen_2.3 브랜치,

permissions_mobile/permissions_2_3_0 디렉토리에는 수많은 *.smack 파일이 있습니다.

그 중 EFL_org.tizen.privilege.camera.smack 파일을 열어보겠습니다.


~APP~ device::camera rw----
~APP~ mm_qcamera_daemon -w----
~APP~ privilege::tizen::camera rw----
~APP~ system::vconf_multimedia rw----


카메라를 사용하기 위해 필요한 스맥룰이 명시되어 있습니다.

~APP~은 위의 privilege를 설정한 앱의 스맥레이블로 치환될 것입니다.

간단히 내용을 살펴보면,

device::camera에 접근하기 위한 읽고 쓰는 권한,

mm_qcamera_daemon에 쓰기 권한,

privilege::tizen::camera를 읽고 쓰는 권한,

system::vconf_multimedia를 읽고 쓰는 권한 등의 스맥권한을 부여합니다.


이렇게 부여된 스맥레이블은,

네이티브 API가 사용하는 파일/디렉토리 등에 접근할 수 있게 할겁니다.

만약 제대로된 스맥레이블 없이 파일/디렉토리에 접근하려하면 Permission denied 에러가 나오겠죠.


git://review.tizen.org/framework/security/privilege-checker의 tizen_2.3 브랜치,

capi/src/privilege_checker.c 소스를 살펴보면,

앱이 Privilege를 가지고 있는지 여부를 직접 체크하는 부분도 있습니다.


int privilege_checker_check_package_privilege(const char* package_id, const char* privilege_name)
{
    // ... 생략 ...
    //find privilege in cache
    for(i=0; i<g_cached_privileges_size; i++)
    {
        if(hash_value == g_cached_privileges[i].hash_value)
        {
            matched_index = i;
            ++matched_cnt;
        }
    }

    if(matched_cnt == 1){
        LOGD("Found cached hash privilege");
        return PRIV_CHECKER_ERR_NONE;

    }
    // ... 생략 ...
    LOGD("Not Found cached privilege");

    // ... 생략 ...
    res = pkgmgrinfo_pkginfo_foreach_privilege(handle, __privilege_checker_privilege_list_by_pkgid_cb, user_data);
    // ... 생략 ...

    TryReturn(g_isMached == true, PRIV_CHECKER_ERR_INVALID_PRIVILEGE, "[PRIV_CHECKER_ERR_INVALID_PRIVILEGE] %s privilege denied", privilege_name);

    return PRIV_CHECKER_ERR_NONE;
}

그래서 API를 수행할 때, API를 호출한 앱의 권한을 체크하여 수행여부를 결정하게 됩니다.

예를 들어,

git://review.tizen.org/framework/api/application의 tizen_2.3 브랜치,

app_control/app_control.c 소스를 보면 Call Operaion로 런칭요청이 온 경우 Privilege가 있는지 체크합니다.


int app_control_send_launch_request(app_control_h app_control, app_control_reply_cb callback, void *user_data)
{
    // ... 생략 ...
    // Check the privilege for call operation
    if (!strcmp(operation, APP_CONTROL_OPERATION_CALL))
    {
    // ... 생략 ...

        ret = privilege_checker_check_package_privilege(pkg_id, "http://tizen.org/privilege/call");
        pkgmgrinfo_appinfo_destroy_appinfo(app_info);
        if (ret != PRIV_CHECKER_ERR_NONE)
        {
            if (ret == PRIV_CHECKER_ERR_INVALID_PRIVILEGE)
            {
                return app_control_error(APP_CONTROL_ERROR_PERMISSION_DENIED, __FUNCTION__, "no privilege for Call operation");
            }
        }
    }
}


Privilege는 Smack으로 치환되어 관리될 수 있고,

Privilege 자체로 관리될 수도 있습니다.


끝_


* SMACK에 대한 이야기를 쌓아본다

http://storycompiler.tistory.com/51


* References

https://wiki.tizen.org/wiki/Security/Tizen_2.X_smack-privilege-config

https://wiki.tizen.org/wiki/Security/Tizen_2.X_cert-svc#Additional_certificate_service_APIs


출처 : http://storycompiler.tistory.com/53

저작자 표시
신고

'Computer > Tizen' 카테고리의 다른 글

Watch Application API  (0) 2017.05.30
SIGNATURE_NO_DEVICE_PROFILE [78]  (0) 2017.05.08
[Tizen] 타이젠 Privilege 설정  (0) 2017.02.15


Posted by injunech