투케이2K

1038. (Android/Java) [간단 소스] 안드로이드 MediaScannerConnection.scanFile 설명 및 특정 파일을 갤러리 및 음악 앱 등에서 즉시 표시 본문

Android

1038. (Android/Java) [간단 소스] 안드로이드 MediaScannerConnection.scanFile 설명 및 특정 파일을 갤러리 및 음악 앱 등에서 즉시 표시

투케이2K 2025. 10. 17. 15:32
728x90

[개발 환경 설정]

개발 툴 : AndroidStudio

개발 언어 : Java / Kotlin

 

[소스 코드]

// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------

- 언어 : Java / Kotlin


- 개발 툴 : AndroidStudio


- 기술 구분 : Android / MediaScannerConnection / Intent.ACTION_MEDIA_SCANNER_SCAN_FILE


- 사전) 안드로이드 Build.gradle 설정 사항 : 

    android {

        // [컴파일 버전]
        compileSdk 34

        // [Config 셋팅]
        defaultConfig {
            // ----------------------------
            applicationId "com.example.javaproject" // 앱 아이디
            // ----------------------------
            versionCode 1 // 빌드 버전
            // ----------------------------
            versionName '1.0.1' // 빌드 네임
            // ----------------------------
            minSdk 24 // 최소 빌드 버전
            // ----------------------------
            targetSdk 34 // TODO 타겟 빌드 버전
            // ----------------------------
        }

        // [컴파일 자바 버전 지정]
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }

        // [아파치 http 사용 설정]
        useLibrary ('org.apache.http.legacy')
    }

// --------------------------------------------------------------------------------------






// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------

// -----------------------------------------
// [필요 변수 선언]
// -----------------------------------------
//String FILE_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/my_file.jpg";
String FILE_PATH = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/video.mp4";

Context mContext = A_Test_Activity_Start.this;


// -----------------------------------------
// [특정 폴더에 저장 된 이미지 및 동영상 파일 즉시 갤러리에 표시 수행]
// -----------------------------------------
File file = new File(FILE_PATH);

if (file.exists() == true){
                        
    // ------------------------------------------------
    // TODO Android 분기 처리 수행
    // ------------------------------------------------
    // 1. MediaScannerConnection.scanFile() 는 안드로이드에서 파일(특히 이미지, 비디오, 오디오 등 미디어 파일)을 시스템 미디어 데이터베이스에 등록하기 위해 사용하는 메서드입니다
    // ------------------------------------------------
    // 2. MediaScannerConnection.scanFile() 메서드를 호출하면 해당 파일이 갤러리나 음악 앱 등에서 바로 인식될 수 있게 됩니다.
    // ------------------------------------------------
    // 3. MediaScannerConnection.scanFile() 를 사용하기 위한 조건 및 주의 사항 :
    // >> 파일 경로가 정확해야 함
    // >> 파일이 실제로 존재해야 함
    // >> Android 10(Q) 이하 : READ_EXTERNAL_STORAGE 권한만 있으면 다운로드 폴더의 파일을 스캔할 수 있습니다
    // >> Android 11(R) 이상 : MediaScannerConnection.scanFile()은 파일을 읽는 것이 아니라 시스템에 등록 요청만 하는 것이기 때문에, 다운로드 폴더 파일 경로에 접근 가능하고 파일이 존재한다면 MANAGE_EXTERNAL_STORAGE 없이도 작동할 수 있습니다.
    // ------------------------------------------------

    if (Build.VERSION.SDK_INT <= 24) { // TODO Android 7.0 이하
        S_Log._D_("Android Version :: Build.VERSION.SDK_INT <= 24 (OS 7.0)", null);

        Uri uri = Uri.fromFile(file);
        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
        mContext.sendBroadcast(intent);

        S_Log._W_(특정 파일 갤러리 및 음악 앱 인식 요청 :: Build.VERSION.SDK_INT <= 24 (OS 7.0) :: Success, null);

    }
    else { // TODO Android 7.1 이상
        S_Log._W_("Android Version :: Build.VERSION.SDK_INT >= 25 (OS 7.1)", null);

        // ------------------------------------------------------
        // D/InputTransport: Input channel destroyed: 'ClientS', fd=140
        // ------------------------------------------------------
        // D/MediaScannerConnection: Scanned /storage/emulated/0/Download/video.mp4 to content://media/external_primary/video/media/1000003511
        // ------------------------------------------------------
        MediaScannerConnection.scanFile(
                mContext, // Context 객체
                new String[]{ file.getAbsolutePath() }, // 스캔할 파일 경로 배열
                null, // // MIME 타입 (null이면 자동 추정) : ex - new String[]{"video/mp4"},
                new MediaScannerConnection.OnScanCompletedListener() {
                    @Override
                    public void onScanCompleted(String path, Uri uri) {
                        S_Log._W_("MediaScannerConnection scanFile :: onScanCompleted", new String[]{
                                "path :: " + String.valueOf(path),
                                "uri :: " + String.valueOf(uri)
                        });

                        if (C_Util.stringNotNull(path) == true && uri != null && uri.getPath() != null){
                            S_Log._W_("특정 파일 갤러리 및 음악 앱 인식 요청 :: Build.VERSION.SDK_INT >= 25 (OS 7.1) :: Success", null);

                        }
                        else {
                            S_Log._E_("특정 파일 갤러리 및 음악 앱 인식 요청 :: Error :: onScanCompleted Path Is Null", null);

                        }
                    }
                });
    }
}
else {    
    S_Log._E_("특정 파일 갤러리 및 음악 앱 인식 요청 :: Error :: File Path Not Exists", null);
}

// --------------------------------------------------------------------------------------





// --------------------------------------------------------------------------------------
[참고 사이트]
// --------------------------------------------------------------------------------------

[안드로이드 os 11 (R 버전) 이상 모든 파일 접근 액세스 권한 부여 - MANAGE_EXTERNAL_STORAGE]

https://blog.naver.com/kkh0977/222594585420?trackingCode=blog_bloghome_searchlist


[Android] java.nio.file.AccessDeniedException 저장소 접근 이슈

https://blog.naver.com/kkh0977/223477410219?trackingCode=blog_bloghome_searchlist


[Android] Environment.isExternalStorageManager 사용해 파일 권한 체크 시 항상 return false 이슈

https://blog.naver.com/kkh0977/223264784573?trackingCode=blog_bloghome_searchlist


[android 12 / target 31] Scoped Storage 미디어 스토어 커서 컬럼 인덱스 호출 - getColumnIndex

https://blog.naver.com/kkh0977/222946999349?trackingCode=blog_bloghome_searchlist

// --------------------------------------------------------------------------------------
 
728x90
반응형
Comments