안드로이드 저장소 권한 - andeuloideu jeojangso gwonhan

저장소 기기에 있는 모든 파일 관리

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

공유 저장소 액세스가 필요한 대다수 앱은 미디어 파일 공유 및 미디어가 아닌 파일 공유 관련 권장사항을 준수할 수 있습니다. 그러나 일부 앱에는 기기의 파일에 광범위한 액세스가 필요하지만 개인정보를 안전하게 보호하는 저장소 권장사항을 사용하여 효율적으로 작업을 실행할 수 없는 핵심 사용 사례가 있습니다. Android는 이러한 상황을 위해 모든 파일 액세스라는 특수 앱 액세스를 제공합니다.

예를 들어 바이러스 백신 앱의 기본 사용 사례에서는 여러 디렉터리에서 많은 파일을 정기적으로 검사해야 할 수 있습니다. 이 검사에서 시스템 파일 선택기를 사용하여 디렉터리를 선택하는 데 사용자 상호작용이 반복적으로 필요하다면 사용자 환경이 저하될 수 있습니다. 파일 관리자 앱, 백업 및 복원 앱, 문서 관리 앱과 같은 다른 사용 사례에도 이와 유사한 상황이 발생할 수 있습니다.

모든 파일 액세스 권한 요청

앱은 다음을 실행하여 사용자에게 모든 파일 액세스 권한을 요청할 수 있습니다.

  1. 매니페스트에서 MANAGE_EXTERNAL_STORAGE 권한을 선언합니다.
  2. ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION 인텐트 작업을 사용하여 앱에 모든 파일 관리 액세스 허용 옵션을 사용 설정할 수 있는 시스템 설정 페이지로 사용자를 안내합니다.

앱에 MANAGE_EXTERNAL_STORAGE 권한이 부여되었는지 확인하려면 Environment.isExternalStorageManager()를 호출합니다.

MANAGE_EXTERNAL_STORAGE에서 허용하는 작업

MANAGE_EXTERNAL_STORAGE 권한은 다음을 부여합니다.

  • 공유 저장소 내 모든 파일 읽기 및 쓰기 액세스

  • MediaStore.Files 테이블 콘텐츠 액세스

  • 이동 중(OTG) USB 드라이브와 SD 카드 모두의 루트 디렉터리 액세스

  • 모든 내부 저장소 디렉터리에 대한⁠ 쓰기 액세스. 단, /Android/data/, /sdcard/Android 및 대부분의 /sdcard/Android 하위 디렉터리는 제외됩니다. 이 쓰기 액세스에는 직접 파일 경로 액세스가 포함됩니다.

    이 권한이 부여된 앱은 다른 앱에 속하는 앱별 디렉터리에 여전히 액세스할 수 없습니다. 이러한 디렉터리는 저장소 볼륨에서 Android/data/의 하위 디렉터리로 표시되기 때문입니다.

앱에 MANAGE_EXTERNAL_STORAGE 권한이 있으면 MediaStore API나 직접 파일 경로를 사용하여 이러한 추가 파일과 디렉터리에 액세스할 수 있습니다. 그러나 저장소 액세스 프레임워크를 사용할 때 MANAGE_EXTERNAL_STORAGE 권한이 없으면 파일이나 디렉터리에만 액세스할 수 있습니다.

다른 앱의 저장소 관리 활동 호출

Android 12(API 수준 31) 이상에서 MANAGE_EXTERNAL_STORAGE 권한과 QUERY_ALL_PACKAGES 권한이 모두 있는 앱(예: 파일 관리 앱)은 getManageSpaceActivityIntent()를 사용하여 사용자를 다른 앱의 맞춤 공간 관리 활동으로 보낼 수 있습니다.

getManageSpaceActivityIntent() 메서드는 패키지 이름과 요청 코드를 가져와 다음 중 하나를 반환합니다.

  • PendingIntent: 패키지 이름이 지정된 앱이 맞춤 '공간 관리' 활동을 정의한 경우 반환됩니다. 그러면 getManageSpaceActivityIntent() 메서드를 호출한 파일 관리 앱이 반환된 인텐트를 호출하여 사용자를 맞춤 활동으로 보낼 수 있습니다.
  • null: 패키지 이름이 지정된 앱이 '공간 관리' 활동을 정의하지 않는 경우 반환됩니다.

테스트용으로 MANAGE_EXTERNAL_STORAGE 사용 설정

MANAGE_EXTERNAL_STORAGE 권한이 앱에 미치는 영향을 알아보려면 테스트 목적으로 권한을 사용 설정할 수 있습니다. 권한을 사용 설정하려면 테스트 기기에 연결된 머신에서 다음 명령어를 실행합니다.

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

Google Play 알림

이 섹션에서는 Google Play에 앱을 게시하는 개발자에게 알림을 제공합니다.

광범위한 공유 저장소 액세스를 제한하기 위해 Google Play 스토어에서는 Android 11(API 수준 30) 이상을 타겟팅하고 MANAGE_EXTERNAL_STORAGE 권한을 통해 '모든 파일 액세스'를 요청하는 앱을 평가하는 정책을 업데이트했습니다. 이 정책은 2021년 5월부터 적용됩니다.

앱이 Android 11 이상을 타겟팅하고 MANAGE_EXTERNAL_STORAGE 권한을 선언하면 Android 스튜디오에서는 그림 1과 같이 린트 경고를 표시합니다. 이 경고는 'Google Play 스토어에 권한 사용을 제한하는 정책이 있음'을 알립니다.

안드로이드 저장소 권한 - andeuloideu jeojangso gwonhan
그림 1. MANAGE_EXTERNAL_STORAGE 권한 관련 Google Play 정책을 알려 주는 Android 스튜디오의 린트 경고

