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

时间:2015-12-30 10:23:39

标签: android android-sdcard fileoutputstream

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

我已经尝试了十几个由stackoverflow上的答案提供的变体但是无法正常工作...

这是一次有趣的尝试。

    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应用并显示文件附件在那里但是当我将文件发送给自己时,它会干杯"无法附加文件"。

经过一番研究后,看起来棒棒糖的变化使得访问原始文件变得更加复杂。解决方法是将资源文件复制到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卡?

1 个答案:

答案 0 :(得分:0)

尝试在AndroidManifest.xml

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