반응형

Javascript 로 PC / 모바일 환경을 구분해야하는 경우가 생김

 

기록하기 위해서 해당 내용을 공유함

반응형
 <script>
 let filter = "win16|win32|win64|mac|macintel";
 if(0 > filter.indexOf(navigator.platform.toLowerCase())){
 	alert("Client platform : Mobile");
 }
 else{
 	alert("Client platform : PC");
 }
 </script>

 

해당 코드를 사용하면 PC / 모바일 구분하여 환경을 설정할 수 있다.

 

SMALL

 

반응형
반응형

2021년 11월 부터 구글마켓 등록 시 Build SDK 버전이 최하 API30으로 잡아서 동작해야 함

 

관련해서 변동사항이 많은데 일단 중요한점은 2가지!!

 

1. Background Location 권한 

android.permission.ACCESS_BACKGROUND_LOCATION
반응형

2. 저장소 Storage 접근 제한

<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28"/>

 


하나씩 설명을 해보겠습니다.

 

먼저 Background Location 관련해서 시작할께요

 

기존에 Build SDK 버전을 29로 설정을 했을 경우에도 원래는 적용이 되었던 내용입니다.

Background 에서 위치정보를 수신하기 위해서 추가적으로 권한요청이 필요해졌습니다.

Background 에서 위치정보를 수신하기 위해서는 '항상 허용' 권한이 필요하지만 아래 첨부처럼 '항상 허용' 이란 부분이 사라졌습니다.

[참고] 권한요청 스크린샷

[구글 개발 자료] 위치 정보 액세스 권한 요청

 

위치 정보 액세스 권한 요청  |  Android 개발자  |  Android Developers

위치 정보 액세스 권한 요청 사용자 개인 정보를 보호하려면 위치 서비스를 사용하는 앱에서 위치 정보 액세스 권한을 요청해야 합니다. 위치 정보 액세스 권한을 요청할 때는 다른 런타임 권한

developer.android.com

 

해당 링크 내용을 보게되면 아래와 같은 내용이 있습니다.

하지만 Android 11(API 수준 30) 이상에서는 시스템 대화상자에 항상 허용 옵션이 포함되지 않습니다. 대신 사용자는 그림 7에 나와 있는 것처럼 설정 페이지에서 백그라운드 위치를 사용 설정해야 합니다.

설명처럼 사용자가 직접!! 어플리케이션 설정에 이동하여 직접~!! '항상 허용' 으로 설정해야 하는 상황입니다.

지금처럼 팝업에서 '항상 허용' 클릭은 이제 불가능 합니다.

SMALL

두번째로 저장소 권한!!!

 

현재까지는 아래와 같이 절대경로에 폴더를 만들어 많이 사용하였습니다.

String DIR_PATH = Environment.getExternalStorageDirectory().getAbsolutePath() + "패키지명";

 

하지만 이젠 해당 Path에는 접근하지 못하게되었습니다.

 

대신!! 공유폴더를 사용하는것을 권장하고 있습니다.

 

[구글 공식 문서]

 

Android 11의 저장소 업데이트  |  Android 개발자  |  Android Developers

Android 11의 저장소 업데이트 Android 11(API 수준 30)에서는 플랫폼을 한층 더 강화하여 외부 저장소의 앱 및 사용자 데이터를 더욱 안전하게 보호합니다. 이 버전에는 미디어의 원시 파일 경로 액세

developer.android.com

 

설명 코드 경로
사진 Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM).getPath()
다운로드 Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOAD).getPath()
알람 오디오 Environment.getExternalStoragePublicDirectory(DIRECTORY_ALARMS).getPath()
음악 Environment.getExternalStoragePublicDirectory(DIRECTORY_MUSIC).getPath()
영상 Environment.getExternalStoragePublicDirectory(DIRECTORY_MOVIES).getPath()
Noti 알람음 Environment.getExternalStoragePublicDirectory(DIRECTORY_NOTIFICATIONS).getPath()
그림파일 Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES).getPath()
팟캐스트 Environment.getExternalStoragePublicDirectory(DIRECTORY_PODCASTS).getPath()

