将文件从 res/raw 复制到 SD 卡以使用 Intent.ACTION_SEND 发送

Copy a file from res/raw to SDcard to send using Intent.ACTION_SEND

目的是将文件从我的 apk 的原始文件夹复制到 SD 卡,以便随后可以使用 Intent.createChooser 将其传输到用户选择的应用程序。该文件将是一个 example.ogg 文件,该文件已存在于 res/raw 文件夹中。

我已经尝试了十几个由 Whosebug 上的答案提供的变体,但无法使任何东西起作用...

这是一次有趣的尝试。

    public void playSound1(View view) {
        exampleSound.start();
        if (cb.isChecked()){



            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("audio/ogg");
            share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///android:asset/example.ogg"));
            startActivity(Intent.createChooser(share, "Share Sound File"));
        }
    }

如果从选择器中选择文本选项,它只会告诉我不支持文件类型。但是,如果我选择 Gmail,它会打开 Gmail 应用程序并显示文件附件在那里,但是当我将文件发送给自己时,它会吐司 "unable to attach file".

经过一番研究后,lollipop 似乎发生了一些变化,这使得访问原始文件变得更加复杂。解决方法是将资源文件复制到 SD 卡,然后在您的应用程序关闭时删除该文件。在应用程序关闭时删除文件的原因是您需要文件存在直到选择器应用程序完成传输。

这是我的。

ActivityMain.java 片段

    public void playSound2(View view) throws IOException {
        exampleSound.start();

        InputStream in = getResources().openRawResource(R.raw.example1);
        FileOutputStream out = new FileOutputStream(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
        byte[] buff = new byte[1024];
        int read = 0;

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

这是AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.anjosoft.demo">

        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    </manifest>

我已经通过插入 exampleSound.start(); 进行了测试;在每一行之后播放,直到我将它放在 FileOutputStream 之后。然后应用程序崩溃。如何写入 SD 卡?

尝试在 AndroidManifest.xml

中添加写外部存储权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />