Android HTML资产中的引用应用程序存储

Android HTML资产中的引用应用程序存储,android,Android,我的Android应用程序使用作为资产包含的HTML文件,并在网络视图中显示这些文件。 HTML文件必须引用由我的应用程序动态创建的其他文件。动态内容不能静态包含在/assets中,也不应在每次在WebView中加载HTML时在线获取。相反,应用程序必须获取/生成一次在线内容,并将其存储起来,以备将来显示HTML文件时参考 到目前为止,我找到了两种解决方案,但都不令人满意: 将所有内容静态放置在/资源中。然后我可以在HTML文件中引用它,如下所示: 标签src=“image.gif”结束标签 将

我的Android应用程序使用作为资产包含的HTML文件,并在网络视图中显示这些文件。 HTML文件必须引用由我的应用程序动态创建的其他文件。动态内容不能静态包含在/assets中,也不应在每次在WebView中加载HTML时在线获取。相反,应用程序必须获取/生成一次在线内容,并将其存储起来,以备将来显示HTML文件时参考

到目前为止,我找到了两种解决方案,但都不令人满意:

  • 将所有内容静态放置在/资源中。然后我可以在HTML文件中引用它,如下所示:

    标签src=“image.gif”结束标签

  • 将动态内容存储在SD卡中,并从HTML中引用,如下所示:

    标签src=“/sdcard/app/image.gif”结束标签

  • 第一个解决方案不允许动态内容,因为(我认为)我不能动态地写入/assets。第二种解决方案可行,但并不理想。首先,我对/sdcard的引用进行了硬编码,这让我感到不舒服。其次,设备必须安装SD卡

    总的来说,我更希望能够将动态内容存储在应用程序的设备内存中,然后从HTML引用它。这是否合理/良好做法/可能

    请注意,“动态内容”并不是那么动态——它很少更新,我希望缓存它

    谢谢

    第一个解决方案不允许动态内容,因为(我认为)我不能动态地写入/assets

    总的来说,我更希望能够将动态内容存储在应用程序的设备内存中,然后从HTML引用它。这是否合理/良好做法/可能


    可能吗?对创建一个
    ContentProvider
    为您的内容提供服务,然后使用
    content://
    URL,它应该可以工作。

    我为此浪费了很多时间。显然,内容提供商主要针对结构化数据。我必须找到如何通过内容提供商为文件提供服务的方法,以使其正常工作。主要技巧是重写
    ContentProvider
    类的
    openFile
    方法。为了完整起见,这里是我的最终内容提供商的相关代码,用于向WebView提供单个文件

    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
    
    } 
    

    有关如何使用
    ContentProvider
    s的更多信息(亲爱的谷歌用户),请阅读文档。他们很好地解释了他们的目的。

    为什么不使用应用程序的缓存?请参阅链接出错,但请转到并查看getCacheDir()