Нужна помощь в отладке моего кода - PullRequest
0 голосов
/ 27 октября 2011

Мне нужно немного информации о моем коде. По сути, у меня есть метод загрузки музыки из класса A

public void onListItemClick(ListView parent, View v, int position, long id){
    musicIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
    cursor.moveToPosition(position);
    filePath = cursor.getString(musicIndex);
    fileName = new File(filePath).getName();
    playMusic();//Play the selected music
}

public void playMusic(){
    if(mPlayer.isPlaying()){
        mPlayer.reset();
    }
    try{
        mPlayer.setDataSource(filePath);
        mPlayer.prepare();
        mPlayer.start();
        BeatDetection beatDetect = new BeatDetection();
        beatDetect.init();
    }catch (Exception e){

    }
}

Этот метод вызовет метод init() в классе B

public void init() throws Exception{
    energy = 0;
    variance = 0;
    constant = 0;
    isBeat = false;
    sensitivity = 0;
    dBuffer = new float[sampleRate / bufferSize];
    eBuffer = new float[sampleRate / bufferSize];
    timer = System.currentTimeMillis();
    MusicLoad msc = new MusicLoad();

    totalMs = 0;
    seeking = true;
    //msc.printText();
    decode(msc.fileName, 25, 40);
}

В этом методе он все инициализирует и вызывает decode() метод

public void decode(String path, int startMs, int maxMs)
  throws IOException, javazoom.jl.decoder.DecoderException {

    debug();
    File in = new File(path);
    InputStream inStream = new BufferedInputStream(new FileInputStream(in), 8 * 1024);
    ByteArrayOutputStream outStream = new ByteArrayOutputStream(1024);
    try {
         Bitstream bitstream = new Bitstream(inStream);
        Decoder decoder = new Decoder();

        boolean done = false;
        while (! done) {
            Header frameHeader = bitstream.readFrame();
            if (frameHeader == null) {
                done = true;
            } else {
                totalMs += frameHeader.ms_per_frame();

                if (totalMs >= startMs) {
                    seeking = false;
                }

                if (! seeking) {
                    SampleBuffer output = (SampleBuffer) decoder.decodeFrame(frameHeader, bitstream);

                    if (output.getSampleFrequency() != 44100 || output.getChannelCount() != 2) {
                        throw new javazoom.jl.decoder.DecoderException("mono or non-44100 MP3 not supported", null);
                    }

                    short[] pcm = output.getBuffer();
                    for (short s : pcm) {
                        outStream.write(s & 0xff);
                        outStream.write((s >> 8 ) & 0xff);
                    }
                }

                if (totalMs >= (startMs + maxMs)) {
                    done = true;
                }
            }
            bitstream.closeFrame();
        }

        byte[] abAudioData = outStream.toByteArray();
        calculation(abAudioData);
    } catch (BitstreamException e) {
        throw new IOException("Bitstream error: " + e);
    } catch (DecoderException e) {
        Log.w("Decoder error", e);
        throw new javazoom.jl.decoder.DecoderException("Error",e);
    } finally {
        inStream.close();
    }
}

Не прочь прочитать все строки кода. Если вы, ребята, заметили, я поставил debug() в начале, чтобы увидеть, вызывается метод или нет. На данный момент, debug() правильно вызывается. Однако, если я поставлю debug() после строки File in = new File(path);, debug() больше не будет вызываться. Похоже, что на этом этапе код останавливается.

В итоге я могу без проблем загружать и воспроизводить песню. Тем не менее, decode() не вызывается, и нет никакой ошибки вообще. Я застрял, указывая на проблему в этой точке. Так что, если есть какие-либо входные данные, пожалуйста, помогите мне.

EDIT: после того, как я попытался отследить переменную «path», он возвращает NULL, поэтому ошибка NullPointerException. Похоже, переменная "fileName" из класса A не передается в класс B. Любое предложение?

Ответы [ 3 ]

0 голосов
/ 27 октября 2011

Это просто то, что нужно посмотреть, но со страницы документа

http://developer.android.com/reference/java/io/File.html#File%28java.lang.String%29

"Фактический файл, на который ссылается Файл, может существовать или не существовать. Он можеттакже, несмотря на имя файла, может быть каталогом или другим нестандартным файлом. "

Если вы указали неправильный путь, возможно, он пытается создать файл, и у вас могут быть неправильные правасделать это.Возможно: WRITE_EXTERNAL_STORAGE.

0 голосов
/ 23 января 2013

Я знаю, что этот пост старый, но я просто хотел показать, как получить путь к файлу для чтения / записи файлов для других людей, которые встречают этот пост, как у меня:создаст (откроет, если он существует и перезапишет) файл с именем «sysout.log» в папке /data/data/com.app.name/files/;myContext - это просто текущий контекст.Использование этой техники облегчает проблемы с определением вашего собственного имени пути.Надеюсь, это кому-нибудь поможет.

0 голосов
/ 27 октября 2011

Если вы используете Eclipse с ADT, отладку ваших приложений для Android очень легко, просто добавьте точку останова (возможно, в новой строке File (...)) и посмотрите, что произойдет.

Мое предположениездесь File in = new File(path);, вероятно, генерирует IOException в вашем decode методе, это исключение сначала всплывает до init(), а затем до playMusic(), где оно перехватывается блоком try catch.Ваш улов пуст, поэтому вы ничего не видите.Попробуйте отладку, как я уже сказал, или добавьте некоторую информацию о регистрации в блоке catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...