2014-11-09 14 views
5

Tôi đang sử dụng mã sau để phát âm thanh trong ứng dụng của mình. Mọi thứ hoạt động tốt trước ICS. Nhưng trên ICS và các phiên bản gần đây không có âm thanh nào có thể được nghe mặc dù không có lỗi xuất hiện.Âm thanh không phát trong phiên bản Android lớn hơn 4.0

EDIT: Lưu ý, mã sau đây được kích hoạt bởi bộ thu rộng. Bộ thu BroadCast gọi nhiệm vụ không đồng bộ. Trong phương thức xử lý bài của nhiệm vụ asycn, phương thức sau được gọi.

Lỗi này chỉ xảy ra trên các kiểu điện thoại di động cụ thể (ví dụ: nexus) và trên một số kiểu người dùng có thể phát âm thanh đi kèm với hệ điều hành nhưng không phải là âm thanh riêng của họ trong thư mục rigtones.

Tôi không thể nhận được các vấn đề xảy ra trên thiết bị cầm tay cụ thể

Lỗi này có thể là gì?

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's 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 { 

     } 
    } 

GỖ

: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 

Câu hỏi này là một câu hỏi theo dõi câu hỏi mà tôi hỏi trước đó: sound not playing in android > icecream sandwich

+0

Bạn có thể xác định một âm thanh mà không chơi và một trong đó không và cho tôi biết tốc độ bit và định dạng của âm thanh bạn đang cố gắng phát và trên thiết bị nào? –

+0

một trong các định dạng không thể phát được là mp3 – user93796

+0

Không có gì rõ ràng là sai với mã của bạn - một ứng dụng mẫu có thể phát trong luồng THÔNG BÁO trên Nexus của tôi. Tôi khuyên bạn nên thêm Trình nghe lỗi và xóa bộ lọc nhật ký mà bạn có thể có - các bản ghi thú vị sẽ đến từ MediaPlayer và NuPlayer. – rds

Trả lời

2

Bạn nên được yêu cầu tập trung âm thanh, ngay cả đối với thông báo. Trong trường hợp của bạn nó sẽ giống như thế này:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 

//request a transient lock on the notification stream 
int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_NOTIFICATION, 
    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 

if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { 
    // could not get audio focus. 
} 

tôi nghi ngờ có một số ứng dụng khác (s) đang chạy trên các thiết bị được đem lại cho bạn những vấn đề được yêu cầu tập trung âm thanh. Nếu các ứng dụng khác yêu cầu tập trung âm thanh và bạn không thể, ứng dụng của bạn sẽ không được phát ra luồng cuối cùng. Yêu cầu tập trung chính mình sẽ đảm bảo không có quá trình khác đang can thiệp vào âm thanh thông báo của bạn. Mặc dù điều này đã được giới thiệu cách đây một thời gian, các phiên bản Android mới hơn nhạy cảm hơn nhiều với các ứng dụng bằng cách sử dụng cơ chế này, đặc biệt là từ nền.

Để có thích hợp, khi bạn đang thực hiện với thông báo, bạn có thể sau đó nhả tập trung:

audioManager.abandonAudioFocus(this); 
Các vấn đề liên quan