Answers:
没有“资产文件夹中现有文件的绝对路径”。项目assets/
文件夹的内容打包在APK文件中。使用AssetManager
对象获取InputStream
资产。
对于WebView
,您可以使用与file
Uri
使用URL几乎相同的方式来使用该方案。资产的语法是file:///android_asset/...
(请注意:三个斜杠),其中省略号是文件assets/
夹中文件的路径。
file://android_asset/
,虽然不是一个Uri
:github.com/commonsguy/cw-advandroid/tree/master/WebView/GeoWeb1
file:///
。
new File("file:///android_asset/sounds/beep.mid");
,但结果文件不存在。有任何想法吗?PS文件在assets/sounds/
文件夹中。
正确的网址是:
file:///android_asset/RELATIVEPATH
其中RELATIVEPATH是资源相对于资产文件夹的路径。
注意方案中的3 /。如果没有3,则Web视图将无法加载我的任何资产。我尝试了2(以前)由CommonsWare进行了评论,但它不起作用。然后,我在github上查看了CommonsWare的源代码,并注意到了额外的正斜杠。
虽然此测试仅在1.6 Android模拟器上进行,但我怀疑它在真实设备或更高版本上是否有所不同。
编辑:CommonsWare更新了他的答案以反映这一微小的变化。因此,我对其进行了编辑,因此对于他当前的回答仍然有意义。
String fileName = "file:///android_asset/file.csv";
System.out.println(new File(fileName).exists()); // prints false
File
接受字符串的构造函数期望路径不是URI。几年来我没有为Android编写代码,但情况可能已经改变。我不确定您是否可以使用普通的Java File类访问嵌入式资产文件夹。我似乎记得您必须使用AssetManager。资产文件夹中的文件以只读捆绑的APK放置在设备上并进行了压缩(APK实际上是zip文件),因此需要更多的工作来将其读回。尝试类似的方法new File(new URI(filename))
请尝试正常运行此代码
Uri imageUri = Uri.fromFile(new File("//android_asset/luc.jpeg"));
/* 2) Create a new Intent */
Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
.setData(imageUri)
.build();
最后,我找到一种方式来获得一个文件,该文件存在于资产的路径这个答案在科特林。在这里,我们将资产文件复制到缓存,并从该缓存文件获取文件路径。
@Throws(IOException::class)
fun getFileFromAssets(context: Context, fileName: String): File = File(context.cacheDir, fileName)
.also {
if (!it.exists()) {
it.outputStream().use { cache ->
context.assets.open(fileName).use { inputStream ->
inputStream.copyTo(cache)
}
}
}
}
获取文件的路径,例如:
val filePath = getFileFromAssets(context, "fileName.extension").absolutePath
fileName
有目录dir/file
。它将崩溃,路径cache/dir/file
不存在。我也认为最好if(!it.exist)
在also
块内进行检查,这样即使文件已经在缓存中,它也不会每次都复制文件
if(!it.exist)
引发了一个错误的未解决引用。有什么办法吗?
if(!it.exist)
应该把前it.outputStream()
...
sourceSets { main { assets.srcDirs = ['src/main/assets'] } }
适用于WebView,但似乎失败URL.openStream()
。因此,您需要区分file://协议,并根据建议通过AssetManager处理它们。
试试看,它的工作原理:
InputStream in_s =
getClass().getClassLoader().getResourceAsStream("TopBrands.xml");
如果您收到Null值异常,请尝试此操作(与类一起使用TopBrandData
):
InputStream in_s1 =
TopBrandData.class.getResourceAsStream("/assets/TopBrands.xml");
InputStream is = getResources().getAssets().open("terms.txt");
String textfile = convertStreamToString(is);
public static String convertStreamToString(InputStream is)
throws IOException {
Writer writer = new StringWriter();
char[] buffer = new char[2048];
try {
Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
is.close();
}
String text = writer.toString();
return text;
}
试试这个 :
Uri uri = Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.cat);
我做到了,它奏效了
是的,您无法从android手机或仿真器访问驱动器文件夹,因为您的计算机和android是两个不同的操作系统。我会选择android的res文件夹,因为它具有良好的资源管理方法。直到且除非您有充分的理由将文件放入资产文件夹。相反,您可以这样做
try {
Resources res = getResources();
InputStream in_s = res.openRawResource(R.raw.yourfile);
byte[] b = new byte[in_s.available()];
in_s.read(b);
String str = new String(b);
} catch (Exception e) {
Log.e(LOG_TAG, "File Reading Error", e);
}
为我工作尝试此代码
uri = Uri.fromFile(new File("//assets/testdemo.txt"));
String testfilepath = uri.getPath();
File f = new File(testfilepath);
if (f.exists() == true) {
Toast.makeText(getApplicationContext(),"valid :" + testfilepath, 2000).show();
} else {
Toast.makeText(getApplicationContext(),"invalid :" + testfilepath, 2000).show();
}
file://android_asset/...
,其中...
是项目assets/
目录中的相对路径。