我的问题是:在Android中是否可以获取位于res/文件夹子目录中资源的绝对路径?
我在谷歌上看到的大多数答案都建议获取文件描述符,这意味着这是不可能的。
是吗?
编辑:我想这样做的原因是我正在编写接受媒体路径并播放它的类。如果我能传递资源的绝对路径,测试将更加容易。
我的问题是:在Android中是否可以获取位于res/文件夹子目录中资源的绝对路径?
我在谷歌上看到的大多数答案都建议获取文件描述符,这意味着这是不可能的。
是吗?
编辑:我想这样做的原因是我正在编写接受媒体路径并播放它的类。如果我能传递资源的绝对路径,测试将更加容易。
使用URI路径而不是“绝对”路径,请参见此帖子
Uri path = Uri.parse("android.resource://com.segf4ult.test/" + R.drawable.icon);
Uri otherPath = Uri.parse("android.resource://com.segf4ult.test/drawable/icon");
您可以使用openRawResource(R.id)打开一个inputStream,并以与FileInputStream(只读)相同的方式使用它
不可能。您看到的资源文件夹已编译到apk中,而且可能不会按原样存储。(例如,这些布局xml文件一旦编译,就不再是xml文件)
针对您的情况有两种可能的解决方案/解决方法:
/data/data/yourapp/
或 /tmp/
大家都给你提供了首选的解决方案,我对他们给你的建议并不反对。
你可以直接访问res内容,但这有点棘手。首先,你需要明白res文件存储在你的应用的base.apk文件中。那个文件是一个jar文件,所以你需要使用一些jar api来处理它。这个jar文件的绝对路径可以从ApplicationInfo中获取。ApplicationInfo.sourceDir的值就是base.apk文件的路径。顺便说一下,sourceDir是只读的。以下是一些获取ApplicationInfo的Java代码:
private ApplicationInfo getAppInfo() {
ApplicationInfo appInfo = null;
try {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.TIRAMISU) {
appInfo = getApplication().getPackageManager().getApplicationInfo(getApplication().getPackageName(), PackageManager.ApplicationInfoFlags.of(0));
} else {
appInfo = getApplication().getPackageManager().getApplicationInfo(getApplication().getPackageName(), PackageManager.GET_META_DATA);
}
} catch (PackageManager.NameNotFoundException e) {
if (appInfo == null) Log.e(TAG, "Package name not found: " + e.getMessage());
}
return appInfo;
}
ApplicationInfo appInfo = getAppInfo();
String apkPath = appInfo.sourceDir;
JarFile apkJar = new JarFile(apkPath);
IOUtility.copyResourceDirectory(apkJar, "webContent", webContentDir);
apkJar.close();