通过蓝牙流复制后损坏的音频文件

时间:2015-04-28 13:40:04

标签: android file sockets audio bluetooth

我通过蓝牙套接字连接发送音频文件到另一台设备。我正在按字节复制字节,所以另一端的大小完全相同。 但是,当我尝试在另一端播放文件时,我只是发出尴尬的声音(每次启动播放器时听起来都有点不同)。

现在奇怪的部分:一旦我将“腐败”文件复制到另一个位置(通过一些安卓文件管理器),我就可以播放它,听起来完全没问题!

有什么想法吗?

发送:

outputStream = mSocket.getOutputStream();
long totalLength = file.length();
String command = Protocol.COMMAND_SEND_FILE + Protocol.SEPARATOR + file.getName() + Protocol.SEPARATOR + totalLength;
outputStream.write(command.getBytes());
outputStream.flush();

long bytesWritten = 0;
while ((c = is.read(buffer, 0, buffer.length)) > 0) {
    outputStream.write(buffer, 0, c);
    outputStream.flush();

    bytesWritten += c;
}
mLogger.log("sent total of bytes", bytesWritten+"");
is.close();

接收

while (mRunning) {

    final StringBuilder sb = new StringBuilder();
    if (!mReceiveFile) {
        bytesRead = mInputStream.read(buffer);
        if (bytesRead != -1) {
            String result = "";
            while ((bytesRead == bufferSize) && (buffer[bufferSize] != 0)) {
                result = result + new String(buffer, 0, bytesRead);
                bytesRead = mInputStream.read(buffer);
            }
            result = result + new String(buffer, 0, bytesRead);
            sb.append(result);
        }
    } else {
        if (mLogger != null) {
            mLogger.log("receiving file", mReceiveFilename);
        }
        int c = 0;
        long bRead = 0;
        OutputStream oos = new FileOutputStream(Utils.getAppRootDir() + "/" + mReceiveFilename);

        while (bRead < mReceiveFileLength && (c = mInputStream.read(buffer, 0, buffer.length)) > 0) {
            if ((bRead + bufferSize) >= mReceiveFileLength) {
                c = (int) (mReceiveFileLength - bRead);
                mLogger.log("rest bytes", "" + c);
            }
            if(bRead < 10000 || bRead + 10000 > mReceiveFileLength){
                mLogger.log(new String(buffer));
            }
            oos.write(buffer, 0, c);
            oos.flush();
            bRead += c;
            mLogger.log("read " + bRead + " of " + mReceiveFileLength + " bytes");
        }
        oos.close();


        mLogger.log("saved file", mReceiveFilename);


        mReceiveFile = false;
        mReceiveFilename = null;

    }
    if (sb.toString().startsWith(Protocol.COMMAND_SEND_FILE)) {
        // "SEND_FILE:filename.ext"
        try {
            String[] command = sb.toString().split(Protocol.SEPARATOR);
            mReceiveFile = true;
            mReceiveFilename = command[1];
            mReceiveFileLength = Long.parseLong(command[2]);
        } catch (Exception e) {
            mLogger.log("Protocoll exception command could not be parsed:" + sb.toString());
        }
    } else {
        EventBus.getDefault().post(new BluetoothCommunicator(sb.toString()));
    }

}

1 个答案:

答案 0 :(得分:1)

我发现在创建新文件后我必须启动媒体扫描程序。之后,它就像一个魅力!

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));