2019.03.02 21:07


[JAVA] Base64 인코딩, 디코딩 (Java8+, java.util.Base64)


Base64는 64문자의 영숫자를 이용하여 멀티 바이트 문자열이나 이진 데이터를 다루기 위한 인코딩 방식.

인코딩에는 java.util.Base64.Encoded#encode() 메소드, 디코딩에는 java.util.Base64.Decode#decode() 메소드를 사용.


API Documentation


Base64 https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html




import java.io.UnsupportedEncodingException; import java.util.Base64; import java.util.Base64.Decoder; import java.util.Base64.Encoder; public class Base64EncodeDecodeSample { public static void main(String[] args) throws UnsupportedEncodingException { String target = "암호화할내용을적어주세요"; byte[] targetBytes = target.getBytes("UTF-8"); // Base64 인코딩 /////////////////////////////////////////////////// Encoder encoder = Base64.getEncoder(); // Encoder#encode(byte[] src) :: 바이트배열로 반환 byte[] encodedBytes = encoder.encode(targetBytes); System.out.println(new String(encodedBytes)); // Encoder#encodeToString(byte[] src) :: 문자열로 반환 String encodedString = encoder.encodeToString(targetBytes); System.out.println(encodedString); // Base64 디코딩 /////////////////////////////////////////////////// Decoder decoder = Base64.getDecoder(); // Decoder#decode(bytes[] src) byte[] decodedBytes1 = decoder.decode(encodedBytes); // Decoder#decode(String src) byte[] decodedBytes2 = decoder.decode(encodedString); // 디코딩한 문자열을 표시 String decodedString = new String(decodedBytes1, "UTF-8"); System.out.println(decodedString); System.out.println(new String(decodedBytes2, "UTF-8")); } }




Posted by injunech
2019.02.13 00:48


[Android] calling ui thread from worker thread



Method compress must be called from the worker thread, currently inferred thread is UI thread less... (Ctrl+F1)  

Inspection info:Ensures that a method which expects to be called on a specific thread, is actually called from that thread. For example, calls on methods in widgets should always be made on the UI thread


위와 같이 View와 같은 Class내에서 Bitmap Compress 함수 사용시

Activity의 context 의 runOnUiThread 에서 수행해주도록 아래와 같이 구현한다.


public static Bitmap croppedBitmap;
public static File croppedFile;

File sdCard = Environment.getExternalStorageDirectory();
File dir = new File(sdCard.getAbsolutePath() + "/" + Data.PIC_FOLDERNAME + "/" + Data.PIC_FILENAME);
if (dir.exists() == false) {
dir.mkdir();
}

String path = sdCard.getAbsolutePath() + "/" + Data.PIC_FOLDERNAME + "/" + Data.PIC_FILENAME + "/" + Data.CROP_FILENAME;
croppedFile = new File(path);

((CropActivity) getContext()).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread
Bitmap croppedBitmap = CropImageView.croppedBitmap;
FileOutputStream out;
try {
out = new FileOutputStream(croppedFile);
croppedBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (Exception e) {
e.printStackTrace();
}
}
});


아래와 같이  UI Thread 이용하며 CropActivity는 위의 코드가 동작하는 View와 같은 Class가 호출되어 Activity 로 동작하는 Class 이다.

    ((CropActivity) getContext()).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread


}
});







Posted by injunech
2019.02.09 19:02


Google Android Sample Code Git

구글 안드로이드 샘플 코드 Git


Google Samples

https://github.com/googlesamples



Google Play In-app Billing Samples

https://github.com/googlesamples/android-play-billing






Posted by injunech
2019.02.04 21:36


구글계정 지급보류 문제해결


구글 개발자 계정에서 아래와 같은 에러 문구가 발생하는 경우

구글에 문의를 해서 원인 확인과 해결요청을 해야 한다.


은행 계좌가 잘못된 경우라면 쉽게 해결되지만 그밖에 경우라면 복잡하고 오래 걸리기 때문에

이러한 문제가 발생한 즉시 구글에 문의를 하는것이 좋다.


Contact us about your payments account status

You're currently unable to receive payouts because there's a hold on your payments account.




