如何从资产文件获取 URI?

我一直在尝试获取资产文件的 URI 路径。

uri = Uri.fromFile(new File("//assets/mydemo.txt"));

当我检查该文件是否存在时,我看到该文件不存在

File f = new File(filepath);
if (f.exists() == true) {
Log.e(TAG, "Valid :" + filepath);
} else {
Log.e(TAG, "InValid :" + filepath);
}

有没有人能告诉我,我怎样才能提到一个文件的绝对路径存在于资产文件夹

283259 次浏览

没有“资产文件夹中存在的文件的绝对路径”。项目的 assets/文件夹的内容打包在 APK 文件中。使用 AssetManager对象获取资产上的 InputStream

对于 WebView,您可以使用 file Uri方案,其方式与使用 URL 非常相似。资产的语法是 file:///android_asset/...(注意: 三个斜杠) ,其中省略号是 assets/文件夹中文件的路径。

适用于 WebView,但似乎在 URL.openStream()上失败。因此,您需要区分文件://协议,并按照建议通过 AssetManager 处理它们。

正确的网址是:

file:///android_asset/RELATIVEPATH

其中 RELAIVEPATH 是资源相对于资产文件夹的路径。

注意 方案中的3/s。如果没有3,Web 视图将不会加载我的任何资产。我试了一下 CommonsWare (之前)的注释2,但是它不起作用。然后我在 github 上查看了 Commons Ware 的源代码,注意到了额外的正斜杠。

虽然这个测试只是在1.6的 Android 模拟器上完成的,但是我怀疑在真正的设备或者更高版本上会有所不同。

编辑: CommsWare 更新了他的回答来反映这个微小的变化。所以我编辑了这个,这样他现在的回答还是有意义的。

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);

我做到了,而且成功了

试试这个,很管用:

InputStream in_s =
getClass().getClassLoader().getResourceAsStream("TopBrands.xml");

如果出现 Null 值异常,请尝试以下操作(使用类 TopBrandData) :

InputStream in_s1 =
TopBrandData.class.getResourceAsStream("/assets/TopBrands.xml");

是的,你不能从你的安卓手机或模拟器访问你的驱动器文件夹,因为你的电脑和安卓是两个不同的操作系统。我会选择安卓的 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();
}

enter image description here

确保您的资产文件夹放在正确的位置。

请尝试这个代码工作正常

 Uri imageUri = Uri.fromFile(new File("//android_asset/luc.jpeg"));


/* 2) Create a new Intent */
Intent imageEditorIntent = new AdobeImageIntent.Builder(this)
.setData(imageUri)
.build();

最后,我找到了一种方法,从 Kotlin 的 这个答案中获取资产中的文件路径。这里,我们将资产文件复制到缓存,并从该缓存文件获取文件路径。

@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

如果您可以不使用资产文件夹,并且希望获取一个 URI,而不将其存储在另一个目录中,那么可以使用 res/raw目录并创建一个 helper 函数来从 resID 获取 URI:

internal fun Context.getResourceUri(@AnyRes resourceId: Int): Uri =
Uri.Builder()
.scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
.authority(packageName)
.path(resourceId.toString())
.build()

现在,如果在 res/raw目录下有一个 mydemo.txt 文件,您可以通过调用上面的 helper 方法获得 URI

context.getResourceUri(R.raw.mydemo)

参考资料: https://stackoverflow.com/a/57719958