获取android中存储在res/raw文件夹中的.mp3文件的URI
我有许多.mp3文件存储在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("
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");代码>
android.resource://[package]/[resource\u id]
示例:Uri.parse(“android。resource://com.my.package/“+R.drawable.icon)代码>
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