상단 물음표를 눌러서 구글 지원팀에 이메일로 문의하기 요청하고

관련 내용에 대해 문의요청한다.




혹은 위와 같이 Google Play Console 지원팀에 문의하기를 통해

채팅/이메일 두가지 방법을 선택해서 확인 요청할수 있다.




Posted by injunech
2019.01.28 02:31


Android 파일명 변경시


File beforeFileName;
File afterFileName;
 
beforeFileName = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "folder name", "target file name");
afterFileName = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "folder name", "modifi file name");
 
if (beforeFileName.renameTo(afterFileName))
    Toast.makeText(getApplicationContext(), "success!", Toast.LENGTH_SHORT).show();
else
    Toast.makeText(getApplicationContext(), "faile", Toast.LENGTH_SHORT).show();




Posted by injunech
2019.01.20 20:39


안드로이드 Task의 종료시점 확인하기

배경

안드로이드는 OS에 의해 프로세스가 강제종료 되는 시점을 알 수 없다. Application 클래스의 onTerminate()메서드조차 가상머신에서만 동작하고 실제 디바이스에서는 동작하지 않는다고 문서에 명시되어 있다.(실제로도 동작하지 않는 것을 확인했다.)

Task?

안드로이드 프로세스와 태스크의 차이

안드로이드에는 Task라는 개념이 있다. Task는 어떤 앱이 실행되면서, 관련 컴포넌트(엑티비티, 서비스, 리시버, 프로바이더)를 묶어놓은 그룹의 개념으로, 프로세스와는 약간 다르다. 그렇지만, 일반적인 앱이라면 하나의 앱을 실행할 때, 하나의 프로세스가 생기며, 그 프로세스에서 실행되는 모든 컴포넌트들은 하나의 Task로 묶이게 된다. 사용자가 확인할 수 있는 최근에 실행된 앱 보기에 나오는 하나의 단위가 바로 Task 이다.


Task 종료시점 알기

OS가 프로세스를 강제종료 시키는 시점은 알 수 없지만, Task가 종료되는 시점은 알 수 있다. 즉, 사용자가 최근에 실행된 앱 보기 화면에서 태스크를 지웠을 때의 시점을 감지할 수 있는 것이다. 한개의 프로세스와 한개의 Task로 구성되어 있는 앱이라면, 이 방법을 통해 사용자가 앱을 강제종료 시키는 시점 정도는 핸들링 할 수 있다.(이것은 프로세스가 종료되는 것과는 엄밀히 다르다. 그러므로, 프로세스의 종료시점과 혼동하여 사용하면 부작용을 초래할 수 있다.)
Service 클래스에는 Task가 종료되었을 때 콜백을 받는 onTaskRemoved()메서드가 존재한다. 이 메서드를 이용해, Task의 종료시점을 잡을 수 있다.


적용방법

1.Manifest에 서비스를 등록한다. 이 때, android:stopWithTask 속성을 반드시 false로 설정해야 한다. true로 설정하면 onTaskRemoved()메서드가 호출되지 않는다.
<application
    ...>
    ...
    <service android:name=".TestService"
                android:stopWithTask="false" />
    ...
</application>
2.Manifest에 선언한 Service를 선언하고, onTaskRemoved()메서드를 오버라이드하고 필요한 내용을 구현한다.
Note : super.onTaskRemoved()를 호출하게 되면, Task가 종료되는 시점에서 프로세스는 재시작된다.(Task는 안보이고 프로세스만 살아있는 형태) Task가 종료되는 시점에서 서비스도 같이 종료시키려면 stopSelf() 메서드를 호출해준다.
public class TestService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    
    @Override
    public void onTaskRemoved(Intent rootIntent) {
        Logger.logWarn("onTaskRemoved - " + rootIntent);
        // 여기에 필요한 코드를 추가한다.,
        
        stopSelf();
    }
}
3.해당 Service를 앱의 시작점에서 시작한다.일반적으로 앱의 시작점은 Application의 onCreate()나 스플래쉬 엑티비티의 onCreate() 메서드일 것이다. Manifest에 등록된 리시버가 없다면, 두가지 방법은 차이가 없지만, 외부 액션을 받는 리시버가 등록되어 있다면, 그 외부액션을 받았을 때 Application의 onCreate()가 실행되기 때문에, 오동작할 우려가 있으므로, 그럴때는 가급적 엑티비티의 onCreate()에서 시작하도록 한다.
public class SplashActivity extends Activity {
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startService(new Intent(this, TestService.class));
    }
    ...
}




