如何保存音频文件并发送它们

时间:2016-12-10 15:49:24

标签: java android audio

我试图保存音频文件以将其发送到whatsapp,但我无法将其保存在外部存储设备上。我不知道我在哪里犯错误。

我正在使用此代码:

FileOutputStream outputStream;
File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES), "FUNG");
if (!file.mkdirs()) {}
try {
   outputStream = new FileOutputStream(file);
   outputStream.write(R.raw.badum2);
   outputStream.close();
} catch (FileNotFoundException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}

Intent shareIntent = new Intent(Intent.ACTION_SEND);
Uri uri = Uri.parse(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES) + "/FUNG/badum2.m4a");
shareIntent.setType("audio/m4a");
shareIntent.setPackage("com.whatsapp");
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(shareIntent);

当文件发送到WhatsApp时,它显示如下错误:

  

"无法分享,请再试一次"

我没有在目录中看到音频文件,所以我猜错误是我在外部存储上保存音频文件时遇到了一些错误。

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

我看到了多个问题:

(1)if (!file.mkdirs()) {}在文件路径创建目录,稍后您使用该目录打开输出流,这当然不起作用。

解决方案:

File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES), "FUNG/badum2.m4a"); // assumed target file
if (!file.getParentFile().mkdirs() && !file.getParentFile().isDirectory()) {
     // Abort! Directory could not be created!
}

(2)outputStream.write(R.raw.badum2);将写入引用的int值 对你的资源,而不是资源本身。

解决方案:

使用InputStream in = ctx.getResources().openRawResource(R.raw.badum2);其中ctx是一个Context实例(例如您的Activity)并将其内容写入该文件。

try {
    outputStream = new FileOutputStream(file);
    try {
        InputStream in = ctx.getResources().openRawResource(R.raw.badum2);
        byte[] buffer = new byte[4096];
        int read;
        while ((read = in.read(buffer, 0, buffer.length) >= 0) {
            outputStream.write(buffer, 0, read);
        }
        in.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    outputStream.close();
} catch (FileNotFoundException e) {
   e.printStackTrace();
} catch (IOException e) {
   e.printStackTrace();
}