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

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

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

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

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

现在我正在使用这个URI来创build共享意图

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

当我select任何邮件应用程序,例如。 从Share Intent的Gmail或YahooMail,mp3文件成功附加。 但是这表明2130968609(作为附件)

我不希望resourceId(2130968609)出现。

我想显示fileName.mp3

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

要么

是否有任何其他方式来附加.mp3文件存储在res /原始邮件通过共享意向。

最后,我search了很多,我find了解决办法。

如果你想获得任何资源的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);

这是获取存储在可绘制文件夹中的任何图像文件的URI的示例。

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

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

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

notification_sound.mp3

那么简单的做这个工作:

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

尝试将文件保存到您的SDCard,也许然后发送新的URI,

  public boolean saveAs(int resSoundId){ byte[] buffer = null; InputStream fIn = getBaseContext().getResources().openRawResource(resSoundId); int size=0; try { size = fIn.available(); buffer = new byte[size]; fIn.read(buffer); fIn.close(); } catch (IOException e) { // TODO Auto-generated catch block return false; } String path = "/sdcard/yourapp/temp/"; String filename = "filename"+".mp3"; boolean exists = (new File(path)).exists(); if (!exists){new File(path).mkdirs();} FileOutputStream save; try { save = new FileOutputStream(path+filename); save.write(buffer); save.flush(); save.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block return false; } catch (IOException e) { // TODO Auto-generated catch block return false; } 

请记得在电子邮件发送成功后删除文件。

这是一个干净的方式来获得任何资源,

  Uri.parse(String.format("android.resource://%s/%s/%s",this.getPackageName(),"resource_folder_name","file_name"));