2011-10-27 21 views
0

私のコードについていくつかの入力が必要です。 は基本的に、私はこの方法は、その方法では、クラス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); 
} 

init()メソッドを呼び出します、そのクラス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){ 

    } 
} 

から音楽をロードするための方法を持っている、それはすべてを初期化し、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()が正しく呼び出されます。しかし、File in = new File(path);の行の後にdebug()を置くと、debug()はもう呼び出されません。その時点でコードが停止しているようです。

究極の結果は、問題なく読み込んで再生できます。ただし、decode()は呼び出されず、エラーはまったくありません。私はこの時点で問題を指摘することに固執しています。だから何か入力があれば私を助けてください。

EDIT: "path"変数をトレースしようとすると、NULLが返され、エラーはNullPointerExceptionになります。クラスAの変数 "fileName"がクラスBに渡されていないようです。

+0

ファイルの定義はどこですか? – Soren

+0

'playMusic()'に例外がスローされたかどうかを確認し、 'e 'を入れてください。キャッチブロック内のprintStackTrace() 'を参照してください。 – Reno

+0

質問を編集しました。 –

答えて

0

EclipseをADTで使用している場合は、Androidアプリケーションをデバッグするのは非常に簡単です。ブレークポイント(新しいファイル(...)行に追加)を追加して何が起こるかを確認するだけです。ここ

私の推測では、File in = new File(path);おそらくあなたdecode方法にIOExceptionが投げている、その例外は、それがトライcatchブロックでキャッチされplayMusic()、第1〜第init()にして、バブリングされていることです。あなたのキャッチは空ですので、あなたは何も見ていません。私が言ったようにデバッグを試みるか、キャッチブロックにいくつかのロギング情報を追加してください。

+0

質問を編集しました。質問を編集しました。 –

+0

私が言及したデバッグツールを使用してください。パス変数をトレースします。 – aromero

0

これはただ見て何かですが、ドキュメントのページから

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

「ファイルが参照する実際のファイルが存在するかどうかわからない。それはまたかもしれない、名前のファイルにもかかわらず、ディレクトリや他の非正規ファイルである可能性があります。

パスが間違っていると、ファイルを作成しようとしている可能性があり、そのための正しいアクセス許可がない可能性があります。おそらく:WRITE_EXTERNAL_STORAGE。

0

私はこの記事が古いですけど、私はちょうど私が持っているように、この記事に出くわし他人のために/書き込みファイルを読み取るために、ファイルのパスを取得する方法を示したかった:

String filePath = myContext.getFilesDir().getPath().toString() + "/sysout.log"; 
File file = new File(filePath); 

この2行う/data/data/com.app.name/files/というフォルダに「sysout.log」という名前のファイルを作成(存在する場合は開いて上書き)します。 myContextは現在のコンテキストです。この手法を使用すると、独自のパス名を定義する際の問題が緩和されます。これが誰かを助けることを望みます。

関連する問題