-.nomedia 파일을 이용한 미디어 스캔 피하기-


어플리케이션 개발을 하다보면 


이미지를 특정 경로에 저장하는 경우가 생길수 있는데


문제는 해당 특정경로에 저장되어있는 이미지를 모바일에서 자동으로 스캔을 하여 


갤러리에 표시가 되는 문제가 생겼다.


굳이 보여줄 필요가 없는데 말이다.


그러다가 알게된게 미디어 스캔을 회피할 수 있는 방법이 있다 하는데


바로 .nomedia파일을 만들어서 미디어 스캔을 피하는 것이다.


.nomedia파일은 0byte짜리의 빈껍대기 파일인데


이게 미디어스캔을 회피할 수 있게 만들어준다.


만드는 방법은 간단하다.


//.nomedia 파일 생성
public void createFile() {

try {
File nomediaFile = new File(mDataPath + "/.nomedia");
if(!nomediaFile.exists()){
nomediaFile.createNewFile();
}
}
catch (Exception e) {
Log.d("fileError", "create .nomediaFile error ", e);
}
}

자주 사용하던 파일이나 폴더를 만드는 방식과 동일하다


특정 경로가 있다면 해당 고정된 경로에 .nomedia파일을 생성만 해주면


자동으로 미디어 스캔을 회피해 갤리러에 해당 이미지들이 보이는것을 막을수가 있다.


.nomedia파일은 하위 경로까지 전부 막아주므로 공통 경로에 하나만 만들어놓으면


하위 경로는 전부 미디어 스캔을 회피하게된다.


이러한 개발형식이 아니라 그냥 자체적으로 숨기고싶다면


해당 폴더로 가서 파일만들기를 통해 .nomedia파일을 만들어주면 된다.




생각보다 간단하게 해결할 수 있어서 다행이다.

(.nomedia 생성후 조금 있어야 갤러리에서 반응을 하니 기다려보자)




반응형



- Android SDK(안드로이드 SDK) 경로 설정하기 -


기존에 사용하던 안드로이드 프로젝트를 체크아웃 혹은 불러오기를 하거나


드라이브의 용량이 부족하여 SDK 위치를 변경하고자 할때


어디서 설정해줘야하는지 몰라 난감한 상황을 방지하고자


기록한다.


사실상


구글링을 해보면 SDK 경로를 설정 및 변경해주는 동일한 내용의 글들이


많이들 나오며 그것을 따라해도 큰 문제는 없다.


다만 내가 의아하게 생각했던것은 굳이 Close Project를통해 접근해야하는가? 이다.


우리가 일반적으로 안드로이드 스튜디오에서 관련 설정을 할 때


Settings 메뉴를 들어가고는 하는데


[File] - [Settings]


를 들어가보자



그럼 평소와 같이 Settings창이 뜰텐데


여기서 검색에 "SDK"라 입력해줘도 좋고


[Appearance & Behavior] - [System Settings] - [Android SDK]


해당 메뉴로 들어가보면 


Android SDK Location - SDK 경로가 보인다.



Edit 버튼을 눌러 들어가보면


SDK Components Setup 화면이 보이는데


현재 설치되어있는 sdk가 화면에 표출되며


아래에 보면 Android SDk Location이 존재하는데


기본 경로 : C:\Users\thslr\AppData\Local\Android\Sdk

(중간에 thslr은 사용자마다 다르다)


경로를 변경하고자 한다면 경로 우측에 폴더아이콘을 클릭해서 경로를 지정해주자.



이제 경로를 설정해주고나면


해당 경로에 다운로드될 SDK Componets가 화면에 보이며


next를 눌러 다운로드 해주자.



다운로드 중...




다운로드가 끝나면 Finish를 눌러주면 되기 때문에


사실상 경로 변경 끝이다!


여담으로


아래 화면에서도 SDK 경로를 변경해줄수 있다.

(어차피 같은 화면이 나올것이다.)




