[액티비티내 화면 캡처 방지하기]


오래간만에 블로그에 글을 남기네요^^;;


다시 작은글부터 시작해서 하나 둘씩 제가 성장해가는 내용들을 남겨보고 싶습니다..



[Java Source Code]

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);


[Kotlin Source Code]

window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)


코틀린이 안드로이드 공식언어로 채택된 만큼 최대한 코틀린을 사용해보려고 합니다 ㅎㅎ


화면캡처 방지 소스코드를 위의 한줄을 액티비티의 onCreate 호출시 설정해두면 적용이 됩니다.


만약 액티비티내 특정 영역에서 화면 캡처를 허용해야한다면, window.clearFlags를 사용하시면 됩니다.


여러 단말을 모두 테스트 해본것은 아니지만, 일부 단말에서는 "보안정책에 따라 화면을 캡처할 수 없습니다." 라는 토스트 메시지가 발생합니다.

저작자 표시
신고
Posted by 냥아

알파값이 0.0 의 경우는 0% 라고 생각하면 된다.

100%  FF

99% — FC

98% — FA

97% — F7

96% — F5

95% — F2

94% — F0

93% — ED

92% — EB

91% — E8

90% — E6

89% — E3

88% — E0

87% — DE

86% — DB

85% — D9

84% — D6

83% — D4

82% — D1

81% — CF

80% — CC

79% — C9

78% — C7

77% — C4

76% — C2

75% — BF

74% — BD

73% — BA

72% — B8

71% — B5

70% — B3

69% — B0

68% — AD

67% — AB

66% — A8

65% — A6

64% — A3

63% — A1

62% — 9E

61% — 9C

60% — 99

59% — 96

58% — 94

57% — 91

56% — 8F

55% — 8C

54% — 8A

53% — 87

52% — 85

51% — 82

50% — 80

49% — 7D

48% — 7A

47% — 78

46% — 75

45% — 73

44% — 70

43% — 6E

42% — 6B

41% — 69

40% — 66

39% — 63

38% — 61

37% — 5E

36% — 5C

35% — 59

34% — 57

33% — 54

32% — 52

31% — 4F

30% — 4D

29% — 4A

28% — 47

27% — 45

26% — 42

25% — 40

24% — 3D

23% — 3B

22% — 38

21% — 36

20% — 33

19% — 30

18% — 2E

17% — 2B

16% — 29

15% — 26

14% — 24

13% — 21

12% — 1F

11% — 1C

10% — 1A

9% — 17

8% — 14

7% — 12

6% — 0F

5% — 0D

4% — 0A

3% — 08

2% — 05

1% — 03

0% — 00


저작자 표시
신고
Posted by 냥아

저는 안드로이드를 OS Ver 2.2 부터 지원하는 앱을 만들기 때문에 Notification 같은 경우에도


NotificationCompat 를 사용해서 알림을 표시합니다.


Ongoing 알림 같은 경우에는 계속 표시가 되어있어야하기 때문에 상단바나 잠금화면에서 알림이 표시되지 않았으면 하는 바램이 있었는데요.


해당 부분에 대해 이제야 찾았네요~!


해결방안

 NotificationCompat.Builder -> setPriority(NotificationCompat.PRIORITY_MIN);


위의 우선순위(Priority)를 Min(-2)로 사용하게 되면 알림영역에는 알림을 표시하고 있지만, 상단바나 잠금화면에서는 알림을 표시하지 않습니다.


레퍼런스 사이트에는 이렇게 적혀 있네요.


Set the relative priority for this notification. Priority is an indication of how much of the user's valuable attention should be consumed by this notification. Low-priority notifications may be hidden from the user in certain situations, while the user might be interrupted for a higher-priority notification. The system sets a notification's priority based on various factors including the setPriority value. The effect may differ slightly on different platforms.

저작자 표시
신고
Posted by 냥아

[Android] Notification Icon Size


안드로이드 개발을 하면서 Notification을 많이 사용하게 되는데요.

간혹 테스트 하면서 노티를 띄울 시 상단바에 아이콘이 잘려서 표시되는 경우가 발생합니다.


원인은 앱 아이콘과 Notification 아이콘을 같은것을 사용해서 그런데요.


레퍼런스 사이트에서 설명해주는것을 보면


런처 아이콘 : 48 x 48 dp ( mdpi 기준)

Notification 아이콘 : 24 x 24 dp (mdpi 기준)


으로 사용해야한다고 적혀 있습니다.


dpi 에 대한 배율은 아래와 같이 적용됩니다.



- dpi 에 따른 이미지 배율


위의 이미지를 참고한다면


대략 Notification 아이콘은 아래와 같이 잡으면 되겠네요.


mdpi : 24 x 24

hdpi : 36 x 36

xhdpi : 48 x 48

xxhdpi : 72 x 72

xxxhdpi : 96 x 96


으로 사이즈를 잡으면 될것 같습니다.



***요약***


런처 아이콘 : 48 x 48

노티 아이콘 : 24 x 24


참고 사이트(이미지 출처) : http://developer.android.com/design/style/iconography.html


저작자 표시
신고
Posted by 냥아


- 작품 목표

경남 인제대학교 학생들의 편의를 사용하여 만든 어플리케이션으로써, 학생들이 많이 사용하는 통확버스와 식단표 확인이 가능합니다. 통학버스는 기존에 존재하는 버스 어플리케이션과 비슷한 구성을 하고 있으며, 식단표는 학교 전체적인 식단이 확인 가능하도록 만들어졌습니다.