앱에서 저장소 액세스 프레임워크나 Media Store API와 같이 개인 정보를 더 안전하게 보호하는 API를 효과적으로 사용할 수 없는 경우에만 MANAGE_EXTERNAL_STORAGE 권한을 요청해야 합니다. 또한 앱의 권한은 허용된 용도로만 사용되어야 하며 앱의 핵심 기능과 직접적으로 연결되어야 합니다. 앱에 다음 예와 유사한 사용 사례가 포함되어 있는 경우 MANAGE_EXTERNAL_STORAGE 권한 요청이 허용될 수 있습니다.

  • 파일 관리자
  • 백업 및 복원 앱
  • 바이러스 백신 앱
  • 문서 관리 앱
  • 기기 내 파일 검색
  • 디스크 및 파일 암호화
  • 기기 간 데이터 이전

Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Last updated 2022-07-14 UTC.

[{ "type": "thumb-down", "id": "missingTheInformationINeed", "label":"필요한 정보가 없음" },{ "type": "thumb-down", "id": "tooComplicatedTooManySteps", "label":"너무 복잡함/단계 수가 너무 많음" },{ "type": "thumb-down", "id": "outOfDate", "label":"오래됨" },{ "type": "thumb-down", "id": "translationIssue", "label":"번역 문제" },{ "type": "thumb-down", "id": "samplesCodeIssue", "label":"샘플/코드 문제" },{ "type": "thumb-down", "id": "otherDown", "label":"기타" }] [{ "type": "thumb-up", "id": "easyToUnderstand", "label":"이해하기 쉬움" },{ "type": "thumb-up", "id": "solvedMyProblem", "label":"문제가 해결됨" },{ "type": "thumb-up", "id": "otherUp", "label":"기타" }]

안녕하세요

안드로이드 스튜디오를 개발하다보면 안드로이드에서 특정 권한을 획득해야 동작이 가능한 기능들이 있습니다

안드로이드 마쉬멜로우 이전 버전에서는 코드상에 권한허가를 넣어주면 이런 권한이 획득이 가능했는데 마쉬멜로우 버전 이후부터는 사용자가 직접 권한을 허락해야 사용이 가능하도록 바뀌었습니다

안드로이드 스튜디오에서 권한을 획득하는 방법에 대해서 알아보겠습니다!


안드로이드 권한 종류

안드로이드의 권한의 종류입니다

해당 기능들을 동작하는 경우 권한을 획득하지 않으면 에러메시지가 뜨면서 동작을 수행하지 않습니다

출처 참고 : https://developer.android.com/guide/topics/security/permissions#normal-dangerous

Permission Group

Permissions
CALENDAR
  • READ_CALENDAR
  • WRITE_CALENDAR
CAMERA
  • CAMERA
CONTACTS
  • READ_CONTACTS
  • WRITE_CONTACTS
  • GET_ACCOUNTS
LOCATION
  • ACCESS_FINE_LOCATION
  • ACCESS_COARSE_LOCATION
MICROPHONE
  • RECORD_AUDIO
PHONE
  • READ_PHONE_STATE
  • CALL_PHONE
  • READ_CALL_LOG
  • WRITE_CALL_LOG
  • ADD_VOICEMAIL
  • USE_SIP
  • PROCESS_OUTGOING_CALLS
SENSORS
  • BODY_SENSORS
SMS
  • SEND_SMS
  • RECEIVE_SMS
  • READ_SMS
  • RECEIVE_WAP_PUSH
  • RECEIVE_MMS
STORAGE
  • READ_EXTERNAL_STORAGE
  • WRITE_EXTERNAL_STORAGE

개발 코드

권한 추가(AndroidManifest.xml)

아래코드 Manifest에

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

를 추가하여 저장소 읽기/쓰기 권한을 추가합니다

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.example.permission">

<!-- 권한 추가 -->

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

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<application

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="@string/app_name"

        android:roundIcon="@mipmap/ic_launcher_round"

        android:supportsRtl="true"

        android:theme="@style/Theme.Permission">

<activity android:name=".MainActivity">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

cs


권한 얻기(MainActivity.java)

권한을 얻는 전체 소스입니다

저장소 읽기, 쓰기 권한이 있는지 체크하여 없다면 사용자에게 권한을 허용할 지 물어봅니다

권한이 없다면 앱을 종료시켜버립니다

package com.example.permission;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 권한ID를 가져옵니다
        int permission = ContextCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);

        int permission2 = ContextCompat.checkSelfPermission(this,
                Manifest.permission.READ_EXTERNAL_STORAGE);

        // 권한이 열려있는지 확인
        if (permission == PackageManager.PERMISSION_DENIED || permission2 == PackageManager.PERMISSION_DENIED) {
            // 마쉬멜로우 이상버전부터 권한을 물어본다
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                // 권한 체크(READ_PHONE_STATE의 requestCode를 1000으로 세팅
                requestPermissions(
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
                        1000);
            }
            return;
        }
    }

    // 권한 체크 이후로직
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grandResults) {
        // READ_PHONE_STATE의 권한 체크 결과를 불러온다
        if(requestCode == 1000) {
            boolean check_result = true;

            // 모든 퍼미션을 허용했는지 체크
            for (int result : grandResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    check_result = false;
                    break;
                }
            }

            // 권한 체크에 동의를 하지 않으면 안드로이드 종료
            if(check_result == true) {

            }
            else {
                finish();
            }
        }
    }
}

결과 화면

아래처럼 앱을 실행하면 권한을 물어봅니다!!

안드로이드 저장소 권한 - andeuloideu jeojangso gwonhan

여기까지 안드로이드 스튜디오의 권한을 얻는 방법에 대해서 알아봤습니다!

안드로이드 개발하는 분들에게 제 포스팅이 도움이 되었으면 좋겠습니다