반응형
  1. 2020.09.05 17:50

    비밀댓글입니다

    • 2020.09.06 10:31

      비밀댓글입니다

  2. 활성화가 되지 안네요 2021.02.04 01:23

    SDK Components Setup 에서
    "Next" 버턴이 활성화 되지 안네요
    방법이 있나요

    Android SDK 에서
    모든화면의 SDK Platforms 에 있는
    모든 버젼의 선택이 활성화 되지 안네요
    방법을 알려주세요..

    설치를 못하고 있습니다.

    • BlogIcon 썸머워즈 2021.02.06 11:47 신고

      음 글쎄요 ㅜ 어떤경우에 안되는건지를 잘 몰르겠네요 죄송합니다.

  3. ㅇㅇ 2021.03.10 01:25

    혹시 그럼 기존의 경로에 설치된 sdk폴더는 모두 삭제해도 되나요?

    • BlogIcon 썸머워즈 2021.03.10 20:44 신고

      네 정해준 경로에만 있으면 상관없을겁니다.
      그래도 혹시 모르니 백업 해두세요!

  4. 감사합니다 2021.04.08 23:17

    감사합니다.... 근데 이거대로 했는데
    Nothing to do!
    Android SDK is up to date.
    라고 뜨던데 원래 경로가 'D:\SDK' 로 설정 되어있던거 같습니다

    그러면 저는 왜

    The path
    'C:\Users\chun\AppData\Local\Android\Sdk'
    does not belong to a directory.

    Android Studio will use this Android SDK instead:
    'D:\SDK'
    and will modify the project's local.properties file.

    이런 경고문구가 떴었을까요 ㅠㅠ 아신다면 알려주시면 감사하겠습니다

    • BlogIcon 썸머워즈 2021.04.10 10:50 신고

      기본적으로 설치하면 C:\User\.. 라는 경로로 설치될텐데 위 본문 내용 보시면 저는 그 경로에서 C드라이브 root로 경로를 바꿨거든요

      댓글에 쓰신것처럼 원래경로가 D드라이브였다 하시면 D드라이브에서
      'C:\Users\chun\AppData\Local\Android\Sdk'
      이 경로로 바꾸셨다는 얘기로 보이는데

      해당 경로가 없다는 얘기같거든요? 실제 존재하는 경로로 다시 잡아주시면 될것같은데 제가 잘 이해한건지 모르겠네요

 

 

- 길이가 긴 텍스트뷰 한줄로 흐르게 만들기 -


TextView를 사용하다 보면 텍스트 내용이 길어지기 마련인데

 

이때 줄바꿈 말고 한줄로 쓰는 방법과

 

한줄로 썼을 경우 안보이는 부분까지 보이도록 흐르는 방법에 대해 알아보자


xml속성에서 singLineellipsize를 이용하여 흐르는 표현을 할 수 있지만

 

해당 ellipsize = marquee 효과는 포커싱이 되어야만 흐르게 되어있다.

 

그래서 선택된것으로 알리기 위해서는 Java단에서 처리를 해줘야하는데

 

그냥 한번에 처리하도록 하자

 

- JAVA 처리 -

txtBldgDong.setSingleLine(true);    // 한줄로 표시하기
txtBldgDong.setEllipsize(TextUtils.TruncateAt.MARQUEE); // 흐르게 만들기
txtBldgDong.setSelected(true); // 선택하기

TextView를 대상으로

 

.setSingleLine(true) - 긴 텍스트를 한줄로 표시

.setEllipsize(TextUtils.TruncateAt.MARQUEE) - 텍스트가 잘릴경우 (길 경우) 흐르게 만들기

.setSelected(true) - 해당 텍스트뷰가 선택된것처럼 만들기

 

이렇게 세가지만 선언해 주면 된다.

 

xml 파일에서는 다음과 같이 선언해주면 된다.

 

- xml 처리 -

android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"

 marqueeRepeatLimit 는 반복 횟수를 정하는거기 때문에

 

forever를 사용하면 계속 흐르도록 할 수 있으나

 

위에서 언급한거와 마찬가지로 포커스가 되어있어야 흐르기 때문에

 

어차피 java 쪽에서 setSelected(true) 처리를 해줘야한다.

 

반응형


- addTextChangedListener 와 TextWatcher 를 이용한 EditText 입력 변화 이벤트 처리  -


EditText에 사용자가 텍스트를 입력할때 


입력 시점에 따라 이벤트를 주는 방법이 있는데


addTextChangedListener 와 TextWatcher를 이용하는것이다.


사용방법은 매우 간단하다.


addTextChangedListener 에 TextWatcher라는 인터페이스를 연결해주면 끝이다.


EditText edit = (EditText)findViewById(R.id.mineEdit);

edit.addTextChangedListener(new TextWatcher() {

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// 입력난에 변화가 있을 시 조치
}

@Override
public void afterTextChanged(Editable arg0) {
// 입력이 끝났을 때 조치
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// 입력하기 전에 조치
}
});


기본적으로 이런식으로 처리를해주며


변화와 동시에 처리를 해주고자 할 때는 onTextChanged() 부분


입력이 끝났을 때 처리는 afterTextChanged() 부분