Posted by injunech
2019.01.15 01:31


Special Characters in HTML

left single quote &lsquo;
right single quote &rsquo;
single low-9 quote &sbquo;
left double quote &ldquo;
right double quote &rdquo;
double low-9 quote &bdquo;
dagger &dagger;
double dagger &Dagger;
per mill sign &permil;
single left-pointing angle quote &lsaquo;
single right-pointing angle quote &rsaquo;
black spade suit &spades;
black club suit &clubs;
black heart suit &hearts;
black diamond suit &diams;
overline, = spacing overscore &oline;
leftward arrow&#8592;&larr;
upward arrow&#8593;&uarr;
rightward arrow&#8594;&rarr;
downward arrow&#8595;&darr;
north west arrow&#8598;&nwarr;
north east arrow&#8599;&nearr;
south west arrow&#8601;&swarr;
south east arrow&#8600;&searr;
black up-pointing triangle&#9650;&#x25B2;
black up-pointing small triangle&#9652;&#x25B4;
black right-pointing triangle&#9654;&#x25B6;
black right-pointing small triangle&#9656;&#x25B8;
black right-pointing pointer&#9658;&#x25BA;
black down-pointing triangle&#9660;&#x25BC;
black down-pointing small triangle&#9662;&#x25BE;
black left-pointing triangle&#9664;&#x25C0;
black left-pointing small triangle&#9666;&#x25C2;
black left-pointing pointer&#9668;&#x25C4;
trademark sign&#x2122;&trade;
unused&#00;-
&#08;
  
horizontal tab&#09;  
line feed&#10;  
unused&#11;  
space&#32;  
exclamation mark&#33; !
double quotation mark&#34;&quot;"
number sign&#35; #
dollar sign&#36; $
percent sign&#37; %
ampersand&#38;&amp;&
apostrophe&#39; '
left parenthesis&#40; (
right parenthesis&#41; )
asterisk&#42; *
plus sign&#43; +
comma&#44; ,
hyphen&#45; -
period&#46; .
slash&#47;&frasl;/
digits 0-9&#48;-
&#57;
  
colon&#58; :
semicolon&#59; ;
less-than sign&#60;&lt;<
equals sign&#61; =
greater-than sign&#62;&gt;>
question mark&#63; ?
at sign&#64; @
uppercase letters A-Z&#65;-
&#90;
  
left square bracket&#91; [
backslash&#92; \
right square bracket&#93; ]
caret&#94; ^
horizontal bar (underscore)&#95; _
grave accent&#96; `
lowercase letters a-z&#97;-
&#122;
  
left curly brace&#123; {
vertical bar&#124; |
right curly brace&#125; }
tilde&#126; ~
ellipses&#133;&hellip;
en dash&#150;&ndash;
em dash&#151;&mdash;
unused&#152;-
&#159;
  
