Подтвердить что ты не робот

Получить 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.

4b9b3361

Ответ 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.