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