nonbreaking space&#160;&nbsp; 
inverted exclamation&#161;&iexcl;¡
cent sign&#162;&cent;¢
pound sterling&#163;&pound;£
general currency sign&#164;&curren;¤
yen sign&#165;&yen;¥
broken vertical bar&#166;&brvbar; or &brkbar;¦
section sign&#167;&sect;§
umlaut&#168;&uml; or &die;¨
copyright&#169;&copy;©
feminine ordinal&#170;&ordf;ª
left angle quote&#171;&laquo;«
not sign&#172;&not;¬
soft hyphen&#173;&shy;
registered trademark&#174;&reg;®
macron accent&#175;&macr; or &hibar;¯
degree sign&#176;&deg;°
plus or minus&#177;&plusmn;±
superscript two&#178;&sup2;²
superscript three&#179;&sup3;³
acute accent&#180;&acute;´
micro sign&#181;&micro;µ
paragraph sign&#182;&para;
middle dot&#183;&middot;·
cedilla&#184;&cedil;¸
superscript one&#185;&sup1;¹
masculine ordinal&#186;&ordm;º
right angle quote&#187;&raquo;»
one-fourth&#188;&frac14;¼
one-half&#189;&frac12;½
three-fourths&#190;&frac34;¾
inverted question mark&#191;&iquest;¿
uppercase A, grave accent&#192;&Agrave;À
uppercase A, acute accent&#193;&Aacute;Á
uppercase A, circumflex accent&#194;&Acirc;Â
uppercase A, tilde&#195;&Atilde;Ã
uppercase A, umlaut&#196;&Auml;Ä
uppercase A, ring&#197;&Aring;Å
uppercase AE&#198;&AElig;Æ
uppercase C, cedilla&#199;&Ccedil;Ç
uppercase E, grave accent&#200;&Egrave;È
uppercase E, acute accent&#201;&Eacute;É
uppercase E, circumflex accent&#202;&Ecirc;Ê
uppercase E, umlaut&#203;&Euml;Ë
uppercase I, grave accent&#204;&Igrave;Ì
uppercase I, acute accent&#205;&Iacute;Í
uppercase I, circumflex accent&#206;&Icirc;Î
uppercase I, umlaut&#207;&Iuml;Ï
uppercase Eth, Icelandic&#208;&ETH;Ð
uppercase N, tilde&#209;&Ntilde;Ñ
uppercase O, grave accent&#210;&Ograve;Ò
uppercase O, acute accent&#211;&Oacute;Ó
uppercase O, circumflex accent&#212;&Ocirc;Ô
uppercase O, tilde&#213;&Otilde;Õ
uppercase O, umlaut&#214;&Ouml;Ö
multiplication sign&#215;&times;×
uppercase O, slash&#216;&Oslash;Ø
uppercase U, grave accent&#217;&Ugrave;Ù
uppercase U, acute accent&#218;&Uacute;Ú
uppercase U, circumflex accent&#219;&Ucirc;Û
uppercase U, umlaut&#220;&Uuml;Ü
uppercase Y, acute accent&#221;&Yacute;Ý
uppercase THORN, Icelandic&#222;&THORN;Þ
lowercase sharps, German&#223;&szlig;ß
lowercase a, grave accent&#224;&agrave;à
lowercase a, acute accent&#225;&aacute;á
lowercase a, circumflex accent&#226;&acirc;â
lowercase a, tilde&#227;&atilde;ã
lowercase a, umlaut&#228;&auml;ä
lowercase a, ring&#229;&aring;å
lowercase ae&#230;&aelig;æ
lowercase c, cedilla&#231;&ccedil;ç
lowercase e, grave accent&#232;&egrave;è
lowercase e, acute accent&#233;&eacute;é
lowercase e, circumflex accent&#234;&ecirc;ê
lowercase e, umlaut&#235;&euml;ë
lowercase i, grave accent&#236;&igrave;ì
lowercase i, acute accent&#237;&iacute;í
lowercase i, circumflex accent&#238;&icirc;î
lowercase i, umlaut&#239;&iuml;ï
lowercase eth, Icelandic&#240;&eth;ð
lowercase n, tilde&#241;&ntilde;ñ
lowercase o, grave accent&#242;&ograve;ò
lowercase o, acute accent&#243;&oacute;ó
lowercase o, circumflex accent&#244;&ocirc;ô
lowercase o, tilde&#245;&otilde;õ
lowercase o, umlaut&#246;&ouml;ö
division sign&#247;&divide;÷
lowercase o, slash&#248;&oslash;ø
lowercase u, grave accent&#249;&ugrave;ù
lowercase u, acute accent&#250;&uacute;ú
lowercase u, circumflex accent&#251;&ucirc;û
lowercase u, umlaut&#252;&uuml;ü
lowercase y, acute accent&#253;&yacute;ý
lowercase thorn, Icelandic&#254;&thorn;þ
lowercase y, umlaut&#255;&yuml;ÿ
Alpha&Alpha;Α
alpha&alpha;α
Beta&Beta;Β
beta&beta;β
Gamma&Gamma;Γ
gamma&gamma;γ
Delta&Delta;Δ
delta&delta;δ
Epsilon&Epsilon;Ε
epsilon&epsilon;ε
Zeta&Zeta;Ζ
zeta&zeta;ζ
Eta&Eta;Η
eta&eta;η
Theta&Theta;Θ
theta&theta;θ
Iota&Iota;Ι
iota&iota;ι
Kappa&Kappa;Κ
kappa&kappa;κ
Lambda&Lambda;Λ
lambda&lambda;λ
Mu&Mu;Μ
mu&mu;μ
Nu&Nu;Ν
nu&nu;ν
Xi&Xi;Ξ
xi&xi;ξ
Omicron&Omicron;Ο
omicron&omicron;ο
Pi&Pi;Π
pi&pi;π
Rho&Rho;Ρ
rho&rho;ρ
Sigma&Sigma;Σ
sigma&sigma;σ
Tau&Tau;Τ
tau&tau;τ
Upsilon&Upsilon;Υ
upsilon&upsilon;υ
Phi&Phi;Φ
phi&phi;φ
Chi&Chi;Χ
chi&chi;χ
Psi&Psi;Ψ
psi&psi;ψ
Omega&Omega;Ω
omega&omega;ω
password dot&#9679;
bullet&#8226;
infinity&#8734;&infin;


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

