반응형

GetAppInfo 클래스에서는 넘겨받은 패키지명을 가지고 Play 스토어의 해당 페이지로 가서 앱 이름과 버전에 해당하는 element의 값을 Jsoup 라이브러리를 이용해서 구하게 됩니다.

public class GetAppInfo extends AsyncTask<Void, String, Boolean> {
    private String appPackageName;
    private String appName;
    private String appVersion;

    public GetAppInfo(String packageName) {
        appPackageName = packageName;
    }

    @Override
    protected Boolean doInBackground(Void... strings) {
        Elements elementsAppName;
        Elements elementsAppVersion;
        boolean result = false;
        try {
            String AppFromPlayStore = "https://play.google.com/store/apps/details?id=" + appPackageName;
            Document doc = Jsoup.connect(AppFromPlayStore).get();
            elementsAppName = doc.select("div > div.sIskre > c-wiz:nth-child(1) > h1 > span");
            if (elementsAppName.size() != 0) {
                appName = elementsAppName.text();
            } else {
                elementsAppName = doc.select("div > div.sIskre > c-wiz:nth-child(2) > h1 > span");
                if (elementsAppName.size() != 0) {
                    appName = elementsAppName.text();
                } else {
                    appName = "Crawling code(App Name) needs to be changed.";
                }
            }
            elementsAppVersion = doc.select("div > div:nth-child(4) > span > div > span");
            if (elementsAppVersion.size() != 0) {
                appVersion = elementsAppVersion.text();
            } else {
                appName = "Crawling code(App Version) needs to be changed.";
            }
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

실제 테스트한 앱은 아래와 같은 화면을 구성하고 있습니다.

패키지명을 입력하고 버튼을 누르면 Play 스토어에서 크롤링해 온 앱 이름과 버전을 표시해줍니다.

왼쪽: 버튼 누르기 전, 오른쪽: 버튼 누른 후 

아래처럼 여러 경우에 따라서 App name과 App version에 표시해주는 정보가 달라집니다.

        btnGetAppInfo = findViewById(R.id.btnGetAppInfo);
        btnGetAppInfo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                hideKeyboard();

                if (isNetwork()) {
                    try {
                        getAppInfo = new GetAppInfo(etPackageName.getText().toString());
                        if (getAppInfo.execute().get()) {
                            tvAppName.setText(getAppInfo.getAppName());
                            tvAppVersion.setText(getAppInfo.getAppVersion());
                        } else {
                            tvAppName.setText("N/A (The package name app does not exist on the Play Store.)");
                            tvAppVersion.setText("N/A (The package name app does not exist on the Play Store.)");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        tvAppName.setText("N/A (Error)");
                        tvAppVersion.setText("N/A (Error)");
                    }
                } else {
                    tvAppName.setText("N/A (No internet connection)");
                    tvAppVersion.setText("N/A (No internet connection)");
                }
            }
        });

 

위의 예제 소스를 첨부하였으니 참고하세요.

CrawlingAppInfo.zip
0.14MB

 

 

반응형

얼마 전 삼성개발자사이트에 들어가서 둘러보다가 아래와 같이 삼성 카메라 SDK 지원 중단이 된다는 공지를 보았습니다.

 

As of Dec. 1, 2019, the Camera SDK(v1.0.0 - v1.3.2) is deprecated on all devices. We reget any inconvenience.

그 아래에 몇 개월 전 배포된 SDK 버전이 처량하게 보입니다.

 

 

외부 개발자들을 참여시켜서 기존 Android 카메라 API에서 지원하지 않는 삼성 폰의 카메라 확장기능을 지원하고자 시작한 것 같은데 아쉽다는 생각이 들었습니다.

 

SDK가 별거 아니라고 생각하는 분도 계실 수 있지만, SDK 개발하고 검증하고 배포한 이후 유지 보수하는 데는 많은 시간이 걸립니다.

 

왜 지원을 중단했는지 나름대로 생각을 해보니 구글에서 발표한 CameraX와 연관이 있는 것 같습니다.

 

관련한 근거로 SDC(삼성 개발자 컨퍼런스)에 발표된 아래 영상이 19.11월 초에 올라왔습니다.

 

제목이 Introducing the CameraX with Samsung인데, 구글의 안드로이드 카메라 프레임워크쪽 PM이 등장합니다.

 

CameraX 기능도 삼성 카메라 SDK와 중복되는 것이 많습니다.

 

향후 2개가 동시에 존재하는 것이 불가능한 것이 "카메라 확장 기능"을 위해서 삼성 카메라 SDK보다 여러 단말 벤더들도 지원할 수 있는 CameraX를 개발자들이 선호하게 될 것이기에 어쩔 수 없는 선택이었다고 생각됩니다.

 

삼성 입장에서는 아쉬울 수도 있지만, 뻔한 결과가 보이는 것을 계속 붙잡고 있을 수는 없는 거니깐요.

 

구글 입장에서 삼성은 아주 고마운 존재일 것 입니다.

 

새로운 기술이나 하드웨어에 대해서 삼성이 앞장서서 나가주고 검증을 해주니깐요.

 

일례로 지금은 당연히 카메라가 2개 이상 지원하지만 전에는 안드로이드 초기에는 Camera API에서 1개의 카메라만 지원했습니다.

 

(제가 기억하기로는) 삼성이 먼저 피처폰에서처럼 전면 카메라를 넣어주었죠. 이후 구글은 Camera API에 다수 카메라 지원하도록 적용하였고요.

 

작년 갤럭시 폴드 개발 시에는 폴더블 API 지원이 되도록 구글에서 많은 공조가 있었을 것입니다.

 

이번 글은 여기까지입니다. 읽어주셔서 감사합니다. 

 

반응형

Camera API를 어떻게 사용하는지 궁금할 때 참조할 수 있는 좋은 방법을 알려 드리겠습니다.

 

안드로이드 단말이 GMS를 탑재하고 구글의 승인을 받으려면 구글의 요구하는 조건을 만족시켜줘야 합니다.

 

기본적으로 CDD부터 프레임워크 호환성 확인을 위한 CTS 등 여러 테스트를 거치게 됩니다.

 

이중 CTS는 안드로이드 플랫폼에서 프레임워크 동작의 신뢰성을 위한 각종 API를 테스트합니다.

 

이 테스트 코드는 구글에서 작성하였고 소스가 오픈되어 있습니다.

 

예를 들어보겠습니다.

 

Camera API 중에서 setFocusMode를 어떻게 사용하는지 궁금하면 구글 검색으로 stackoverflow.com에 참고할 수 있는 대부분의 답변이 나옵니다.

 

아래의 경우는 setFocusMode가 동작하지 않는다는 문의와 답변입니다.

(관련 링크: https://stackoverflow.com/questions/11623266/camera-parameters-setfocusmode-is-not-working)

  

 

 

 

 

간결하고 문제 해결을 위한 무난한 답변입니다.

 

위의 문제는 지원하지 않는 Camera Focus mode를 사용하려고 해서 발생하는 문제였습니다.

 

답변에서는 지원 여부를 체크(getSupportedFocusModes)해서 지원하면 설정(setFocusMode)하게 처리되어 있습니다.

 

그럼, CTS 쪽에서는 어떻게 사용하고 있는지 볼까요?

 

여기에서도 체크(getSupportedFocusModes)후 지원하면 설정(setFocusMode)하게 처리되어 있습니다.

 

 

stackoverflow나 cts 모두 setFocusMode 사용하는 방법에 대해서 가리키는 것은 argument인 focus mode가 지원하는지 getSupportedFocusModes로 체크해서 지원하면 사용하도록 처리해야 한다는 것을 알 수 있습니다.

 

CTS 쪽 검색은 구글에서 아래와 같이 해주면 됩니다. (검색창에 "API명 site:android.googlesource.com/platform/cts")

 

 

CTS에 있는 모든 코드가 무결하다고 할 수는 없지만, 아무래도 구글에서 작성한 코드이기에 일정 수준이 상의 신뢰성이 보장된다고 볼 수 있습니다. stackoverflow.com에 나와 있지 않거나 거기 있는 코드가 신뢰 되지 않는다면 CTS에서 코드를 찾아보실 것을 권장해 드립니다.

 

이번 글은 여기까지입니다. 도움이 되셨기를 바랍니다.

반응형

 

안드로이드 리소스 디렉토리에서 values는 주로 문자열이나 설정값을 저장합니다.

 

다국어 관련해서는 values-"language"-"country" 디렉토리명된 string.xml 파일에 저장된다는 것은 익히 알고 있을 겁니다.

 

자세한 내용은 아래 글을 참고하시면 됩니다.

2018/09/19 - 안드로이드 다국어 지원 (support multiple language in android) - Translations Editor 사용법 포함

 

 

values-mcc 의미

values-"mcc" 디렉토리명으로 된 것은 결론적으로 말하면 어떤 국가의 통신망을 잡고 있는지에 따른 구분입니다.

 

통신망이 들어가서 혼란이 올 수도 있는데, 좀 더 쉽게 말하면 내 폰이 특정 국가에 있을 경우에 유효한 디렉토리입니다.

여기서 mcc는 Mobile Country Code의 약어인데, 국가마다 고유한 3자리 숫자가 mcc 뒤에 붙게 됩니다.

 

대한민국: 450, 미국: 310, 중국: 460, 일본: 440, 독일: 262, 캐나다: 302 ...

 

국가별 mcc값은 아래에서 검색하시면 됩니다.

https://en.wikipedia.org/wiki/Mobile_country_code

 

만약 values-mcc310 디렉토리가 있다면 이것은 미국 통신망을 잡고 있을 때 유효합니다.

 

values-mcc 활용 및 사용예

국가별 정책 적용시 대표적인 경우입니다.

위에서 언급한 다국어 지원하는 방법의 경우 해당 국가의 모국어가 아닌 외국어를 사용하는 경우에 제대로 처리되지 않습니다.

이럴경우에는 values-mcc 디렉토리로 국가별로 구분해서 값을 넣어주는 방법을 사용할 수 있습니다.

 

예로 들며 "카메라 촬영음 의무화" 정책이 있는 대한민국, 일본, 인도의 경우 아래처럼 프레임워크에서 처리되고 있습니다.

 

[기본]

/frameworks/base/core/res/res/values/config.xml  

<bool name="config_camera_sound_forced">false</bool>

 

[대한민국]

/frameworks/base/core/res/res/values-mcc450/config.xml  

<bool name="config_camera_sound_forced">true</bool>

 

[일본]

/frameworks/base/core/res/res/values-mcc440/config.xml  

<bool name="config_camera_sound_forced">true</bool>

 

[인도]

/frameworks/base/core/res/res/values-mcc404/config.xml  

<bool name="config_camera_sound_forced">true</bool>

 

위의 3개의 나라에 있을 경우 카메라로 촬영하면 프레임워크의 오디오 서비스에서 config_camera_sound_forced 값을 읽어와서 값에 따른 촬영음 처리를 합니다.

 

통신사별 처리가 필요할 때는 values-"mcc"-"mnc" 사용

참고로 mcc와 더불어 mnc를 같이 사용하기도 합니다.

mnc는 Mobile Network Code의 약어로서 통신사를 의미하며 1~2자리 숫자가 mnc 뒤에 붙게 됩니다.

values-mcc450-mnc5의 경우 대한민국의 SKT 통신사의 망을 잡고 있을 때 유효한 디렉토리입니다.

 

MTU size와 같이 통신사별 설정 값을 읽어오는 처리가 필요한 경우에 mnc를 추가해서 활용할 수 있습니다.

반응형

기본적으로 uses-permission과 사용하는 의미가 동일합니다. 즉, 앱에서 이러한 권한을 사용한다고 알려주는 것입니다.

 

먼저 AndroidManifest.xml 에서 아래 형식을 가지고 있습니다.

<uses-permission-sdk-23 android:name="string"
       
android:maxSdkVersion="integer" />

 

이전에는 uses-permission-sdk-m을 사용했지만, 현재 Deprecated 되어서 uses-permission-sdk-23을 사용합니다.

 

그냥 uses-permission을 사용하면 되는데 왜 uses-permission-sdk-23이 필요할까요?

 

그리고, uses-permission-sdk-22나 uses-permission-sdk-24는 왜 존재하지 않고 23만 존재할까요?

 

uses-permission-sdk-23은 API version 23 (Android 6.0) 이상이 설치된 디바이스에서 권한을 사용한다는 의미입니다.

 

이는 API version 23인 Android 6.0에서 새롭게 추가된 Runtime permission 때문입니다.

 

앱이 필요한 권한의 수준이 위험(Dangerous)인 경우 보안을 위해서 실행중 필요시 사용자에 권한 허용여부를 결정하도록 하는 기능입니다. 자세한 내용은 아래글 참조하세요.

2019/02/07 - 안드로이드 런타임 권한 확인 및 요청 처리하기 (Android Runtime permission check and request)

 

위험 권한을 사용한 새로운 기능을 추가했습니다. 그런데, 그 기능이 [Android 6.0 이상에만 유효하거나] 앱을 동작하는데 [필수적인 기능이 아니다]라고 한다면, Runtime permission을 지원하는 Android 6.0 이상에는 해당 기능 사용을 실행중 발생하는 권한 요청시 사용자가 결정할 수 있습니다. 

 

반면, 설치시 권한 승인을 해야 하는 Android 6.0 미만 디바이스에는 사용하지 않는데 권한 승인을 해줘야 하거나 필수적인 기능이 아님에도 강제로 추가됩니다.

 

이런 문제를 해결하기 위해서 [use-permission-sdk-23]을 사용하게 되면 Android 6.0 이상 디바이스에만 권한을 추가하며 그 미만 디바이스에서는 권한이 추가되지 않기에 설치시 권한 승인 및 강제로 기능이 추가되지 않습니다.

 

주로 Android 6.0 미만 디바이스까지 지원하는 앱에서 신규 기능을 추가하면서 겪게 될 수 있는 부분입니다.

 

참고로 maxSdkVersion의 경우 향후 최신 API 버전을 가진 디바이스에서 권한이 없어서 되는 경우에 그 직전 API 버전을 적어주면 됩니다.

 

여기까지 입니다. 도움이 되셨기를...

반응형

갑자기 안드로이드 스튜디오에서 소스의 텍스트가 깨져 보이는 현상이 나타났습니다.

 

 

이전에도 이런 현상이 있어서 가까스로 해결한 적이 있었는데 따로 북마크를 해두지 않아서 다시 검색해서 겨우 찾았습니다.

 

다음에도 똑같은 현상이 나올 수 있을 것 같아서 여기에 기록을 남깁니다.

 

일단 "구글 이슈 트래커"에 해당 현상에 대한 오류 보고( https://issuetracker.google.com/issues/119638289  ← 구글계정 로그인 필요)가 되어 있습니다.

 

아직 해당 현상에 대한 안드로이드 스튜디오의 정식 패치는 나오지 않았고, Workaround 만 올라와 있습니다.

 

정식 패치가 나오기까지 임시로 해결은 가능하니 참조하시길 바랍니다.

 

첫 번째 방법 (https://stackoverflow.com/a/54509482)

- 열려있는 안드로이드 스튜디오 닫기

- c:\사용자\"사용자 계정명"\system\caches\ 로 이동

- caches 폴더 안에 있는 모든 폴더 및 파일들 삭제

- 안드로이드 스튜디오 재실행

 

두 번째 방법 (https://stackoverflow.com/a/53262101)

- 열려있는 안드로이드 스튜디오 닫기

- c:\사용자\"사용자 계정명"\ 으로 이동

- ".AndroidStudio3.x" 폴더의 이름을 ".AndroidStudio3.xBackup" 이름으로 변경

- 안드로이드 스튜디오 실행

- 이전의 설정값을 유지하려면 .AndroidStudio3.xBackup 폴더로 되어 있는 곳에서 가져오도록 하고 아니면 "Do not import settings" 선택

 

보통은 첫 번째 방법으로 캐시를 초기화해줌으로써 해결되지만, 혹시 이 방법으로 해결되지 않으면 두 번째 방법으로 하면 좀 더 넓은 의미의 초기화로 웬만하면 다 해결이 됩니다. 

 

도움이 되셨길 바랍니다.

+ Recent posts