0

アプリ 1: でファイルをダウンロードします。DownloadManager

アプリ 2:DownloadManagerすべてのダウンロードをお願いします。からのものではなく、自分のイニシエーションのみを取得しApp 1ます。

ダウンロードされるファイルには次のものがありますUricontent://downloads/my_downloads/id

「App 2」より:ImageUriImageViewを thisで設定できませんContent Uri。(私は を得るFileNotFoundException)

ここで私の質問は次のとおりAndroid Downloads AppですApp 1。私のシステムの任意の画像ビューアで表示できます。ではないのはなぜApp 2ですか?

これはIntent( Action_VIEW) の使用によるものですか? または、何か不足していますか?

編集:

content://downloads/all_downloads/<some_id>どうやら、他のアプリからファイルを取得できるようです。アプリがこのファイルにアクセスするのを制限する方法はありますか? ダウンロードを開始したアプリだけが開くことができますか?

私は使用しています:

Request lRequest = new Request(Uri.parse(lDownloadUrl));
lRequest.setNotificationVisibility(Request.VISIBILITY_HIDDEN);
lRequest.setVisibleInDownloadsUi(false);

DownloadManager lDownloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE); 
long lEnqueueId = lDownloadManager.enqueue(lRequest);   
4

1 に答える 1

0

コンテンツのダウンロードは、コンテンツの表示とは異なります。したがって、ファイルXのダウンロードがアプリケーションAによって開始されたという事実は、アプリケーションAがそれを表示できることを意味するものではありません。アプリを使用して表示する場合は、<intent-filter>アプリケーションAが該当するビューアのリストに表示されるように追加する必要があります。アプリを明示的なビューアにしたい場合は、一意のファイル拡張子を使用するなどのトリックを使用する必要があります(そして、でその拡張子を一致させます<intent-filter>

編集

DownloadManagerソースを見ると、ダウンロード関連フィールドへのアクセスが所有者に制限されていることがわかります。したがって、アプリケーションAは、それ自体で開始したこれらのダウンロードのみを表示でき、アプリケーションBについては他に何も表示できません(最終的に、SDCardの宛先にダウンロードされると、これらのファイルが「誰でも読み取り可能」になることは関係ありません)。これは、アプリケーションBがコンテンツプロバイダーを使用してアプリケーションAのダウンロードに到達できない理由も説明しています。アプリケーションB(これらはアプリケーションB)が所有する、参照しようとするダウンロードはありません。したがって、最後に、ダウンロードを「共有」する場合は、DownloadManagerを使用する以外の方法でダウンロード関連データをアプリケーションBに渡す必要があります(つまり、バンドルにすべてのデータを入力してBに渡します)。

于 2012-10-30T13:36:06.673 に答える