获取Android资源的路径

40

我的问题是:在Android中是否可以获取位于res/文件夹子目录中资源的绝对路径?

我在谷歌上看到的大多数答案都建议获取文件描述符,这意味着这是不可能的。

是吗?

编辑:我想这样做的原因是我正在编写接受媒体路径并播放它的类。如果我能传递资源的绝对路径,测试将更加容易。


你应该将HPP的答案标记为正确的答案。你标记的那个不正确。 - Leo supports Monica Cellio
1
@LeonardoAcevedo 完成。 - Prime
链接:https://dev59.com/z2sz5IYBdhLWcg3wWmQx - TT--
4个回答

32

使用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(只读)相同的方式使用它


它是什么类型的文件? - HPP

14

不可能。您看到的资源文件夹已编译到apk中,而且可能不会按原样存储。(例如,这些布局xml文件一旦编译,就不再是xml文件)

针对您的情况有两种可能的解决方案/解决方法:

  1. 将文件存储在'/assets'目录中
  2. 使用SDK工具将所需文件推送到已知位置(如/mnt/sdcard/...)
  3. 为您的媒体加载器创建一个模拟提供程序,以接受原始资源中的内容而不是路径,以供测试目的使用

2
这似乎不正确。我刚试了HPP的答案,它非常好用。 - PEZ
HPP 提出的答案是你的最佳方案。 - user210504

6
一般来说,不行。正如这里反复强调的那样,您需要通过资源来访问它们。
话虽如此,您可以采取以下措施解决问题:
  • 在首次运行时将文件从 res/assets 复制到内部存储器中。
  • 使用 adb 将文件推送到任何公共位置,例如 sdcard(注意,也不建议在其中使用绝对路径,因为并非每个设备都会将驱动器挂载到同一位置)
  • 使用已获取 root 权限的手机,访问任何文件夹,例如 /data/data/yourapp//tmp/
无论哪种情况,您都需要针对一个解决方案进行测试,这在大多数设备上可能都无法正常工作。我建议您按照开发指南中的说明进行操作:http://developer.android.com/guide/topics/data/data-storage.html

请看HPP的回答,你写下了你的回答2011年,你现在还坚持你的回答吗? - user1767754

0

大家都给你提供了首选的解决方案,我对他们给你的建议并不反对。

你可以直接访问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;
}

这是我写的一些代码,用来复制名为webContent的目录中的内容,该目录作为资源文件中的一个目录放置。(IOUtility是我自己编写的代码,但它并没有什么特别之处)
                    ApplicationInfo appInfo = getAppInfo();
                    String apkPath = appInfo.sourceDir;
                    JarFile apkJar = new JarFile(apkPath);
                    IOUtility.copyResourceDirectory(apkJar, "webContent", webContentDir);
                    apkJar.close();

我查看了一个base.apk文件,发现资源可供您访问,就像其他jar内容一样。我要提醒您一下,Android会将一些XML内容编译为二进制XML。因此,XML内容可能不会像您期望的那样显示。您也可以直接使用这种方法访问Android资源。我的建议是,除非您真的有绕过它们的实际需求,否则请使用专门设计用于访问此类内容的Android工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接