загрузка файлов из каталога ресурсов - PullRequest
0 голосов
/ 13 марта 2012

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

...