首页 > 解决方案 > 使用 Android Intent 共享文件:文件扩展名已删除

问题描述

我正在使用以下代码与 Android Studio 3.3.2 和 Java 共享音频文件。该文件是从 /raw/ 文件夹中提取的。

public void funktionTeilen(String file) {
    Uri uri = Uri.parse("android.resource://" + this.getPackageName() + "/raw/" + file);
    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("audio/mpeg3");
    share.putExtra(Intent.EXTRA_STREAM, uri);
    startActivity(Intent.createChooser(share, "Audio teilen"));
}

原则上共享工作正常,但文件在没有文件扩展名的情况下发送,这当然使大多数应用程序无法读取。如果我手动添加文件扩展名(例如从电子邮件客户端下载后),MP3 工作正常。

“文件”由另一个函数输入,对应于原始文件夹中的文件名。基本也找到了,不然分享过程根本就不行。

那么,如何在保留文件扩展名的情况下共享文件?谢谢你的帮助!

更新#1

public void funktionTeilen(String Datei) {


    try {
        File tmpFile = new File(this.getCacheDir() + "/tmpfile.mp3");
        InputStream in = getResources().openRawResource(R.raw.meise1);
        FileOutputStream out = new FileOutputStream(tmpFile, true);
        byte[] buff = new byte[1024];
        int read = 0;

        try {
            while ((read = in.read(buff)) > 0) {
                out.write(buff, 0, read);
            }
        } finally {
            in.close();
            out.close();
        }

        // Uri uri = FileProvider.getUriForFile(this, this.getPackageName(), tmpFile);
        Uri uri = Uri.fromFile(tmpFile);
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("audio/*");
        share.putExtra(Intent.EXTRA_STREAM, uri);
        startActivity(Intent.createChooser(share, "Audio teilen"));

    } catch (Exception e) {
        Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
    }

}

标签: javaandroidfileaudiosharing

解决方案


我正在使用以下代码与 Android Studio 3.3.2 和 Java 共享音频文件

您正在共享资源。那是你的开发机器上的一个文件。它不是设备上的文件。

原则上共享工作正常,但文件在没有文件扩展名的情况下发送,这当然使大多数应用程序无法读取。

在 Android 中,当我们使用 Android SDK 处理资源时,资源没有文件扩展名。

那么,如何在保留文件扩展名的情况下共享文件?

如果您共享一个实际文件,使用FileProvider,它将具有文件扩展名。因此,将与您的资源对应的字节复制到一个文件中(例如 in getCacheDir()),然后设置FileProvider并使用FileProvider.getUriForFile()以获取UriEXTRA_STREAM.


推荐阅读