Звук не играет в android> мороженое сэндвич

Я использовал следующий код для воспроизведения звука. Все работало отлично до ICS. Но на ICS и более высоких версиях звук не слышен. Нет ошибки, но звук не слышен.

РЕДАКТИРОВАТЬ: Обратите внимание, что следующий код запускается приемником в широкополосном режиме. Приемник BroadCast вызывает асинхронную задачу. В методе post-процесса asycn-задачи вызывается следующий метод.

Какова может быть ошибка?

public static void playSound(final Context context, final int volume,
            Uri uri, final int stream, int maxTime, int tickTime) {
        //stopPlaying();
        /*
        if (stream < 0 || stream > 100) {
            throw new IllegalArgumentException(
                    "volume must be between 0 and 100 .Current volume "
                            + volume);
        }*/

        final AudioManager mAudioManager = (AudioManager) context
                .getSystemService(Context.AUDIO_SERVICE);

        int deviceLocalVolume = getDeviceVolume(volume,
                mAudioManager.getStreamMaxVolume(stream));

        Log.d(TAG,
                "device max volume = "
                        + mAudioManager.getStreamMaxVolume(stream)
                        + " for streamType " + stream);
        Log.d(TAG, "playing sound " + uri.toString()
                + " with device local volume " + deviceLocalVolume);

        final int oldVolume = mAudioManager.getStreamVolume(stream);

        // set the volume to what we want it to be. In this case it max volume
        // for the alarm stream.
        Log.d(Constants.APP_TAG, "setting device local volume to " + deviceLocalVolume);
        mAudioManager.setStreamVolume(stream, deviceLocalVolume,
                AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

         final MediaPlayer mediaPlayer = new MediaPlayer();
         golbalMMediaPlayer = mediaPlayer;

        try {
             final OnPreparedListener OnPreparedListener = new OnPreparedListener() {

                @Override
                public void onPrepared(final MediaPlayer mp) {
                    Log.d(TAG, "onMediaPlayercompletion listener");
                    mp.start();
                    countDownTimer.start();
                }
            };

            mediaPlayer.setDataSource(context.getApplicationContext(), uri);
            mediaPlayer.setAudioStreamType(stream);
            mediaPlayer.setLooping(false);
            mediaPlayer.setOnPreparedListener(OnPreparedListener);
            mediaPlayer.setOnCompletionListener(new OnCompletionListener() {

                @Override
                public void onCompletion(MediaPlayer mp) {
                    Log.d(Constants.APP_TAG, "Entered onCompletion listener of mediaplayer");
                    mAudioManager.setStreamVolume(stream, oldVolume,
                            AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
                    try{
                    if(mediaPlayer != null && mediaPlayer.isPlaying()){
                        mediaPlayer.release();
                    }
                    }catch(Exception ex){
                        Log.e(Constants.APP_TAG, "error on oncompletion listener" ,ex);
                    }
                }

            });

             CountDownTimer timer = new CountDownTimer(maxTime*1000, tickTime*1000) {

                @Override
                public void onTick(long millisUntilFinished) {
                    Log.d(TAG, "tick while playing sound ");
                }

                @Override
                public void onFinish() {
                    Log.d(TAG, "timer finished");
                    stopPlaying();
                }
            };

            countDownTimer = timer;

            mediaPlayer.prepareAsync();

        } catch (Exception e) {
            Log.e(TAG, "problem while playing sound", e);
        } finally {

        }
    }

ЖУРНАЛЫ:

:07-01 00:00:00.030: D/beephourly(9500): device max volume = 7 for streamType 5
07-01 00:00:00.030: D/beephourly(9500): playing sound content://media/internal/audio/media/166 with device local volume 7
07-01 00:00:00.030: D/beephourly(9500): setting device local volume to 7
07-01 00:00:00.080: D/beephourly(9500): vibrating with pattern = [[email protected]
07-01 00:00:00.090: D/beephourly(9500): will show normal notification
07-01 00:00:00.100: D/beephourly(9500): notification is enabled
07-01 00:00:00.100: D/usersettings(9500): hr = 0
07-01 00:00:00.110: D/beephourly(9500): onMediaPlayercompletion listener
07-01 00:00:00.451: D/beephourly(9500): tick while playing sound 
07-01 00:00:20.460: D/beephourly(9500): timer finished
07-01 00:00:20.460: D/beephourly(9500): got request to stop playing
07-01 00:00:20.460: D/beephourly(9500): cancelling countdowntimer
07-01 00:00:20.460: D/beephourly(9500): releasing mediaplayer now

Ответ 1

Попробуйте следующее:

Воспроизведение звука

public class PlaySound extends Activity implements OnTouchListener {
  private SoundPool soundPool;
  private int soundID;
  boolean loaded = false;


/** Called when the activity is first created. */

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  View view = findViewById(R.id.textView1);
  view.setOnTouchListener(this);
  // Set the hardware buttons to control the music
  this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
  // Load the sound
  soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
  soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {

  @Override
  public void onLoadComplete(SoundPool soundPool, int sampleId,
      int status) {
     loaded = true;
  }
  });
  soundID = soundPool.load(this, R.raw.sound1, 1);

  }

 @Override
 public boolean onTouch(View v, MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
  // Getting the user sound settings
  AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
  float actualVolume = (float) audioManager
      .getStreamVolume(AudioManager.STREAM_MUSIC);
  float maxVolume = (float) audioManager
      .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
  float volume = actualVolume / maxVolume;
  // Is the sound loaded already?
  if (loaded) {
    soundPool.play(soundID, volume, volume, 1, 0, 1f);
    Log.e("Test", "Played sound");
  }
}
 return false;
}
} 