해당 경로처럼 지정된 기본 공유폴더 사용을 권장하게되었습니다.

 

이렇게 되면 어떤상황이 생기냐면.....

 

1. 공용폴더에 폴더 생성은 가능

2. 공용폴더에 있는 파일을 변경하기위해 호출은 불가...(개별권한요청 필요)

 

개별권한에 대한 내용은 따로 정리해서 올리겠습니다. 

 

일단 공용폴더 및 아래와 같이 File Path를 사용하면 사용가능합니다.

String DIR_PATH = context.getExternalFilesDir(null).getPath();

해당 Path 는 Android/data/패키지명/files 경로로 선언되고 해당 폴더는 앱 삭제 시 같이 삭제되는 폴더이니간 사용에 유의해야 합니다. 

 

일단 오늘은 여기까지 ㅎㅎ 

추가사항은 업데이트하겠습니다. 이만

반응형
반응형

하.... 안드로이드 11버전 대응을 하고 쫌 마무리되어가나 싶었는데 또 12 업데이트 소식이...

 

이건 또 언제 어떻게 대응을 해야하나 싶음...

 

 

 

일단 출시는 하지만 구글 픽셀6 에 먼저 탑재되어 배포가 될듯 싶음...

 

실질적으로 상용폰에 적용시점은 12월쯤? 

 

[구글 개발자 사이트] https://developer.android.com/about/versions/12/overview?hl=ko

 

Android 12 미리보기  |  Android 12 베타  |  Android Developers

Android 12 미리보기의 작동 방식과 일정, 포함된 기능을 알아봅니다.

developer.android.com

 

일단 자세한 내용은 구글 개발자 사이트에서 확인하면 될 듯 싶고....

 

정확한건 뭘 바꿔야 하나 싶은건데 알아보도록 하겠음...

 

 

일단 기능 및 변경사항 관련해서 내용은 아래 링크에 정리가 되어있음...

[Android 12 기능 및 변경사항 목록] https://developer.android.com/about/versions/12/summary?hl=ko

 

Android 12 기능 및 변경사항 목록  |  Android 개발자  |  Android Developers

Android 12 기능 및 변경사항 목록 다음 표에는 앱 개발자에게 영향을 미칠 수 있는 문서화된 모든 기능 및 동작 변경사항이 나열되어 있습니다. 이 목록을 사용하여 영향을 받는 변경사항을 찾고

developer.android.com

 

 

그리고....

 

12버전을 타게팅 했을 때 영향 받을 수 있는 부분은 아래 링크

[Android 12 타겟팅하는 앱] https://developer.android.com/about/versions/12/behavior-changes-12?hl=ko

 

동작 변경사항: Android 12를 타겟팅하는 앱  |  Android 12 베타  |  Android Developers

모든 앱에 영향을 주는 Android 12의 변경사항을 알아봅니다.

developer.android.com

 

 

 

반응형

아래 링크는 변경사항에 대한 기능 및 개요...

[Android 12 기능 및 개요] https://developer.android.com/about/versions/12/features?hl=ko#java

 

기능 및 API 개요  |  Android 12 베타  |  Android Developers

Android 12의 개발자를 위한 새로운 기능과 API를 알아봅니다.

developer.android.com

 

 

일단은 위치정보에 대해서 또 뭔가 변경사항이 있는듯 함....

https://developer.android.com/about/versions/12/behavior-changes-12?hl=ko#approximate-location

 

동작 변경사항: Android 12를 타겟팅하는 앱  |  Android 12 베타  |  Android Developers

모든 앱에 영향을 주는 Android 12의 변경사항을 알아봅니다.

developer.android.com

 

 

음... 다른건 크게 변경되지 않는거 같지만 일단 사용해 보면서 업데이트 진행하겠음

반응형

'뉴스 & 이슈' 카테고리의 다른 글

