2017-05-21 12 views
0

私は現在、最初の小さなAndroidアプリプロジェクトとしてサウンドボードアプリを構築しています。 私のアプリのassetsフォルダに.mp3ファイルの束を保存し、そこでそこに格納された.mp3ファイルに基づいてボタンを動的に作成しました。すべてのボタンのタグで、対応する.mp3ファイル名を保存しました。メディアプレイヤーのデータソースとしてアセットを設定できません

すべてのボタンのonClick()イベントでは、グローバルMediaPlayerDataSourceを自分のアセットのファイルに設定しようとしています。 FileDescriptorはopenFdコマンドを完璧に処理しますが、mediaPlayerはDataSourceを設定できません。

このコマンドを実行すると、アプリがクラッシュするだけです。ここでOnClickListenerです:

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$2.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に見ていた:setDataSource()メソッドを実行するときに

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は、次のクラッシュを印刷します。 FileDescriptorが無効であるようです。

+0

'The App just crashes'それはクラッシュする理由のために例外スタックトレースを参照してください。 –

+0

[不幸にもMyAppが停止しました。どのように私はこれを解決することができますか?](http://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-this) –

+0

それは'トンも得た..私は設定e.printStackTraceへのブレークポイントですが、そこに到達する前に、即座にアプリケーションが終了します。 –

答えて

0

DataSourceを設定する前にrelease() MediaPlayerを設定しないでください。ただし、reset()とする必要があります。リベースmediaPlayer.release();mediaPlayer.reset();

+0

それはそれでした!ありがとう、たくさんの友達! これら2つの方法に関するAndroid APIの説明を読むと、それも完全に意味があります:) https://developer.android.com/reference/android/media/MediaPlayer.html –

関連する問題