안드로이드 8.0(oreo)에서 '출처를 알 수 없는 앱' 체크 방법

개발/안드로이드 2017. 11. 24. 08:00
반응형

안드로이드 8.0인 오레오(oreo)에서 '출처를 알 수 없는 앱' 체크하는 방법에 대해서 포스팅 해보도록 할께요.


안드로이드 8.0 이전에는 '출처를 알 수 없는 앱'을 체크하려면 아래 코드를 사용했었는데요.

1
android.provider.Settings.System.getInt(getContentResolver(), Settings.Secure.INSTALL_NON_MARKET_APPS);
cs


안드로이드 8.0에서는 무조건 1로 리턴되어 항상 '출처를 알 수 없는 앱'이 허용으로 인식하게 됩니다.

왜냐하면 '출처를 알 수 없는 앱' 허용 시스템 => '출처를 알 수 없는 앱 설치' 설정으로 변경되어 출처를 알 수 없는 앱들을 관리하도록 변경되었기 때문입니다.


일단 설정화면은 "안드로이드 환경설정 -> 앱 및 알림 -> 관리 및 접근권한 -> 알 수 없는 앱 설치"에 있습니다.

이미지로 확인해보시면 이해가 빠를듯하여 준비하였습니다.





'알 수 없는 앱 설치' 관련 코드를 구현하게 되면 어떻게 흘러가는지 알아 볼께요.  

1) 앱을 설치합니다. 이때 아무런 액션이 없습니다. 

2) 앱을 실행 합니다. 그럼 '앱 설치 허용'을 활성화 해달라고 팝업을 띄웁니다. (팝업창 버튼은 "취소, 설정"로 설정)

3) 팝업에서 "설정" 버튼을 누르게 되면  이미지처럼 설정화면으로 이동합니다.  사용자가 허용을 한 후 앱으로 돌아와야 합니다.


사용자가 "앱 설치 허용"을 활성화 하게되면 앱을 재실행해도 '앱 설치 허용'을 활성화 팝업이 안뜨게 됩니다.



구글은 PHA(유해한 앱) 앱의 비율을 차례대로 줄여 나갔으며, 비공식 마켓 등에서 배포되는 PHA 앱은 여전히 남아 있다고 합니다. 

(Android Security 2016 Year in Review 참조)

그래서 안드로이드 8.0인 오레오(oreo)부터는 플레이 스토어 를 제외한 비공식 마켓에서 배포되는  앱을 설치할때는 새로운 권한을 얻도록 하였습니다.


그러나 제가 만든 앱에서는 '앱 설치 허용'을 하지 않는다고 실행에 제한이 있는것도 아니여서 별차이점을 모르겠네요. 그렇지만 안전을 위해서 구현하는게 좋겠죠?

이제 어떻게 구현하는지 코드를 살펴보도록 하겠습니다.


1) 권한 추가

1
<uses-permission android:name = "android.permission.REQUEST_INSTALL_PACKAGES" />
cs


2) 권한 여부 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if(Build.VERSION.SDK_INT >= 26)
{
    PackageManager packageManager = MainActivity.sharedActivity().getContext().getPackageManager();
    boolean isTrue = packageManager.canRequestPackageInstalls();
 
    if (!packageManager.canRequestPackageInstalls())
    {
        AlertDialog.Builder b = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Light_Dialog);
        b.setTitle("알림");
        b.setMessage("보안을 위해 스마트폰 환경설정의 '앱 설치 허용'을 설정해 주시기 바랍니다.설정화면으로 이동하시겠습니까?");
        b.setCancelable(false);
        b.setPositiveButton("설정하기"new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {                
                    Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
                    intent.setData(Uri.parse("package:" + MainActivity.sharedActivity().getPackageName()));
                    startActivity(intent);                
            }
        });
 
        b.setNegativeButton("건너띄기"new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
 
            }
        });
 
        b.show();
    }
}
cs


14~16 번째줄은 해당앱의 '앱 설치 허용'화면으로 이동하게 해줍니다.






반응형
admin