Android 11 패키지 공개 상태 관리  (7) 2021.11.21
Android 11 Build 타겟 적용 시 이슈  (0) 2021.11.17
반응형
  • 목차
    1. 메세지(Message) 란?
    2. 메세지(Message) 특징
    3. 메세지(Message) 송신 및 수신



  1. 메세지(Message) 란?
    메세지(Message)란 안드로이드에서 많이 쓰이는 데이터 전달 Class 임.
    자세한 내용은 구글(https://developer.android.com/reference/android/os/Message) 에서 확인가능
    지금 이 글을 보는 사람은 초보라 생각하고 설명함

    메세지는 쓰레드(Thread) 와 핸들러(Handler) 를 이용해서 사용한다는 내용은 많이 있는데 정작 어떤경우 사용해야 좋은지 초보자인 경우 잘 모르는 상황이 많음. 그런걸 간단하게 공유해보고자 함



  2. 메세지(Message) 특징
    메세지도 Thread 특징을 그대로 이어받아 사용하기 때문에 코드가 동작 중 로딩으로 인해 버벅거리는 경우는 없음
    UI 변경도 간섭을 할 수 있음 ( Thread 내부에서 UI 변경을 하려고 하면 [ Only the original thread that created a view hierarchy can touch its views ] 라는 내용의 에러 발생 확인 가능함 ) 
    물론 Activity.runOnUiThread( new Runnable() { ... } ) 함수를 이용할 수도 있지만 이런 방식도 가능하다는 것을 알았으면 함


    반응형
  3. 메세지(Message) 송신 및 수신
    기본적인 구조는 다음과 같음

    . 데이터가 공백이거나 Null 인 경우(code_0 는 int 형으로 알맞은 숫자를 선언해주면 가능)

    송신부 A 
    mhandler.sendEmptyMessage(code_0);

    수신부 A
    Handler mhandler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch(msg.whar){
                case code_0 :
                    break;
            }
        }
    }



    . 데이터( 정수 0) 존재하며 키값( 문자열 : DATA0 ) 지정하여 보내는 경우
      데이터는 정수, 실수, Byte, Char, String 배열 등등 다양한 변수를 담을 수 있음
      또한 데이터 개수가 증가할 때는 bundle 에 형식과 키값, 데이터를 실어주면 전달이 가능함

    송신부 B
    Message message = mhandler.obtainMessage(code_0);
    Bundle bundle = new Bundle();
    bundle.putInt("DATA0", 0);
    message.setData(data_value);
    mhandler.sendMessage(message);

    수신부 B
    Handler mhandler = new Handler(){
        @Override 
        public void handleMessage(@NonNull Message msg) { 
            super.handleMessage(msg);
            switch(msg.whar){
                case code_0 :
                Log.d("Message Data", msg.getInt("DATA0"));
                break;
            }
        }
    }​



    . 간단한 데이터 전달을 하는 경우
      형식을 정하지 않고 해당 메세지에 데이터만 실어 보냈기 때문에 수신부에서는 형변환이 필요함
      해당 방식을 이용하면 간단한 데이터를 Bundle 을 사용하지 않고 한줄에 데이터 전송이 가능
    송신부 C
    mhandler.sendMessage(Message.obtain(mhandler, code_0, "DATA"));

    수신부 C
    Handler mhandler = new Handler(){
        @Override 
        public void handleMessage(@NonNull Message msg) { 
            super.handleMessage(msg);
            switch(msg.whar){
                case code_0 :
                Log.d("Message Data", (String) msg.obj);
                break;
            }
        }
    }​

 

 

기본적인 메세지(Message) 송수신 방식에 대하여 설명해 봤다.

 

초심자가 보기에 복잡한 내용보다는 간단하고 바로 써먹을 수 있는 내용 위주로 작성하다 보니 자세한 설명은 빠져있을 수도 있다. 자세한 내용은 구글 다큐먼트를 참고 하거나 다른 블로그에도 내용이 많으니 참고하길 바람

 

메세지를 이용하는 다른 방안이나 좋은 의견있다면 언제든지 댓글로 부탁합니다. 

 

오늘도 코딩 화이팅~!!

반응형

+ Recent posts