- 개발 아키텍쳐
Activity / SQLiteOpenHelper/ MySQL / 웹 PHP 컴포넌트를 사용한 프로그래밍
BlueOnyx 서버 사용
(서버 DB를 PHP로 웹상에 띄우고 그 자료를 Json 파싱으로 모바일 내부 DB로 가져 오는 방식)

- 기능 설명

1. 통학버스 학기/방학 시간표
2. 승차장소 지도와 사진
3. 버스노선 즐겨찾기 및 시간 클릭시 운행여부와 남은시간 표시
4. 요일별, 식당별 메뉴
5. 학교홈페이지 바로가기

- 실행, 설치방법
안드로이드 마켓에서 카오스 헬퍼 검색 후 설치(무료)
Android 2.2(프로요) 이상
https://market.android.com/details?id=Injes.org&feature=search_result#?t=W251bGwsMSwxLDEsIkluamVzLm9yZyJd

- 이미지

    

    
저작자 표시
신고
Posted by 냥아


이 글을 딱히 안드로이드에만 적용되는 부분은 아닙니다.

제가 지금 현재 날짜 계산 프로그램을 만들고 있습니다. 그런데 예전에 저의 봉봉이와 함께 쓰기 위한 D-day 프로그램을 만들었었는데 이게 왠일 다른 분들을 알고리즘을 사용하였는데 프로그램을 작동 시킬때 날짜가 1일 차이로 계산 바뀌는 것이었습니다. 참으로 이상함을 느끼고 이번에 만드는 프로그램에는 제대로 만들어 보겠다고 생각하고 이리 찾아보고 저리 찾아본 결과 답이 나오게 되었습니다.

소스는 정말 참으로 간단합니다.


public class dday{
	public int caldate(int myear, int mmonth, int mday) {
		try {
			Calendar today = Calendar.getInstance(); //현재 오늘 날짜
			Calendar dday = Calendar.getInstance(); 


			dday.set(myear,mmonth,mday);// D-day의 날짜를 입력합니다.


			long day = dday.getTimeInMillis()/86400000; 
			// 각각 날의 시간 값을 얻어온 다음 
			//( 1일의 값(86400000 = 24시간 * 60분 * 60초 * 1000(1초값) ) )


			long tday = today.getTimeInMillis()/86400000;
			long count = tday - day; // 오늘 날짜에서 dday 날짜를 빼주게 됩니다.
			return (int) count+1; // 날짜는 하루 + 시켜줘야합니다.
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
			return -1;
		} 
	}
}

 소스는 참 간단한데 위의 소스에서 보시면 각 날짜의 시간을 따로 불러들어와서 그 날 값을 서로 빼주게 됩니다. 다른 블로그에 있는 방법으로 사용을 하면 이상하게 저는 날짜가 한번씩 번갈아 가면서 계산이 되던데 저런식으로 해주니 날짜의 변동이 일어나지 않더군요. 제가 아직까지 프로그래밍에 많이 미숙하여 잘 모르는 부분일 수도 있습니다. 혹시나 다른 지식인 분들께서 아시는 정보가 있으시면 많이 알려주시면 감사하겠습니다.

저작자 표시
신고
Posted by 냥아
 
   class MessageSender extends Thread {
		public void run() {
			String message = null;
			PrintWriter out = null;
			BufferedWriter bw = null;
			OutputStream os = null;
			OutputStreamWriter osw = null;
			while (runningMessageSender) {
				if (mClientSocket != null && out == null) {
					try {
						os = mClientSocket.getOutputStream();
						osw = new OutputStreamWriter(os);
						bw = new BufferedWriter(osw);
						out = new PrintWriter(bw, true);
					} catch (IOException e) {
						e.printStackTrace();
					}
				} else if (mClientSocket == null && out != null) {
					out.close();
					out = null;
				}
				if (mClientSocket != null && out != null) {
					message = sendMessageQueue.poll();
					if (message != null) {
						out.println(message);
						out.flush();					
					}
				}
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
				if (mClientSocket != null) {
					try {
						mClientSocket.shutdownOutput();
						mClientSocket.close();
						mClientSocket = null;
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			
			if (out != null) {
				out.close();
				out = null;
			}
			if (bw != null) {
				try {
					bw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				bw = null;
			}
			if (osw != null) {
				try {
					osw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				osw = null;
			}
			if (os != null) {
				try {
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				os = null;
			}
		}
	}
메시지 센더 부분

 
   	class MessageReceiver extends Thread {
		public void run() {
			BufferedReader br = null;
			InputStream is = null;
			InputStreamReader isr = null;
			while (runningMessageReceiver) {
				try {
					
					if (mClientSocket == null)
						continue;
					is = mClientSocket.getInputStream();
					isr = new InputStreamReader(is);
					if (br == null) {
						br = new BufferedReader(isr);
					}
					String data = br.readLine();
					
					if (data == null) {
						br.close();
						br = null;
						Toast.makeText(rv_pro.this, "상대와의 접속이 끊겼습니다.", Toast.LENGTH_SHORT).show();
												
							finish();
						}
					else
					{
						return_msg = data;
						mHandler.post(showUpdate);
						//Toast.makeText(rv_pro.this, data, Toast.LENGTH_SHORT).show();
						
					}
					}
				
				catch (IOException e) {
					e.printStackTrace();
				} finally {
				}
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			if (br != null) {
				try {
					br.close();
					br = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (isr != null) {
				try {
					isr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				isr = null;
			}
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				is = null;
			}
		}
	}
메시지 리시버 부분
신고
Posted by 냥아