使用Android Intent共享文件:文件扩展名已删除

时间:2019-04-23 21:21:31

标签: java android file audio sharing

我正在使用以下代码与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();
    }

}

2 个答案:

答案 0 :(得分:0)

  

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

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

  

原则上,共享可以很好地工作,但是文件发送时没有文件扩展名,这当然会使大多数应用程序不可读。

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

  

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

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

答案 1 :(得分:0)

我制定了解决方案!

MainActivity.java

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, false);
        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();
            /* if (tmpFile.exists()) {
                Toast.makeText(MainActivity.this, tmpFile.getAbsolutePath(), Toast.LENGTH_LONG).show();
            } */
        }

        Uri uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID, tmpFile.getAbsoluteFile());
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("audio/mpeg3");
        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();
    }

}

AndroidManifest.xml

<application>
        <provider
        android:name="android.support.v4.content.FileProvider"
        android:grantUriPermissions="true"
        android:exported="false"
        android:authorities="${applicationId}">

        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_provider_paths"/>

    </provider>

</application>

file_provider_paths.xml

<paths>
    <cache-path name="cache" path="/" />
    <files-path name="files" path="/" />
</paths>