Получить URI файла .mp3, хранящегося в папке res/raw в android
У меня есть много файлов .mp3, хранящихся в папке res/raw.
Я получаю URI файла .mp3, используя следующий код.
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");
Когда я выбираю приложение Mail, например. Gmail или YahooMail из Акта совместного использования, mp3 файл прилагается успешно. Но это показывает, что 2130968609 (как приложение)
Я не хочу, чтобы resourceId (2130968609) появлялся.
Я хочу показать fileName.mp3
Как я могу это сделать? Я что-то пропустил?
ИЛИ
Есть ли другой способ подключить файл .mp3, хранящийся в res/raw для почты через Share Intent.
Ответы
Ответ 1
Наконец, после многого поиска я нашел решение.
Если вы хотите получить любой URI ресурса, то есть два способа:
-
Использование имени ресурса
Синтаксис: android.resource://[package]/[res type]/[res name]
Пример: Uri.parse("android.resource://com.my.package/drawable/icon");
-
Использование идентификатора ресурса
Синтаксис: android.resource://[package]/[resource_id]
Пример: Uri.parse("android.resource://com.my.package/" + R.drawable.icon);
Это были примеры получения URI любого файла изображения, хранящегося в папке с возможностью переноса.
Аналогичным образом вы можете получить URI для папки res/raw.
В моем случае я использовал 1-й способ, т.е. Использование имени ресурса
Ответ 2
Эта работа как магия:
Предполагая, что mp3 сохранен в исходной папке как
notification_sound.mp3
тогда простое выполнение:
Uri uri=Uri.parse("android.resource://"+getPackageName()+"/raw/notification_sound");
Ответ 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");
Ответ 4
Ответ в одну строку
RingtoneManager.getRingtone(getContext(),Uri.parse("android.resource://com.my.package/" + R.raw.fileName)).play();
Ответ 5
Попробуйте сохранить файл на 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;
}
Не забудьте удалить файл после успешного отправки сообщения электронной почты.
Ответ 6
Вот простой способ получить любой ресурс,
Uri.parse(String.format("android.resource://%s/%s/%s",this.getPackageName(),"resource_folder_name","file_name"));
Ответ 7
Не создавайте строку самостоятельно, используйте 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.