无法在媒体播放器中将资产设置为数据源
Can't set asset as datasource in the mediaplayer
我目前正在构建音板应用程序作为我的第一个小 Android 应用程序项目。
我在我的应用程序的资产文件夹中保存了一堆 .mp3 文件,然后根据存储在其中的 .mp3 文件动态创建按钮。在每个按钮的标签中,我保存了它对应的.mp3文件名。
在每个按钮的 onClick()
事件中,我尝试将全局 MediaPlayer
的 DataSource
设置为我资产中的文件。 FileDescriptor
完美地处理了 openFd 命令,但 mediaPlayer 无法设置数据源。
应用程序在执行该命令后崩溃了。这是 OnClickListener
:
tempButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.release();
String tag = v.getTag().toString();
try {
AssetFileDescriptor afd = getAssets().openFd(tag + ".mp3");
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
});
logcat 在执行 setDataSource() 方法时打印出以下崩溃:
05-22 16:23:45.191 4505-4505/com.development.alo.dasunterboard E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.development.alo.dasunterboard, PID: 4505
java.lang.IllegalStateException
at android.media.MediaPlayer._setDataSource(Native Method)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1133)
at com.development.alo.dasunterboard.MainActivity.onClick(MainActivity.java:79)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我查看了 MediaPlayer.java,因为崩溃似乎发生在那里。
看起来 FileDescriptor 无效。
您不应该 release()
MediaPlayer 之前设置 DataSource,但应该 reset()
它。将 mediaPlayer.release();
替换为 mediaPlayer.reset();
我目前正在构建音板应用程序作为我的第一个小 Android 应用程序项目。 我在我的应用程序的资产文件夹中保存了一堆 .mp3 文件,然后根据存储在其中的 .mp3 文件动态创建按钮。在每个按钮的标签中,我保存了它对应的.mp3文件名。
在每个按钮的 onClick()
事件中,我尝试将全局 MediaPlayer
的 DataSource
设置为我资产中的文件。 FileDescriptor
完美地处理了 openFd 命令,但 mediaPlayer 无法设置数据源。
应用程序在执行该命令后崩溃了。这是 OnClickListener
:
tempButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mediaPlayer.release();
String tag = v.getTag().toString();
try {
AssetFileDescriptor afd = getAssets().openFd(tag + ".mp3");
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
mediaPlayer.prepare();
mediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
});
logcat 在执行 setDataSource() 方法时打印出以下崩溃:
05-22 16:23:45.191 4505-4505/com.development.alo.dasunterboard E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.development.alo.dasunterboard, PID: 4505
java.lang.IllegalStateException
at android.media.MediaPlayer._setDataSource(Native Method)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1133)
at com.development.alo.dasunterboard.MainActivity.onClick(MainActivity.java:79)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我查看了 MediaPlayer.java,因为崩溃似乎发生在那里。 看起来 FileDescriptor 无效。
您不应该 release()
MediaPlayer 之前设置 DataSource,但应该 reset()
它。将 mediaPlayer.release();
替换为 mediaPlayer.reset();