Файл макета:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="Click on the screen to start playing" >
</TextView>

</LinearLayout> 

Ссылка источника: http://www.vogella.com/tutorials/AndroidMedia/article.html#sound

Ответ 2

Иногда объекты MediaPlayer должны быть объявлены как общедоступные переменные или они будут удалены с помощью Dalvik Heap.

public final MediaPlayer mediaPlayer = new MediaPlayer();

Ответ 3

private MediaPlayer mPlayer;
....
SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
    int iTmp = sp.load(getBaseContext(), R.raw.windows_8_notify, 1); 
    sp.play(iTmp, 1, 1, 0, 0, 1);
    mPlayer = MediaPlayer.create(getBaseContext(), R.raw.windows_8_notify);
    mPlayer.start();
    mPlayer.setLooping(true); }

Во-первых, где все ваши рядовые, перед onCreate, помещают первую строку, тогда внутри InsideCreate запустите музыку, просто убедитесь, что вы изменили "windows_8_notify" на название песни, которую хотите.

Ответ 4

Я бы обернул вызов в IllegalStateException, запустил его через отладчик и посмотрел, что вы получаете.

Что попробовать

  • Установите логическое значение isPlaying = mp.isPlaying(); и проверьте его значение.

  • Попробуйте запустить mp.reset() перед запуском и посмотрите, работает ли он.

  • Внедрите MediaPlayer.OnErrorListener и зарегистрируйте метод с помощью медиаплеера.

Посмотрите, какую ошибку вы получите. Это может быть полезно.

Ответ 5

LOGS
... streamType 5

StreamType 5 означает STREAM_NOTIFICATION.
(Вызывается из уведомления?)

Это должно быть STREAM_MUSIC (3)


Чтобы проверить это не проблема ICS/устройства,
 - поместите звуковой файл (sound_01.ogg или sound_01.mp3) в папку res/raw/

 - установите кнопки с именем start_button и stop_button в main_layout
и попробуйте это.
(Я проверил этот код с эмулятором API10 и API19, и звуки воспроизводятся.)

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity
// implements MediaPlayer.OnPreparedListener
{
    private MediaPlayer mediaPlayer;
    private boolean isPrepared;
    private boolean isPlaying;

    private View start_button;
    private View stop_button;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        Init();
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        Load();
    }

    @Override
    protected void onPause()
    {
        super.onPause();
        Unload();
    }

    private void Init()
    {
        setVolumeControlStream(AudioManager.STREAM_MUSIC);

        start_button = findViewById(R.id.start_button);
        stop_button = findViewById(R.id.stop_button);

        start_button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Play();
            }
        });
        stop_button.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Stop();
            }
        });
    }

    private void Load()
    {
        Unload();

        // load from resource (res/raw/xx.ogg or .mp3)
        // It better to use thread
        mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.sound_01); // On success, prepare() will already have been called
        // mediaPlayer.setOnPreparedListener(this); // cannot set this listener (MediaPlayer.create does not return before prepared)
        isPrepared = true;
    }

    private void Unload()
    {
        isPrepared = false;
        if (null != mediaPlayer)
        {
            mediaPlayer.release();
            mediaPlayer = null;
        }
    }

    // @Override
    // public void onPrepared(MediaPlayer mp)
    // {
    // isPrepared = true;
    // }

    private void Play()
    {
        // If you got "start called in state xx" error, no sound will be heard.
        // To reset this error, call reset(), setDataSource() and prepare()
        // (for resources: call release() and create())
        if (!isPrepared)
        {
            return;
        }
        mediaPlayer.start();
        isPlaying =  true;
    }

    private void Stop()
    {
        // Do not omit this check
        // or you will get "called in wrong state" errors
        // like "pause called in state 8"   
        // and error (-38, 0)
        if (!isPlaying)
        {
            return;
        }
        isPlaying = false;
        mediaPlayer.pause();
        mediaPlayer.seekTo(0);
    }
}

Если это ICS/устройство специфично, эти ссылки могут помочь. (Немного старый...)

Ответ 6

У вас может возникнуть проблема, если вы используете другие AsyncTasks или SerialExecutor в другой задаче в другом месте вашей программы (и вы даже не можете этого знать, если используете сторонние SDK).

Смотрите сообщение здесь:

https://code.google.com/p/android/issues/detail?id=20941

Я предлагаю это, потому что ваш звук "tick" также не работает. Так что не обязательно, чтобы AudioPlayer выполнялся с неправильным параметром, но, скорее, какая-то другая задача блокирует его до тех пор, пока эта задача не остановится, и это, вероятно, задача, которая выполняется одновременно с ожиданием услышать звук.