2012-03-11 5 views
1

私のAndroidアプリは、アセットとして含まれるHTMLファイルを使用し、これらのWebViewを内部表示します。 HTMLファイルは、アプリケーションによって動的に作成された他のファイルを参照する必要があります。ダイナミックコンテンツは、/ assetsに静的に含めることも、HTMLがWebView内にロードされるたびにオンラインで取得することもできません。その代わりに、HTMLファイルが表示されたときに、オンラインコンテンツを一度取得して生成し、後で参照できるように保存する必要があります。HTMLアセットのリファレンスアプリケーションストレージ

私は2つのソリューションこれまで発見した、とどちらもが満足ではありません:内部

  1. 置き、すべてのコンテンツ/静的資産。

    タグSRC =「image.gif」END_TAG

  2. ストアSDカードでの動的なコンテンツと、次のようにHTMLから参照:それから私は、次のようにHTMLファイル内で参照することができます

    タグをSRC =「/ SDカード/アプリ/ image.gif」END_TAG

私は動的/資産に書き込むことはできません(私はと思います)として最初のソリューションは、動的なコンテンツを許可しません。 2番目の解決策は機能しますが、それは素晴らしいことではありません。まず、/ sdcardへの参照を私が気にしないようにハードコードします。第二に、デバイスにはSDカードがインストールされていなければなりません。

全体として、動的コンテンツをアプリのオンデバイスメモリ内に保存し、HTMLから参照できるようにすることをお勧めします。これは合理的な/良い習慣/可能ですか?

「ダイナミックコンテンツ」はあまり動的ではありません。非常にまれに更新され、キャッシュされたいと思います。私は動的/資産に書き込むことはできません(私はと思います)として

おかげで、

+0

あなたのアプリのキャッシュストレージを使用してみませんか? http://developer.android.com/reference/android/content/Context.html#getCacheDir() – ldx

+0

リンクが乱雑ですが、http://developer.android.com/reference/android/content/Contextにアクセスしてください。 .htmlとgetCacheDir()を見てください – ldx

答えて

0

は、最初のソリューションは、動的なコンテンツを許可しません。

正しい。

全体として、動的コンテンツをアプリのオンデバイスメモリに保存し、HTMLから参照できるようにすることをお勧めします。これは合理的な/良い習慣/可能ですか?

可能ですか?はい。コンテンツを配信するためにContentProviderを作成してから、content://のURLを使用するとうまくいくはずです。

0

これはかなり時間がかかりました。コンテンツプロバイダは、主に構造化データを対象としています。私は、コンテンツプロバイダがファイルを提供する方法について、自分の道を見つける必要がありました。主なトリックは、ContentProviderクラスのopenFileメソッドをオーバーライドすることです。完成のために、WebViewsに単一のファイルを提供するために使用された最終的なコンテンツプロバイダの関連コードを示します。 ContentProvider Sを使用する方法の詳細については(親愛なるGoogleユーザー)に対して

public class MapContentProvider extends ContentProvider { 

    String FILENAME="afile"; 
    public static final String AUTHORITY = "my.package.name.provider"; 
    public static final String IMAGE = "imgname"; 

    @Override 
    public boolean onCreate() { 
     return true; 
    } 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     try { 
      byte[] ba=values.getAsByteArray("afile"); 
      Context context=getContext(); 
      context.deleteFile(FILENAME); 
      FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE); 
      fos.write(ba, 0, ba.length); 
      fos.close(); 
      return Uri.parse(AUTHORITY+"/"+IMAGE); 
     } 
     catch (Exception e) { 
      Log.w("MapController",e); 
     } 
     return Uri.parse(""); 

    } 

    @Override 
    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 
     File root = new File(getContext().getFilesDir(),FILENAME); 
     return ParcelFileDescriptor.open(root, ParcelFileDescriptor.MODE_READ_ONLY); 
    } 

//All the other overriden methods are ommited as they are typically never invoked in my dead-simple implementation 

} 

、ドキュメントを読んでください。彼らは彼らの目的を説明してまともな仕事をしています。

関連する問題