0

Я делаю приложение для Android, которое воспроизводит аудиофайл и переворачивается между двумя экранами. когда я нажимаю на экран, воспроизводится звук и появляется следующий экран. Я могу сделать это примерно десять раз, прежде чем звук остановится, но я могу продолжать нажимать на кнопку и перейти к следующему экрану. Я уже посмотрел mediaplayer-stops-playing-after-playing-a-few-times. Тем не менее, я не знаю, как применить это к моей проблеме, и добавление mp.release к одному из моих действий привело к появлению новой ошибки. Кто-нибудь знает решение? Мой звуковой файл составляет около 1,1 мегабайта и длится 1 секунду.Приложение для ношения одежды для Android только воспроизводит медиа 10 раз

Вот мой код:

public class MainActivity extends AppCompatActivity { 
    final MediaPlayer mp = new MediaPlayer(); 
    //used to be final 





    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     //start out with head up 
     setContentView(R.layout.activity_main); 

     ImageButton button1 = (ImageButton) findViewById(R.id.imageButton); 

     button1.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
           //handles audio 

        if (mp.isPlaying()) { 
         mp.stop(); 
        } 
        //mp.release(); 


       try { 
        mp.reset(); 
        AssetFileDescriptor afd; 
        afd = getAssets().openFd("Coin_Flip_Sound.mp3"); 
        mp.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 
        mp.prepare(); 
        mp.start(); 

       } catch (IllegalStateException e) { 
        e.printStackTrace(); 
        System.out.println("This is Hans and their is a Illegal State "); 
       } catch (IOException e) { 
        e.printStackTrace(); 
        System.out.println("This is a IO Exception"); 
       } 



















       //generate random int 
       double flip = Math.random(); 
       if (flip > .5) { 

        Intent intent = new Intent(v.getContext(), Back.class); 
        startActivityForResult(intent, 0); 
       } 
      } 
     }); 

Вот LogCat, когда я получаю сообщение об ошибке:

02-01 14:24:09.675 2061-2061/com.example.hansg17.watchflip I/Choreographer﹕ Skipped 200 frames! The application may be doing too much work on its main thread. 
02-01 14:24:09.699 2061-2061/com.example.hansg17.watchflip D/gralloc_goldfish﹕ Emulator without GPU emulation detected. 
02-01 14:24:48.601 2061-2061/com.example.hansg17.watchflip D/MediaPlayer﹕ setSubtitleAnchor in MediaPlayer 
02-01 14:24:52.410 2061-2061/com.example.hansg17.watchflip D/MediaPlayer﹕ setSubtitleAnchor in MediaPlayer 
02-01 14:24:53.249 2061-2061/com.example.hansg17.watchflip D/MediaPlayer﹕ setSubtitleAnchor in MediaPlayer 
02-01 14:24:53.418 2061-2061/com.example.hansg17.watchflip D/MediaPlayer﹕ setSubtitleAnchor in MediaPlayer 
02-01 14:24:53.631 2061-2061/com.example.hansg17.watchflip D/MediaPlayer﹕ setSubtitleAnchor in MediaPlayer 
02-01 14:24:54.293 2061-2061/com.example.hansg17.watchflip I/Choreographer﹕ Skipped 240 frames! The application may be doing too much work on its main thread. 
02-01 14:24:54.465 2061-2061/com.example.hansg17.watchflip D/MediaPlayer﹕ setSubtitleAnchor in MediaPlayer 
02-01 14:24:55.135 2061-2061/com.example.hansg17.watchflip I/Choreographer﹕ Skipped 84 frames! The application may be doing too much work on its main thread. 
02-01 14:24:55.400 2061-2061/com.example.hansg17.watchflip D/MediaPlayer﹕ setSubtitleAnchor in MediaPlayer 
02-01 14:24:56.023 2061-2074/com.example.hansg17.watchflip E/MediaPlayer﹕ error (1, -19) 
02-01 14:24:56.059 2061-2061/com.example.hansg17.watchflip E/MediaPlayer﹕ invoke failed: wrong state 0 
02-01 14:24:56.059 2061-2061/com.example.hansg17.watchflip E/MediaPlayer﹕ Error (1,-19) 
02-01 14:24:56.089 2061-2061/com.example.hansg17.watchflip E/MediaPlayer﹕ Error (1,-1010) 
02-01 14:24:56.213 2061-2061/com.example.hansg17.watchflip D/MediaPlayer﹕ setSubtitleAnchor in MediaPlayer 
02-01 14:24:56.473 2061-2073/com.example.hansg17.watchflip W/art﹕ Suspending all threads took: 5.220ms 
02-01 14:24:56.782 2061-2459/com.example.hansg17.watchflip E/MediaPlayer﹕ error (1, -19) 
02-01 14:24:56.787 2061-2061/com.example.hansg17.watchflip E/MediaPlayer﹕ invoke failed: wrong state 0 
02-01 14:24:56.787 2061-2061/com.example.hansg17.watchflip E/MediaPlayer﹕ Error (1,-19) 
02-01 14:24:56.788 2061-2061/com.example.hansg17.watchflip E/MediaPlayer﹕ Error (1,-1010) 

