2013-05-06 11 views
5

私のアプリケーションは、DownloadManagerを使用しているWebサイトからjpgsをダウンロードし、/sdcard/Android/name.app/ディレクトリに保存して、アプリケーション内の複数のフラグメントで使用します。しかし、ダウンロードは素晴らしいですが、jpgはギャラリーアプリケーションに表示されます。ギャラリーアプリケーションでは、アプリケーション用のアセットであるため、不要です。ギャラリーアプリケーションに表示されないようにする方法を理解できません。私はさらにディレクトリに.nomediaファイルを追加しようとしましたが、それらは作成されています。どんな助けもありがとう!AndroidでDownloadManagerでダウンロードしたMedia ScannerによるJPGスキャンを防止するには? (Developer)

DownloadManager myDownloadManager = (DownloadManager) myActivity.getSystemService(Context.DOWNLOAD_SERVICE); 
    Request myRequest = new Request(Uri.parse(episodeArtLink)); 
    myRequest.setNotificationVisibility(Request.VISIBILITY_HIDDEN); 
    myRequest.setVisibleInDownloadsUi(false); 
    myRequest.setDestinationInExternalFilesDir(myActivity, Environment.DIRECTORY_DOWNLOADS, myFilename); 
    myDownloadManager.enqueue(myRequest); 

問題は、MediaScannerが尋ねていないのにイメージをシステムデータベースに追加しているために発生しているようです。

問題を示すテストアプリを作成しました。ダウンロードボタンをクリックすると、アプリにGoogleロゴが表示されます。ギャラリーアプリに入ると、ダウンロードというギャラリーにGoogleロゴも表示されます。 [設定] - > [アプリ] - [ギャラリーとメディアストレージのデータを消去する]を選択すると、Googleロゴは消えてしまいます。このファイルは/ sdcard/Android/data /の下にあるのでギャラリーには表示されません。 .nomediaファイル。 /sdcard/Android/data/com.example.downloadmanagertest/files/Download/に移動して、画像が電話に残っていることを確認できます。ギャラリーやメディアストレージのデータを消去すると、再起動してもギャラリーに画像が表示されません。私はこれを、Nexus 4と4.2.2を実行しているNexus 7の両方でテストしました。

出典:https://dl.dropboxusercontent.com/u/114414/DownloadManagerTest.zip

+0

私はこの質問がより「一般的」であるべきだと思います。私はTomTomをインストールしたときに同様の問題が発生しました。私のギャラリーには数千のアイコンが登場しました!ギャラリーからフォルダを「隠す」方法はありますか? – AndreaCi

+0

これはダウンロードしたアプリケーションではなく、開発中のアプリケーション用です。私はアプリケーションをダウンロードした誰もが自分で仕事を見つけなければならないとは思わない。 – notkevin

+0

メディアファイル(名前.nomediaのファイル)を含まないフォルダに画像をダウンロードしようとしましたか?このファイルは、フォルダ内のファイルをスキャンしないようにする必要があります。 –

答えて

5

ソリューション

メディアスキャナは、最終的には遅かれ早かれメディアとインデックス彼らのためにメディアカードをスキャンします。最初の直感的なステップは、ファイルがメディアファイルであることを知らないようにスキャナを欺くことです。これは、拡張子なしで画像を保存することで実現できます。簡単な解決策は、notkevinをファイル名の末尾に追加することです。単に:あなたはDownloadManager(単なる推測)を使用しているので、

代わりの

myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, Uri.parse(downloadLink).getLastPathSegment()); 

この

String filename = Uri.parse(downloadLink).getLastPathSegment() + "notkevin"; 
myRequest.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, filename); 

を使用してください。ただし、これはあなたのケースでは十分ではありません。メディアスキャナは、ダウンロードされたアイテムとそれがイメージであるという事実を何らかの形で知っているので、それを索引付けします。それを禁止するには、このようなsetMimeTypeを使用します。

myRequest.setMimeType("application/octet-stream"); 

PS:ファイル名の末尾にあなたや私の名前を追加する以外の拡張子を変更する方法があります。たとえば、あなたがgetphoto、上記のリンクでgetbitmapのような名前を持つメソッドでファイル名

