获取存储在android中res/raw文件夹中的.mp3文件的URI

Kar*_*iya 53 audio android share

我有很多.mp3文件存储在res/raw文件夹中.

我使用以下代码获取.mp3文件的URI.

Uri.parse("android.resource:///com.my.android.sharesound/"+resId);
Run Code Online (Sandbox Code Playgroud)

返回: android.resource:///com.my.android.sharesound/2130968609

现在我在创建Share Intent时使用此URI

    shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("android.resource://com.my.android.sharesound/"+resId));
    startActivity(Intent.createChooser(shareIntent,"Share Sound");
Run Code Online (Sandbox Code Playgroud)

当我选择任何邮件应用程序,例如.来自Share Intent的Gmail或YahooMail,已成功附加mp3文件.但它显示2130968609(作为附件)

我不希望出现resourceId(2130968609).

我想显示fileName.mp3

我怎样才能做到这一点?我错过了什么吗?

要么

有没有其他方法可以通过Share Intent将存储在res/raw中的.mp3文件附加到邮件中.

Kar*_*iya 161

经过大量搜索,我找到了解决方案.

如果您想获取任何资源URI,那么有两种方法:

  1. 使用资源名称

    句法 : android.resource://[package]/[res type]/[res name]

    示例: Uri.parse("android.resource://com.my.package/drawable/icon");

  2. 使用资源ID

    句法 : android.resource://[package]/[resource_id]

    示例: Uri.parse("android.resource://com.my.package/" + R.drawable.icon);

这是获取存储在drawable文件夹中的任何图像文件的URI的示例.

同样,您可以获取res/raw文件夹的URI.

在我的情况下,我使用第一种方式即.使用资源名称

  • 谢谢你的回答.IMO,我认为第二种方式是首选,因为重命名资源等可以很容易地重构.因此,我选择了那个. (7认同)
  • 为了帮助重构,您还可以使用`Context.getPackageName()`替换包名 (7认同)
  • `"android.resource"`=`ContentResolver.SCHEME_ANDROID_RESOURCE` (4认同)
  • 哦,只是为了继续有趣的花絮,你可以使用`File.separator`而不是硬编码`/`.并且,你可能会疯狂使用`File.pathSeparator`而不是硬编码`:`.还有,很棒的答案! (2认同)

小智 35

这个工作就像魔术:假设mp3保存在原始文件夹中

notification_sound.mp3

然后简单地做这个工作:

Uri uri=Uri.parse("android.resource://"+getPackageName()+"/raw/notification_sound");
Run Code Online (Sandbox Code Playgroud)


Dew*_*eed 10

不要自己构造字符串,请使用Uri.Builder

/**
 * @param resourceId identifies an application resource
 * @return the Uri by which the application resource is accessed
 */
internal fun Context.getResourceUri(@AnyRes resourceId: Int): Uri = Uri.Builder()
    .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
    .authority(packageName)
    .path(resourceId.toString())
    .build()
Run Code Online (Sandbox Code Playgroud)

来自 AOSP-DeskClock。


小智 5

以下是一些可以帮助某人的方法:

    public Uri getRawUri(String filename) {
        return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/raw/" + filename);
    }
    public Uri getDrawableUri(String filename) {
        return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/drawable/" + filename);
    }
    public Uri getMipmapUri(String filename) {
        return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + File.pathSeparator + File.separator + getPackageName() + "/mipmap/" + filename);
    }
Run Code Online (Sandbox Code Playgroud)

只需这样调用方法:

Uri rawUri = getRawUri("myFile.filetype");
Run Code Online (Sandbox Code Playgroud)

  • 在“File.pathSeparator”之后,您需要一个额外的“File.separator” (2认同)