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

获取android中存储在res/raw文件夹中的.mp3文件的URI,android,audio,share,Android,Audio,Share,我有许多.mp3文件存储在res/raw文件夹中 我使用以下代码获取.mp3文件的URI Uri.parse("android.resource:///com.my.android.sharesound/"+resId); 这将返回:android。resource:///com.my.android.sharesound/2130968609 现在我正在使用这个URI创建共享意图 shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("

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

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

Uri.parse("android.resource:///com.my.android.sharesound/"+resId);
这将返回:
android。resource:///com.my.android.sharesound/2130968609

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

    shareIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("android.resource://com.my.android.sharesound/"+resId));
    startActivity(Intent.createChooser(shareIntent,"Share Sound");
当我从共享意图中选择任何邮件应用程序(如Gmail或YahooMail)时,mp3文件将成功附加。但它显示2130968609(作为附件)

我不希望resourceId(2130968609)出现

我想显示fileName.mp3

我该怎么做?我错过什么了吗


有没有其他方法可以通过共享意图将存储在res/raw中的.mp3文件附加到邮件中。

尝试将文件保存到SD卡,然后发送新的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,有两种方法:

  • 使用资源名称

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

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

  • 使用资源Id

    语法:
    android.resource://[package]/[resource\u id]

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

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

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

    在我的例子中,我使用了第一种方式,即使用资源名,这就像魔术一样: 假设mp3保存在原始文件夹中为

    通知u sound.mp3

    那么简单的做法就是:

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

    这是一个获取任何资源的干净方法

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

    以下是一些可能对某人有所帮助的方法:

        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);
        }
    
    只需按如下方式调用该方法:

    Uri rawUri = getRawUri("myFile.filetype");
    
    单线回答

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

    不要自己构造字符串,请使用
    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()
    

    来自AOSP DeskClock。

    谢谢雷诺。但是你不认为将文件写入SD卡、获取uri然后删除它需要一些时间吗?。。删除会给我带来问题。我应该什么时候删除该文件?。我们无法预测共享意向应用程序。结果。没错,这只是一个解决办法,以防你什么都得不到。当你的应用程序关闭时删除临时目录。@Kartik,它为某人工作。确定。我认为没有其他方法可以获得res的URI。我还有其他问题,但只与此相关。当我选择任何邮件应用程序时,文件将被附加。但是当我选择Whatsapp时,它会要求我选择联系人,但不会显示附件。我真的不知道Whatsapp如何处理他们的附件意图,是的,选择方便的选项谢谢你的回答。在我看来,我认为第二种方法更可取,因为重命名资源等可以很容易地重构。因此,我选择了它。为了帮助重构,您还可以用
    Context.getPackageName()
    替换包名。哦,为了继续有趣的花絮,您可以使用
    File.separator
    而不是硬编码
    /
    。而且,您可能会疯狂使用
    File.pathseptor
    而不是硬编码
    。还有,回答得很好!谢谢你的回答。。。我选择了两种方式。
    “android.resource”
    =
    ContentResolver.SCHEME\u android\u resource
    ContentResolver,getPackageName()???什么样的导入才能使这些文件正常工作?context-context.getPackageName()在
    文件.pathSeparator
    后面需要一个额外的
    文件.separator