String filename = hash(Uri.parse(downloadLink).getLastPathSegment()); 

public String hash(String victim) throws NoSuchAlgorithmException 
{ 
    MessageDigest md = MessageDigest.getInstance("SHA1"); 
    md.reset(); 
    byte[] buffer = victim.getBytes(); 
    md.update(buffer); 
    byte[] digest = md.digest(); 

    StringBuilder hexStr = new StringBuilder(); 
    for (int i = 0; i < digest.length; i++) { 
     hexStr.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return hexStr.toString(); 
} 
+1

ありがとう!あなたの解決策が問題を解決したようです。私は.jpg拡張子なしでファイルをデバイスに保存することになりました。 – notkevin

0

は、ドット(/sdcard/Android/name.app/.photos/)を使用してフォルダ名を付けます。それでも問題が解決しない場合は、フォルダを隠してみてください。

+0

私は.photosのようなディレクトリにファイルをダウンロードしようとしましたが、それでも動作しません。 allowScanningByMediaScanner()を設定していないのに、DownloadManagerはファイルをMediaScannerに追加しています。 Media Storageアプリのストレージを削除しても、画像は再検索されません。 MediaScannerがダウンロードされたときに画像を見るのを防ぐにはどうしたらいいですか? – notkevin

0

https://github.com/thest1/LazyList/blob/master/src/com/fedorvlasov/lazylist/ImageLoader.java

ルックをハッシュことができます。LazyLoaderのgithubプロジェクトには、WEBからメディアを取り込み、キャッシュ(メモリ、ファイルシステム)に持ち込んだり、アプリケーションの必要に応じてビットマップを使用したりするために、別の答えで提案を使用してtweekする必要があるすべてのメソッドがあります。

ビットマップが保存されるfilesinksでは、モジュールによって必要に応じて認識されますが、メディアスキャナでは認識されないfileNamesを採用してください。

そうすべきです。

2

私は数日間この同じ問題を抱えています。私はhidden directoriesusing different extensionsを作成し、.nomediaファイルを.nomediabefore the download,renaming directory (back and forth)という形で作成して、すべての組み合わせを試みました。

残念ながら、これらのどれも(Nexus 4では)うまくいかないようです。私の理解では、MediaScannerは電話機を起動したり、外部ストレージをマウントしたときにのみ再スキャンを行います。 Nexus 4(またはSDカードスロットを持たないデバイス)では、このマウントはブート時にのみ行われます。

ただし、Download ManagerのAndroidでダウンロードしたファイルは(shouldn'tでも)スキャンされ、ギャラリーに配置されます。 .nomediaファイルを持っていても、ギャラリーではまだ終了します。サムネイルがまだキャッシュされているため、アプリケーションをアンインストールしても問題ありません(再設定せずに、キャッシュやデータを消去し、設定でGalleryやMedia Storageアプリを強制終了して削除できます)。電話機を再起動すると、Androidは外部ストレージを再スキャンし、ファイルが.nomediaであることを確認してギャラリーから削除します。

このように再起動/再スキャンすると問題が解決します。私はDarshan's答えからもらった

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 

:しかし、我々は常に私のために働いたので、代わりに何電話を再起動するようにユーザーに尋ねることにしたくないことで成功ダウンロードした後、外部ストレージを再スキャンするには、Androidを強制することでした同様の質問とJon

私は、完了したdownloadsを聞くために放送受信機をセットアップし、成功すれば放送を送ります。私のアプリでダウンロードされた画像はギャラリーに表示されなくなりました。

0

ファイル拡張子を変更しなくても、フォルダ全体をスキャナの手の届かないところに置くこともできます。このlinkの ".nomedia"ファイルを参照してください。メディアスキャナ

からファイルを隠す

(ファイル名にドット接頭辞に注意してください) 外部ファイルのディレクトリに.nomediaという名前の空のファイルを含めます。これにより、メディアスキャナ は、メディアファイルを読み込んで、 MediaStoreコンテンツプロバイダを通じて他のアプリに提供できなくなります。ただし、ファイルがアプリ専用の の場合は、アプリ専用ディレクトリに保存する必要があります。

関連する問題