Get URI of .mp3 file stored in res/raw folder in android

95,959

Solution 1

Finally after searching a lot i found the solution.

If you want to get any resource URI then there are two ways :

  1. Using Resource Name

    Syntax : android.resource://[package]/[res type]/[res name]

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

  2. Using Resource Id

    Syntax : android.resource://[package]/[resource_id]

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

This were the examples to get the URI of any image file stored in drawable folder.

Similarly you can get URIs of res/raw folder.

In my case i used 1st way ie. Using Resource Name

Solution 2

This work like magic: Assuming the mp3 is saved in the raw folder as

notification_sound.mp3

then simple doing this works:

Uri uri=Uri.parse("android.resource://"+getPackageName()+"/raw/notification_sound");

Solution 3

Don't construct string on your own, use 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()

From AOSP-DeskClock.

Solution 4

One line Answer

RingtoneManager.getRingtone(getContext(),Uri.parse("android.resource://com.my.package/" + R.raw.fileName)).play();

Solution 5

Here is a clean way to get any resource,

 Uri.parse(String.format("android.resource://%s/%s/%s",this.getPackageName(),"resource_folder_name","file_name"));
Share:
95,959
Kartik Domadiya
Author by

Kartik Domadiya

Google Cloud Platform Google App Engine Google For Workspace Angular Angular JS Mobile Platform - Android & iOS Python Java PHP HTML5

Updated on July 05, 2022

Comments

  • Kartik Domadiya
    Kartik Domadiya almost 2 years

    I have many .mp3 files stored in res/raw folder.

    I am getting URI of .mp3 file using following code.

    Uri.parse("android.resource:///com.my.android.sharesound/"+resId);
    

    This returns : android.resource:///com.my.android.sharesound/2130968609

    Now I am using this URI in creating Share Intent

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

    When i select any Mail application eg. Gmail or YahooMail from the Share Intent, the mp3 file attached successfully. But it shows that 2130968609(as an attachment)

    i dont want resourceId(2130968609) to appear.

    I want to display fileName.mp3

    How can i do that? Am i missing something ?

    OR

    Is there any other way to attach .mp3 file stored in res/raw to mail via Share Intent.

  • Kartik Domadiya
    Kartik Domadiya over 12 years
    Thanks Reno. But dont you think it will take some amount of time to write the file to sdcard, get uri and then delete it. ?.. Delete will create problem for me. When should i delete the file ?. We cannot predict the Share Intent apps. result.
  • Reno
    Reno over 12 years
    True, this is only a workaround, in-case you don't get anything. Delete the temp directory when your app closes.
  • Reno
    Reno over 12 years
    @Kartik Try this solution, it worked for someone.
  • Kartik Domadiya
    Kartik Domadiya over 12 years
    ok. i think there is no other way to get URI of res. I am having other question but related to this only. When i select any Mail app, file gets attached. But when i select Whatsapp, it asks me to choose contact but doesnot show the file attached.
  • Reno
    Reno over 12 years
    I really don't know how Whatsapp handles their attachment intents, and yes, go for whichever option is convenient
  • Kartik Domadiya
    Kartik Domadiya over 12 years
    I got it working : see my answer stackoverflow.com/questions/7976141/…
  • Dheeraj Bhaskar
    Dheeraj Bhaskar over 11 years
    thanks for the answer. IMO, I think the second way would be preferred as renaming the resource etc can be easily refactored. Hence, I chose that.
  • Richard Le Mesurier
    Richard Le Mesurier almost 10 years
    to aid the refactoring, you can also replace package name with Context.getPackageName()
  • Anonsage
    Anonsage over 9 years
    Oh, just to continue the fun tidbits, you can use File.separator instead of hardcoding /. And, you could go crazy with File.pathSeparator instead of hardcoding :. Also, great answer!
  • Noundla Sandeep
    Noundla Sandeep over 8 years
    Thanks for great answer... I choosen 2 way.
  • frouo
    frouo about 8 years
    "android.resource" = ContentResolver.SCHEME_ANDROID_RESOURCE
  • ChristophK
    ChristophK almost 8 years
    If you want to use this URL in a WebView, at least in Lollipop (I did not try other versions) you need to set a custom WebViewClient that handles those URLs, something like this: public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (url.startsWith(ContentResolver.SCHEME_ANDROID_RESOURCE + "://")) { int idPos = url.lastIndexOf('/'); int id = Integer.parseInt(url.substring(idPos + 1)); return new WebResourceResponse("text/html", "", resources.openRawResource(id)); } return null; }
  • Mudassir
    Mudassir over 5 years
    @KyleJahnke How do you solved this in Lollipop, a few points in right direction will be appreciated.
  • Phong Nguyen
    Phong Nguyen almost 3 years
    I have a case that there are 2 localized raw folder, default raw and raw-en. In my device settings, it's using English. When I share file via intent: sharingIntent.putExtra( Intent.EXTRA_STREAM, Uri.parse("android.resource://" + this.getPackageName() + "/raw/" + name )); it always share file in raw-en (might be affected by device's setting). Is there any way to share exact file in raw folder regardless device's settings?