我需要一些关于我的代码的输入。 基本上,我有一种从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){
}
}
该方法将调用B类中的init()
方法
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()
未被调用,并且没有任何错误。此时我一直在指出问题所在。所以,如果有任何意见,请帮助我。
编辑:在我尝试跟踪“path”变量后,它返回NULL,因此错误是NullPointerException。好像A类中的“fileName”变量没有传递给B类。有什么建议吗?
答案 0 :(得分:0)
如果您使用Eclipse与ADT,那么调试Android应用程序非常容易,只需添加一个断点(可能在新的文件(...)行中),看看会发生什么。
我的猜测是,File in = new File(path);
可能在您的decode
方法中抛出IOException,该异常首先冒泡到init()
然后再冒到playMusic()
,它在那里被try catch阻止了。你的捕获是空的,所以你没有看到任何东西。按照我的说法尝试调试或在catch块中添加一些日志信息。
答案 1 :(得分:0)
这只是一个值得关注的内容,但是来自doc页面
http://developer.android.com/reference/java/io/File.html#File%28java.lang.String%29
“文件引用的实际文件可能存在也可能不存在。尽管名称为File,它也可能是目录或其他非常规文件。”
如果您的路径有问题,可能是在尝试创建该文件,而您可能没有正确的权限。也许:WRITE_EXTERNAL_STORAGE。
答案 2 :(得分:0)
我知道这篇文章已经过时了,但我只想展示如何获取文件路径来读取/写入其他人的文件,因为我有:
String filePath = myContext.getFilesDir().getPath().toString() + "/sysout.log";
File file = new File(filePath);
这两行将在文件夹/data/data/com.app.name/files/
中创建(打开,如果它存在并覆盖)名为“sysout.log”的文件; myContext只是当前的上下文。使用此技术可以缓解定义自己的路径名称的问题。希望这有助于某人。