Logcat после выключения:

02-01 14:18:56.884  961-2788/? E/AudioFlinger﹕ createTrack_l() initCheck failed -12; no control block? 
02-01 14:18:56.884  961-2788/? E/AudioTrack﹕ AudioFlinger could not create track, status: -12 
02-01 14:18:56.886  961-2788/? E/AudioSink﹕ Unable to create audio track 
02-01 14:18:56.887  961-2788/? W/NuPlayerRenderer﹕ openAudioSink: non offloaded open failed status: -19 
02-01 14:18:56.887  961-2786/? E/NuPlayer﹕ received error(0xffffffed) from audio decoder, flushing(0), now shutting down 
02-01 14:18:56.887  961-2786/? D/NuPlayerDriver﹕ notifyListener_l(0xb619abc0), (100, 1, -19) 
02-01 14:18:56.887 2004-2015/com.example.hansg17.watchflip E/MediaPlayer﹕ error (1, -19) 
02-01 14:18:56.887  961-2788/? W/NuPlayerRenderer﹕ onDrainAudioQueue(): audio sink is not ready 
02-01 14:18:56.888  961-2788/? W/NuPlayerRenderer﹕ onDrainAudioQueue(): audio sink is not ready 
02-01 14:18:56.891  961-2789/? W/AMessage﹕ failed to post message as target looper for handler 0 is gone. 
02-01 14:18:56.898 2004-2004/com.example.hansg17.watchflip E/MediaPlayer﹕ Error (1,-19) 
02-01 14:18:56.927 1300-1319/system_process I/ActivityManager﹕ Displayed com.example.hansg17.watchflip/.Back: +56ms 
02-01 14:18:57.389 1300-1319/system_process I/Choreographer﹕ Skipped 32 frames! The application may be doing too much work on its main thread. 
02-01 14:18:57.460 1300-1319/system_process I/Choreographer﹕ Skipped 41 frames! The application may be doing too much work on its main thread. 
02-01 14:18:57.526 1300-1319/system_process I/Choreographer﹕ Skipped 33 frames! The application may be doing too much work on its main thread. 

Если вы хотите больше LogCat Спроси меня. Существует много.

+0

Просто предложение, MediaPlayer не идеально подходит для коротких клипов, таких как флип для монет. См. Http://stackoverflow.com/questions/13883883 для примера кода с использованием SoundPoolPlayer, может быть лучшей альтернативой. – String

+0

Я действительно не понимаю звуковой пул, и информации за пределами StackOverflow не так много – hgund

ответ

0

Я бы по-прежнему рекомендовал SoundPool (в этом сообщении SO, с которым я связан, чтобы получить вас, достаточно информации). Но если вы предпочитаете использовать MediaPlayer, я бы предложил переместить большую часть вашего кода из обработчика onClick. Что-то вроде этого:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    ... 

    mp.reset(); 
    AssetFileDescriptor afd = getAssets().openFd("Coin_Flip_Sound.mp3"); 
    mp.setDataSource(afd.getFileDescriptor(), 
      afd.getStartOffset(), afd.getLength()); 
    mp.prepareAsync(); 

    ImageButton button1 = (ImageButton) findViewById(R.id.imageButton); 
    button1.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      if (mp.isPlaying()) { 
       mp.stop(); 
      } 

      try { 
       mp.start(); 
      } catch (Exception e) { 
       ... 
      } 

      //generate random int 
      ... 
     } 
    }); 
} 

Другими словами, нет никакой необходимости, чтобы загрузить ресурс и prepare в MediaPlayer каждый раз, когда вы нажимаете на кнопку; сделайте это один раз, заранее. Обратите внимание, что я использовал prepareAsync(), а не только prepare(), перемещая доступ к файловой системе и MediaPlayer Инициализация от потока пользовательского интерфейса. Также обратите внимание, что я использовал prepareAsync(), а не только prepare(), перемещая доступ к файловой системе и MediaPlayer.