ContentProviderからのファイルの保存と取得に関する質問がありましたが、私の状況は少し異なります。ContentProviderからの画像やその他のファイルの配信
他のアプリのコンテンツをホストするアプリを作成しています。それを実際にアプリ内購入なしで販売する方法と考えてください。
現在動作していますが、openFileから渡されたParcelFileDescriptorが有効になるように、イメージのコピーをキャッシュに作成する必要があります。私は誰かが参照する方法とアプリにバンドルされているファイルから任意のParcelFileDescriptorを知っていることを期待していた。資産はこれを促進するようではありません。 Rawは同じシナリオの可能性が高いです。
例を説明しようとしましょう... これは私がすべてのファイルを資産(私は現在)に格納していた場合にはうまくいくと思います。
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException {
String fileName = uri.getEncodedPath();
AssetFileDescriptor afd = getContext().getAssets().openFd(fileName);
ParcelFileDescriptor pfd = afd.getParcelFileDescriptor();
return pfd;
}
もちろん、これは機能しません。 ContentResolverを呼び出すアプリケーションに有効なParcelFileDescriptorが返されますが、アセットディレクトリ全体を指しているようです。 intertubesをしばらく読んだあと、アセットはそれが関連付けられているアプリの外からそれを参照するための記述子を許可していないようです(ただし、私はこれについての参照はありません)。
問題のファイルをContentProviderをホストしているアプリケーションのキャッシュにコピーしてから、キャッシュされたファイルのParcelFileDescriptorを返して問題を解決しました。 これはうまくいきます...しかし、私はアプリのサイズを倍増させてしまいます。
これは私の質問の中心です... ContentProviderから提供される(任意のタイプの)静的なファイルをバンドルしてキャッシュにコピーする必要はありません。
sqliteを使用してファイルをブロブとして保存しても、書き込み可能になるようにデータベースの初期コピーを作成する必要があります...同じエンドです。
これは意味がありますか? :-)
Androidですぐに利用できるアプリ内課金が発表されたため、これは私にとっては問題ではないかもしれません。しかし、それはまだ一般的に公正な質問です。コンテンツプロバイダから他のアプリケーションに静的資産を提供する必要があるかもしれません。私はまだそれらの資産を複製しないでどのように把握する必要があります。 –
ああ...アプリのサイズを2倍にすることに加えて、コピー操作が遅くなります。空のキャッシュヒットはかなり高価になる可能性があります。あなたが提供しているコンテンツの種類によっては、これはひどい経験になる可能性があります。 –