Helo.
Я пишу Java-приложение для Android 2.2.
Я пытаюсь загрузить файл, получив его InputStream.насколько я понял, я должен поместить файл в каталог активов.
Я загружаю файл, используя следующий код:
InputStream audioFileStream=null;
try {
audioFileStream = getResources().getAssets().open("bounce.wav");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
, когда я запускаю приложение, я получаю следующее сообщение:
W/System.err(339): java.io.IOException: BufferedInputStream is closed
я должен поместить файл в каталог ресурсов?я должен использовать вместо getResource?и если да, то как?
это мое первое приложение для андроида (кроме основного привета), поэтому, пожалуйста, держитесь со мной :))
спасибо
подробнее
Я нашел похожий вопрос в Чтение простого текстового файла , поэтому я попытался поместить файл в res / raw, и после завершения кода нашел файл, используя следующий код:
audioFileStream = getResources().openRawResource(R.raw.bounce);
, но при запуске приложения оно показало следующую ошибку:
03-13 01:56:45.012: W/System.err(373): java.io.IOException: BufferedInputStream is closed
update
- bubble.wav - очень маленький файл wav.
- Я не делаю никаких вызовов BufferInputStream.close ()
в общем, я хочу загрузить файл WAV, получить необработанный PCM и воспроизвести его (и манипулировать им)в будущем).
это основной класс представления:
открытый класс Panel расширяет View {
private Paint mPaint;
public Panel(Context context) {
super(context);
mPaint = new Paint();
mPaint.setDither(true);
mPaint.setColor(0xFFFFFF00);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(3);
}
@Override
public void onDraw(Canvas canvas) {
Path path = new Path();
path.moveTo(100, 100);
path.lineTo(200, 200);
canvas.drawPath(path,mPaint);
InputStream audioFileStream=null;
audioFileStream = getResources().openRawResource(R.raw.bounce);
ParseWav playWav = new ParseWav();
playWav.loadWavFile(audioFileStream);
}
, и это класс ParseWav:
// Modified from
// - android-tuner project at google code: http://code.google.com/p/androidtuner/
// - http://mindtherobot.com/blog/580/android-audio-play-a-wav-file-on-an-audiotrack/
public class ParseWav extends AudioAbstract {
private static final String RIFF_HEADER = "RIFF";
private static final String WAVE_HEADER = "WAVE";
private final String FMT_HEADER = "fmt ";
private final String DATA_HEADER = "data";
private final int HEADER_SIZE = 44;
private final String CHARSET = "ASCII";
private String LOG_TAG = "PitchDetector";
public void loadWavFile(InputStream audioFileStream) {
//http://developer.android.com/reference/java/io/FileInputStream.html
InputStream in = null;
try {
in = new BufferedInputStream(audioFileStream);
}
finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
WavInfo wavInfo=null;
byte[] wavePcm=null;
try {
wavInfo = this.readHeader(in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WavException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
wavePcm = this.readWavPcm(wavInfo, in);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.play(wavePcm);
}
private void checkFormat(boolean bSuccess, String message) throws WavException {
if (!bSuccess) {
Log.e(LOG_TAG, message);
throw new WavException();
}
}
public WavInfo readHeader(InputStream wavStream) throws IOException, WavException {
ByteBuffer buffer = ByteBuffer.allocate(HEADER_SIZE);
buffer.order(ByteOrder.LITTLE_ENDIAN);
wavStream.read(buffer.array(), buffer.arrayOffset(), buffer.capacity());
buffer.rewind();
buffer.position(buffer.position() + 20);
int format = buffer.getShort();
checkFormat(format == 1, "Unsupported encoding: " + format); // 1 means
// Linear
// PCM
int channels = buffer.getShort();
checkFormat(channels == 1 || channels == 2, "Unsupported channels: "
+ channels);
int rate = buffer.getInt();
checkFormat(rate <= 48000 && rate >= 11025, "Unsupported rate: " + rate);
buffer.position(buffer.position() + 6);
int bits = buffer.getShort();
checkFormat(bits == 16, "Unsupported bits: " + bits);
int dataSize = 0;
while (buffer.getInt() != 0x61746164) { // "data" marker
Log.d(LOG_TAG, "Skipping non-data chunk");
int size = buffer.getInt();
wavStream.skip(size);
buffer.rewind();
wavStream.read(buffer.array(), buffer.arrayOffset(), 8);
buffer.rewind();
}
dataSize = buffer.getInt();
checkFormat(dataSize > 0, "wrong datasize: " + dataSize);
return new WavInfo(rate, channels, dataSize);
}
public byte[] readWavPcm(WavInfo info, InputStream stream)
throws IOException {
byte[] data = new byte[info.dataSize];
stream.read(data, 0, data.length);
return data;
}
public void play(byte[] byteData)
{
// Set and push to audio track..
int intSize = android.media.AudioTrack.getMinBufferSize(44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM);
if (at != null) {
at.play();
// Write the byte array to the track
at.write(byteData, 0, byteData.length);
at.stop();
at.release();
}
else {
Log.d("TCAudio", "audio track is not initialised ");
}
int a=1;
}
}
упс
я закрыл InputStream !!!собираюсь проверить это, как только я вернусь с работы!спасибо!
спасибо
kfir