【问题标题】:Get URI of .mp3 file stored in res/raw folder in android获取存储在 android 的 res/raw 文件夹中的 .mp3 文件的 URI
【发布时间】:2011-12-20 00:58:47
【问题描述】:

我有很多 .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("android.resource://com.my.android.sharesound/"+resId));
    startActivity(Intent.createChooser(shareIntent,"Share Sound");

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

我不希望 resourceId(2130968609) 出现。

我想显示 fileName.mp3

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

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

【问题讨论】:

    标签: android audio share


    【解决方案1】:

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

    如果你想获取任何资源 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。

    就我而言,我使用了第一种方式,即。使用资源名称

    【讨论】:

    • 感谢您的回答。 IMO,我认为第二种方法是首选,因为重命名资源等可以很容易地重构。因此,我选择了它。
    • 为了帮助重构,你也可以用Context.getPackageName()替换包名
    • 哦,为了继续有趣的花絮,您可以使用File.separator 而不是硬编码/。而且,你可以用File.pathSeparator 而不是硬编码: 发疯。另外,很好的答案!
    • 感谢您的出色回答...我选择了两种方式。
    • "android.resource" = ContentResolver.SCHEME_ANDROID_RESOURCE
    【解决方案2】:

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

    notification_sound.mp3

    然后简单地执行此操作:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • ContentResolver, getPackageName() ???什么进口才能让这些工作?
        • 上下文 - context.getPackageName()
        • File.pathSeparator 后面需要一个额外的File.separator
        【解决方案5】:

        一行回答

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

        【讨论】:

          【解决方案6】:

          这是获取任何资源的干净方法,

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

          【讨论】:

            【解决方案7】:

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

            邮件发送成功后记得删除文件。

            【讨论】:

            • 谢谢雷诺。但是您不认为将文件写入sdcard,获取uri然后删除它需要一些时间。 ?..删除会给我带来问题。我什么时候应该删除文件?我们无法预测 Share Intent 应用程序。结果。
            • 没错,这只是一种解决方法,以防万一您什么也得不到。应用关闭时删除临时目录。
            • @Kartik Try this solution,它对某人有用。
            • 好的。我认为没有其他方法可以获取 res 的 URI。我还有其他问题,但仅与此有关。当我选择任何邮件应用程序时,文件会被附加。但是当我选择 Whatsapp 时,它要求我选择联系人,但不显示附件。
            • 我真的不知道 Whatsapp 如何处理他们的附件意图,是的,选择方便的选项
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-10-05
            • 2012-06-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多