입력하여 변화가 생기기 전에 처리는 beforeTextChanged() 부분에


작성을 해주면 된다.


여기서


 더 나아가


editText가 많을 경우 저렇게 하나하나 처리해주기 보다는


전부 같은 처리를 해주고자 하면


따로 만들어 사용해도 좋다


private final TextWatcher textWatcher = new TextWatcher() {
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// 입력하기 전에 조치
}

public void onTextChanged(CharSequence s, int start, int before, int count) {
// 입력난에 변화가 있을 시 조치
}

public void afterTextChanged(Editable s) {
// 입력이 끝났을 때 조치
}
};


이런식으로 선언을 해두고


editBuildingName.addTextChangedListener(textWatcher);
editDong.addTextChangedListener(textWatcher);
editHo.addTextChangedListener(textWatcher);
editUp.addTextChangedListener(textWatcher);
editDown.addTextChangedListener(textWatcher);
editFloor.addTextChangedListener(textWatcher);


이런식으로 가져다 쓰면 된다.


반응형
  1. koo 2020.04.07 17:12

    감사합니다.

  2. hamp 2020.10.16 00:26

    마지막에 여러개의 edit text있을 때 부분에 주석 순서가 조금 잘못 된거아닌가요 >>:)


- SharedPreferences 사용하기 -



안드로이드에서 


아이디 저장 / 자동 로그인 등 처리와


간단한 값들을 저장하기위해 DB에 넣을필요없이


SharedPreferences를 사용하여 가볍게 저장하는 방법이 있다.



- 값 저장하기 -


사용하는 방법에 대해 알아보자면


SharedPreferences는 안드로이드내에서 제공하고있으며


Activity내에서 사용하면 그냥 getSharedPreferences를 통해 접근이 가능하며


그 외에는 Context를 통해서 접근할 수 있다.


SharedPreferences pref = getSharedPreferences("mine",MODE_PRIVATE);

SharedPreferences.Editor editor = pref.edit();


직접 정해준 'mine' 이라는 이름으로 파일이 저장되며


저렇게 Editor를 사용해 값을 지정해 줄 수 있다.


넣을수 있는 값의 종류는 다음과 같으며


.put 을 해주는 방법은 key 와 value 값으로 이루어져 있다.



여기서 중요한게 있는데 값을 넣어주고나서는


꼭 commit() 을 해줘야한다는 점이다.


SharedPreferences pref = getSharedPreferences("mine",MODE_PRIVATE);

SharedPreferences.Editor editor = pref.edit();

editor.putString("record", "record");

editor.commit();

- 값 가져오기 -


값을 저장했으니 이제 가져오는 방법에 대해 알아보자


그냥 get해서 가져오기만 하면 끝이다.


SharedPreferences pref = getSharedPreferences("mine",MODE_PRIVATE);

String prefData = pref.getString("record","");


get 뒤에 key값과 defaultValue 두가지를 써야하는데


key 값이 null일 경우 반환할 defaultValue 값을 지정해주는 것이다.


- 파일 저장 경로 -


위의 SharedPreferences를 사용하게 되면 로컬 즉 단말기에 파일로 저장이 되는데


정해진 루트에 .xml 파일로 저장된다


파일 경로는 다음과 같다.


/data/data/{packageName}/shared_prefs/{keyName}.xml


주의할 점은 어플리케이션이 지워지거나


해당 경로의 데이터를 지우게되면


당연히 SharedPreferences로 저장한 데이터가 전부 날라간다.



반응형



- failed to read PNG signature: file does not start with PNG signature. -


APK 추출을 하기위해


Generate Signed Bundle or APK


를 통해 진행하려하니


아래와 같은 에러가 발생하였다.


D:\mobile20\app\src\main\res\drawable-xxhdpi\home_intro3.png: AAPT: error: failed to read PNG signature: file does not start with PNG signature.


처음보는 에러라 무슨에러인가 싶어 찾아보니 


원인은 이미지 형식이 PNG가 아닌데 파일의 확장자가 PNG로 되어있어서 생기는 에러라 한다.


그래서 실제 확장자를 찾아보기위해 파일 속성을 들어가면 되겠지 싶었는데



???


이 역시 PNG 로 되어있으나


실행만 하면 저 에러가 발생한다


그래서 파일 확장자를


JEPG 로 변경하고 변환프로그램을 이용하여 PNG로 변환해주었더니


거짓말처럼 에러가 사라졌다;; 


https://jpg2png.com/ko/

(jpg, jpeg -> png 변환 사이트)


파일은 해당 사이트에서 변환시켜서 사용하였다.


반응형