2

DownloadManager를 통해 다운로드 한 이미지를 Gallery 앱에 표시하려고 시도하지만 작동하지 않습니다.Android DownloadManager 및 Media Scanner

public void downloadImage(String url) { 
     Uri Download_Uri = Uri.parse(url); 
     DownloadManager.Request request = new DownloadManager.Request(Download_Uri); 
     request.allowScanningByMediaScanner(); 
     download_id = downloadManager.enqueue(request); 
    } 

을하지만 때 파일 다운로드, 그것은 갤러리 응용 프로그램에 표시되지 않습니다 문서에 따르면,이 코드는 충분하다 생각했다. 그래서 수동으로 추가하려면 다운로드 수신기를 시도해 보았습니다.

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
      long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 
      Query query = new Query(); 
      query.setFilterById(downloadId); 
      Cursor c = downloadManager.query(query); 
      if (c.moveToFirst()) { 
       int columnIndex = c 
         .getColumnIndex(DownloadManager.COLUMN_STATUS); 
       if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) { 
        String uriString = downloadManager.getUriForDownloadedFile(download_id).toString(); 
          //c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); 
        Log.i("filname", uriString); 
        MediaScannerConnection.scanFile(ArticleActivity.this, 
           new String[] { uriString }, null, 
           new MediaScannerConnection.OnScanCompletedListener() { 
          public void onScanCompleted(String path, Uri uri) { 
           Log.i("Media Scanner", "Scanned " + path + ":"); 
           Log.i("Media Scanner", "-> uri=" + uri); 
          } 
        }); 
       } 
      } 
     } 
    } 
}; 

그 중 하나는 작동하지 않습니다. "filename"태그와 함께 인쇄 된 URI는 다운로드 한 실제 파일 이름 대신 'content : // downloads/my_downloads/97'과 유사합니다. 다운로드 응용 프로그램에서 파일 이름은 서버의 파일 이름과 동일합니다. "Media Scanner"태그로 기록 된 Uri는 null입니다.

나는 여기에 간단한 것을 놓치고 있습니까? 나는 이것에 대해 몇 시간 동안 머리카락을 꺼내왔다.

답변

3

나는 그것을 알아 냈다. 다운로드 위치를 추가해야했습니다. 다음 행은이를 수정합니다.

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, Download_Uri.getLastPathSegment()); 
2

안드로이드 6.0에서 테스트 할 때까지 나에게 맞는 대답이 나에게 옳았습니다. 문서화되지 않은 변경인지 확실하지 않지만 downloadManager.getUriForDownloadedFile(download_id)은 다운로드 요청에서 파일 대상을 설정했는지에 상관없이 항상 content://downloads/my_downloads/97 유형의 URI를 반환합니다.

Query query = new Query(); 
query.setFilterById(downloadId); 
Cursor cursor = downloadManager.query(query); 
if (cursor.moveToFirst()) { 
    String filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME)); 
} 
:

에게 나는 다운로드 관리자에서 커서를 사용하는 것입니다 해결 방법