2015-01-29 28 views
6

Tôi đang theo dõi loạt bài giảng video về Lập trình Android được thiết kế trong API trước 21 lần. Do đó nó cho tôi biết để tạo ra một biến SoundPool theo cách sau.đặt Thuộc tính âm thanh trong SoundPool Lớp.Builder cho API 21

SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); 
//SoundPool(int maxStreams, int streamType, int srcQuality) 

Tuy nhiên, tôi cũng muốn sử dụng SoundPool này cho API 21. Vì vậy, tôi đang làm điều này:

if((android.os.Build.VERSION.SDK_INT) == 21){ 
    sp21 = new SoundPool.Builder(); 
    sp21.setMaxStreams(5); 
    sp = sp21.build(); 
} 
else{ 
    sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0); 
} 

sp21 là một biến Builder kiểu cho API 21 và sp là của SoundPool loại.

Điều này hoạt động rất tốt với AVD của tôi có API 21 và thiết bị thực có API 19. (Chưa thử thiết bị thực với API 21 nhưng tôi nghĩ nó sẽ hoạt động tốt). Bây giờ, tôi muốn đặt streamType thành USAGE_MEDIA trong if-block trước sp = sp21.build();. Vì vậy, tôi gõ:

sp21.setAudioAttributes(AudioAttributes.USAGE_MEDIA); 

Nhưng Lint đánh dấu nó trong màu đỏ và nói:

Phương pháp setAudioAttributes (AudioAttributes) trong các loại SoundPool.Builder không áp dụng cho các đối số (int)

Tôi biết rằng ngay cả khi tôi không đặt nó thành USAGE_MEDIA, mặc định nó sẽ được đặt thành mặc định. Nhưng tôi yêu cầu tham khảo trong tương lai nếu tôi phải đặt nó vào một cái gì đó khác như: USAGE_ALARM.

Tôi nên tiếp tục như thế nào?

Vui lòng trợ giúp!

Tôi đã gọi đến Audio Attributes, SoundPool, SoundPool.builderAudioManager.

Trả lời

10

Một phiên bản AudioAttributes được xây dựng thông qua trình tạo, AudioAttributes.Builder.

Bạn có thể sử dụng theo cách sau.

sp21.setAudioAttributes(new AudioAttributes.Builder() 
.setUsage(AudioAttributes.USAGE_MEDIA) 
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
.build()); 

Ref: https://developer.android.com/reference/android/media/AudioAttributes.html

+0

quên include.setMaxStreams (5) phù hợp # 3 –

9

Tôi có một cái gì đó để thêm ở đây. Tôi đã sử dụng SoundPool trong ứng dụng trò chơi của mình để phát các tệp âm thanh ogg nhỏ và đơn giản. Nó đã làm việc tốt ngay cả trên giả lập với API 21. Hôm nay tôi quyết định sửa đổi nó để sử dụng SoundPool.Builder().

Tôi đã xem tài liệu SoundPool.Builder của Android. Nó nói có

public static class 
SoundPool.Builder 
extends Object 
java.lang.Object 
↳ android.media.SoundPool.Builder 
Class Overview 
Builder class for SoundPool objects. 

Lưu ý dòng "Lớp trình tạo đối tượng SoundPool". Vì vậy SoundPool.Builder() tạo đối tượng SoundPool. SoundPool() cũng tạo đối tượng SoundPool. Vì vậy, đây là những gì tôi đã làm.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 

     AudioAttributes audioAttrib = new AudioAttributes.Builder() 
       .setUsage(AudioAttributes.USAGE_GAME) 
       .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
       .build(); 
     mSound = new SoundPool.Builder().setAudioAttributes(audioAttrib).setMaxStreams(6).build(); 
    } 
    else { 

     mSound = new SoundPool(6, AudioManager.STREAM_MUSIC, 0); 
    } 

mSound được khai báo là

private SoundPool mSound; 

Phần còn lại của mã (nơi tôi tải, play, stop, âm thanh phát hành) vẫn còn chính xác như nó đã được trước đó. Và nó đang làm việc trong API 21 và các phiên bản trước đó

Hy vọng điều này sẽ giúp bạn tất cả

+0

Câu trả lời này là tốt hơn. – LukTar

+0

tương tự áp dụng cho việc gọi phương thức MediaPlayer.SetAudioAttributes() –

Các vấn đề liên quan