setAudioStreamType已经过时,我该如何替换它?

19

我正在使用Android Studio和MediaPlayer制作一款无线电流应用程序,但在编译时遇到以下错误:

uses or overrides a deprecated API. Recompile with -Xlint:deprecation for details.

我在Android文档中搜索后发现,我应该使用setAudioAttributes方法替换这个过时的方法,那么我该如何更改呢?

public class Radio extends Fragment {

    Button play_pause;
    MediaPlayer mp;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.radio, container, false);
        play_pause = (Button) view.findViewById(R.id.btnplay);
        try {
               mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                mp.setDataSource("http://198.27.83.65:9962/;stream.mp3");
                mp.prepareAsync();
         }
         catch (Exception e){
             Toast.makeText(getContext(),"Error" + e,Toast.LENGTH_SHORT).show();
         }
         //mp = MediaPlayer.create(this.getContext(), R.raw.radio);
            play_pause.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                         if(mp.isPlaying()) {
                            mp.pause();
                            Toast.makeText(getContext(),"Stop",Toast.LENGTH_SHORT).show();
                        }
                        else {
                            mp.start();
                            Toast.makeText(getContext(),"Start",Toast.LENGTH_SHORT).show();
                        }
                }
            });
        return view;
    }
}
3个回答

49
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);

mp.setAudioAttributes(
            new AudioAttributes
               .Builder()
               .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
               .build());

setAudioStreamType在API Level 26已被弃用,你需要使用新的方法setAudioAttributes

根据文档: 在调用prepare()或prepareAsync()之前必须调用此方法,以便音频属性随后生效。


在我的情况下,这个替换并没有按预期工作。我需要废弃的方法来改变音量,以便通过耳机播放音频时进行强制播放。当使用AudioAttibutes.Builder()...时,无法通过硬件按钮更改音量。 - Luigi_Papardelle
1
音频管理器中的 AudioManager.STREAM_VOICE_CALL 可以替换为 AudioAttributes.CONTENT_TYPE_SPEECH 吗? - Mr. Robot
我们可以在API 26以下使用相同的方法吗?还是说对于所有版本都可以使用相同的方法? - Vivek Thummar
@VivekThummar,您不能在API 26以下使用新的方法。但是自从谷歌要求“新应用程序和应用更新必须针对Android 10(API级别29)或更高版本”以来,这是否仍然是一个问题呢? - fangzhzh

1

setAudioStreamType 已被 setAudioAttributes 取代。 以下是相同的示例实现。如需更多了解,请参阅以下文档:

https://developer.android.com/guide/topics/media/mediaplayer.html#kotlin

val mediaPlayer = MediaPlayer().apply {
setAudioAttributes(
    AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
)
setDataSource(applicationContext, myUri)
prepare()
start()
}

1

使用setAudioAttributes(AudioAttributes)代替setAudioStreamType()

谷歌文档说:

设置此MediaPlayer的音频流类型。请参见AudioManager以获取流类型列表。必须在prepare()或prepareAsync()之前调用此方法,以便目标流类型此后生效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接