Special Characters in HTML and XML  (0) 2019.01.15
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
2019.01.06 03:05


LogFilter (1.8v Last Version)


Java 실행 파일인 JRE 혹은 JDK 등이 설치된 환경에서 바로 실행 가능하도록

batch file 추가하여 압축한 파일입니다.

압축 해제하여 logfilter.bat 파일 실행.


LogFilter.zip






출처 : http://blog.naver.com/iookill

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

LogFilter (1.8v Last Version)  (0) 2019.01.06
PC사양 체크  (1) 2017.10.22
모니터 밝기조절 프로그램 DimScreen  (0) 2017.10.10
[Visual Studio] 단축키  (0) 2015.06.19
[Eclipse] 단축키 변경  (0) 2015.06.11
[Visual Studio] Visual Studio Community 2013  (0) 2015.06.02


Posted by injunech
2019.01.06 03:00


TextView 줄간격, 자간, 장평 설정하기


ㆍ 줄간격 : lineSpacingExtra, lineSpacingMultiplier

ㆍ 자간 : letterSpacing

ㆍ 장평 : textScaleX



줄 간격


android:lineSpacingExtra ="0dp"(기본)


android:lineSpacingExtra ="5dp"


android:lineSpacingMultiplier="1"(기본)


android:lineSpacingMultiplier="1.5"




자간


android:letterSpacing="0"(기본)


android:letterSpacing="0.2"


장평


android:textScaleX="1"(기본)


android:textScaleX="1.5"(기본)







Posted by injunech
2018.12.26 01:41


스크롤바(ScrollBar) 색상, 위치 변경해보기


ㆍ스크롤바의 위치와 색상 설정 방법.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
android:orientation="vertical"
android:gravity="center">

<ScrollView
android:layout_width="300dp"
android:layout_height="300dp">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="어쩌구"
android:textColor="#000000" />
</ScrollView>

</LinearLayout>


스크롤바를 항상보이게 하기

android:scrollbarFadeDuration = "0"
android:scrollbarAlwaysDrawVerticalTrack = "True"

혹은

android:scrollbarDefaultDelayBeforeFade="500000"


스크롤바 위치를 우측에서 좌측으로 바꾸기

android:VerticalScrollbarPosition = "left"


스크롤바가 밖으로, 내부 콘텐츠를 가리지 않도록 설정하기

android:scrollbarStyle="outsideInset"


스크롤바를 원하는 그림으로 변경하기, Size 변경하기


android:scrollbarThumbVertical="@drawable/scroll_thumb"
android:scrollbarSize="2dp"

스크롤바 배경 라인 변경하기


android:scrollbarTrackVertical="@drawable/scroll_track"



















Posted by injunech