관리 메뉴

나만을 위한 블로그

[Android] android.os.FileUriExposedException: exposed beyond app through Intent.getData() 에러 해결 본문

Android

[Android] android.os.FileUriExposedException: exposed beyond app through Intent.getData() 에러 해결

참깨빵위에참깨빵 2020. 9. 18. 19:48
728x90
반응형

버튼을 눌러 액티비티를 스크린샷 찍는 기능을 구현할 때 제목과 같은 에러가 났다.

해결법은 2가지다.

 

하나는 onCreate() 안에 아래와 같은 코드를 넣는다

 

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

        // ↓ 아래 2줄 추가
        StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
        StrictMode.setVmPolicy(builder.build());
        .
        .
        .

URI exposure를 무시하는 코드다. 이걸 넣고 앱을 빌드하면 에러는 사라진다.

 

다른 방법은 FileProvider 클래스를 쓰고 매니페스트를 건드려 해결하는 방법이다.

먼저 res/xml 경로에 대충 path란 이름의 xml 파일을 만든다. res 폴더 안에 xml 폴더가 없다면 먼저 만들어야 한다. res 폴더를 우클릭하고 아래의 빨간 사각형만 누르면 만들어진다.

 

그리고 path.xml을 만든다. 파일 내용은 아래처럼 한다.

 

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="storage/emulated" path="." />
</paths>

 

다음으로 매니페스트의 application 태그 내부의 가장 마지막 부분에 아래처럼 provider 태그를 만들고 아래처럼 써주면 끝이다.

 

<provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.testapp.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/paths" />
        </provider>
    </application>

 

이렇게 하면 화면 캡쳐 혹은 카메라 사용 시 제목과 같은 에러는 발생하지 않고 정상적으로 작동하게 된다.

반응형
Comments