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

时间:2011-11-02 05:22:34

标签: 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创建Share Intent

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

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

我不希望出现resourceId(2130968609)。

我想显示fileName.mp3

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

OR

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

7 个答案:

答案 0 :(得分:153)

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

如果您想获取任何资源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);

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

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

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

答案 1 :(得分:32)

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

  

notification_sound.mp3

然后简单地做这件事:

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

答案 2 :(得分:3)

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

    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");

答案 3 :(得分:2)

一行回答

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

答案 4 :(得分:1)

尝试将文件保存到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;
 }    

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

答案 5 :(得分:0)

这是一种获取任何资源的简洁方法,

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

答案 6 :(得分:0)

不要自己构造字符串,请使用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桌面时钟。