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

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

我得到的 URI 的.mp3文件使用以下代码。

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(作为附件)

我不希望 resource ceId (2130968609)出现。

我想显示 fileName.mp3

我怎么能这么做? 我错过了什么吗?

或者

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

98569 次浏览

尝试将文件保存到 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,那么有两种方法:

  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保存在原始文件夹中,如下所示

通知 _ 声音. 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。