2

이 아니어야한다고 말한 파일을 MediaScanner가 스캔하려고합니다. 이제 왜 그런지 궁금합니다.DownloadManager는 다운로드 후 MediaScanner를 실행하지만


내 애플 내 서버에서 여러 미디어 파일을 다운로드하고 재생 목록으로 나중에 보여줍니다.

이를 위해 앱은 Android 시스템의 DownloadManager으로 미디어 파일을 가져옵니다.

Request.setDestinationUri()을 사용하면 "pending"이라는 하위 디렉토리 getExternalCacheDir()에 다운로드가 저장됩니다.

다운로드가 완료되면 Android DownloadManager가 ACTION_DOWNLOAD_COMPLETE 브로드 캐스트를 보냅니다. 내 응용 프로그램의 브로드 캐스트 수신기가 완성 된 다운로드를 가져 와서 "보류 중"폴더에서 "미디어"라는 다른 폴더로 옮깁니다.

모든 것이 의도 한대로 작동합니다.

그러나, 시스템 로그는 다음과 같은 메시지가 가득하다 :

E/BitmapFactory(23779): Unable to decode stream: java.io.FileNotFoundException: /path/to/pending/image.jpg: open failed: ENOENT (No such file or directory) 
E/JHEAD (23779): can't open '/path/to/pending/image.jpg' 

E/StagefrightMetadataRetriever(25911): Unable to create data source for '/path/to/pending/video.mp4'. 
E/MediaScannerJNI(23779): An error occurred while scanning file '/path/to/pending/video.mp4'. 

그래서 분명히 내 애플 이미지/"보류"디렉토리에 동영상을 다운로드 할 수 DownloadManager를 알려줍니다. 그것은 말했듯이 "나는 다운로드를 완료했습니다"라는 브로드 캐스트를 보냅니다. 내 앱이 브로드 캐스트를 수신하고 전체 파일을 "media"디렉토리로 이동합니다. 잠시 후 MediaScanner (또는 다른 것)는 "보류"폴더에서 완료된 파일을 검사하고 시스템 로그에서 barfs를 검사하려고 시도합니다.

이제 궁금합니다. 왜 MediaScanner가 이러한 파일을 읽으려고합니까?


setDestinationUri의 안드로이드 API의 문서에 따르면 ".. 다운로드 한 파일이 MediaScanner에 의해 검색되지 않습니다하지만 allowScanningByMediaScanner()를 호출하여 스캔 할 할 수있다" 그 방법을 호출하지 않기 때문에 다운로드 한 파일을 검사해서는 안됩니다.

다음, 나는 앱의 cache directory의 빈 .ignore을 넣어 시도하고 ACTION_MEDIA_SCANNER_SCAN_FILE을 통해 .IGNORE 파일의 존재의 MediaScanner을 생각 나게하지만, 오류 메시지가 남아 있습니다.

신비에 추가하려면 파일이 시스템의 갤러리 또는 비디오 앱에 나타나지 않으므로 미디어 스캐너가 파일을 무시합니다. 하지만 여전히 : 왜 그렇게하지 않아도 읽으려고합니까? MediaScanner가 아니면 다른 시스템 서비스입니까?

답변

1

다음, 나는 앱의 캐시 디렉토리에 빈 .IGNORE를 넣어 시도하고 ACTION_MEDIA_SCANNER_SCAN_FILE을 통해 .IGNORE 파일의 존재의 MediaScanner을 생각 나게하지만, 오류 메시지가 남아 있습니다.

Mediascanner를 중지 마법의 파일은 ".IGNORE"하지만 ".nomedia"아니다.
MediaScanner에서.자바 : (로그에 표시된대로) 검사가 추락하기 때문에

File file = new File(path.substring(0, slashIndex) + ".nomedia"); 
if (file.exists()) { 
    // we have a .nomedia in one of the parent directories 
    return true; 
} 

그리고 그것은 시스템의 갤러리 또는 비디오 응용 프로그램에 표시되지 않은 이유는, 어쩌면이다.

그러나 미디어 스캐너에 대한 느낌이 너무 나쁩니다. 예를 들어 왜 더 직선적으로 스캔을 멈추지 않을까요? 대신

public void scanDirectories(String[] directories, String volumeName) { 
     [...] 
     for (int i = 0; i < directories.length; i++) { 
      processDirectory(directories[i], mClient); 
     } 

의 MediaScanner.java 예, 들어는

public void scanDirectories(String[] directories, String volumeName) { 
     [...] 
     for (int i = 0; i < directories.length; i++) { 
      if (! isNoMediaPath(directories[i])) 
       processDirectory(directories[i], mClient); 
     } 

이 될 수하지만 그 대신, 다시하고 다시 앞뒤로 자바 코드와 CPP 코드 사이 간다. 그 이유는 무엇입니까?

+0

죄송합니다. 나는 이것을 사용했다. 'ignore = new File (context.getExternalCacheDir(), MediaStore.MEDIA_IGNORE_FILENAME); ' 그래서 .nore는 .ignore가 아닌 .nomedia라는 파일이지만 여전히 작동하지 않는다. – hez

0

실제로 ".nomedia"가 예상하는 효과의 절반도주지 않는 것처럼 보입니다. MediaScanner.java에서 추가 조사를 한 결과,이 파일은 MediaScanner가 전체 트리를 전혀 스캔하지 못하게한다고 말합니다. noMedia가 설정되어 있는지 여부는 신경 쓰지 않고 각 파일에 대한 항목을 MediaStore에 추가합니다.

MediaStore의 항목을 "표시하지 않아야합니다."라고 표시합니다. 각 파일에서 "beginFile"및 "endFile"을 수행합니다. endFile에서는 항상 mMediaInserter.insert를 수행합니다.

이 점에 대해 나에게 큰 고민을하는 것은 사실입니다. 예를 들어, 파일의 모든 파일을 스캔합니다. 마운트 된 스틱은 바이러스 (특별히 스캔 프로세스 용으로 설계된)와 .nomedia 파일에 포집 될 위험이 있으므로이를 막을 수 있습니다.