我通过蓝牙套接字连接发送音频文件到另一台设备。我正在按字节复制字节,所以另一端的大小完全相同。 但是,当我尝试在另一端播放文件时,我只是发出尴尬的声音(每次启动播放器时听起来都有点不同)。
现在奇怪的部分:一旦我将“腐败”文件复制到另一个位置(通过一些安卓文件管理器),我就可以播放它,听起来完全没问题!
有什么想法吗?
发送:
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()));
}
}
答案 0 :(得分:1)
我发现在创建新文件后我必须启动媒体扫描程序。之后,它就像一个魅力!
sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));