Java Android MediaPlayer返回准备失败。设备上的状态为0x1,但在emulator中运行

Java Android MediaPlayer返回准备失败。设备上的状态为0x1,但在emulator中运行,java,android,android-mediaplayer,Java,Android,Android Mediaplayer,我正试图通过MediaPlayer从远程httpuri播放音频流。 如果我尝试在设备上播放.prepare()调用失败并引发IO异常,则在播放模拟器音频流时,代码似乎工作正常(但上面有一些噪音)。消息报告:status=0x1。我找到的唯一与此错误相关的文章是关于文件读写权限的,我认为情况并非如此,其他一些文章与错误的调用顺序有关(.setDataSource、.prepare()、.start()),这都不应该是我的问题 这是我正在使用的代码: public class MainActivit

我正试图通过
MediaPlayer
从远程
http
uri播放音频流。 如果我尝试在设备上播放
.prepare()
调用失败并引发IO异常,则在播放模拟器音频流时,代码似乎工作正常(但上面有一些噪音)。消息报告:
status=0x1
。我找到的唯一与此错误相关的文章是关于文件读写权限的,我认为情况并非如此,其他一些文章与错误的调用顺序有关(.setDataSource、.prepare()、.start()),这都不应该是我的问题

这是我正在使用的代码:

public class MainActivity extends AppCompatActivity {
    public static final String KEY_ADDRESS = "address";
    private static final int REQUEST_INTERNET = 21;

    private ImageButton exit_button;
    private ImageButton stop_button;
    private ImageButton play_button;

    private MediaPlayer media_player;

    private String uri;

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

        boolean _skip_init = false;

        int check_internet = ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.INTERNET);

        if (check_internet != PackageManager.PERMISSION_GRANTED) {
            Log.i(getClass().getName(), "asking for internet access permission");
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.INTERNET},
                    REQUEST_INTERNET);

            _skip_init = true;
        }

        getSettings(this); // set uri 

        exit_button = findViewById(R.id.exit_button);
        play_button = findViewById(R.id.play_button);
        stop_button = findViewById(R.id.stop_button);

        exit_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        play_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO: start play
                if(media_player!=null) {
                    media_player.start();
                    disablePlay();
                }
            }
        });

        stop_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO: stop play
                if(media_player!=null){
                    media_player.stop();
                    media_player.reset();
                    initStreaming(uri);
                    enablePlay();
                }
            }
        });

        play_button.setEnabled(false);
        stop_button.setEnabled(false);
        play_button.setAlpha(0.5f);
        stop_button.setAlpha(0.5f);

        if(!_skip_init) {
            initMediaPlayer(this);
            initStreaming(uri);
        }
    }


    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if ((requestCode == REQUEST_INTERNET) && (grantResults.length > 0)) {
            for (int i = 0; i < permissions.length; i++)
                if ((grantResults[i] == PackageManager.PERMISSION_GRANTED)) {
                    Log.i(getClass().getName(), permissions[i] + " permission granted");

                    if (Manifest.permission.INTERNET.equals(permissions[i])) {
                        initMediaPlayer(this);
                        initStreaming(uri);
                    }
                }
        }
    }

    private void initMediaPlayer(@NonNull final Context context) {
        media_player = new MediaPlayer();
        media_player.setAudioStreamType(AudioManager.STREAM_MUSIC);

        media_player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                Log.d(getClass().getName(), "onPreparedListener");
                play_button.setEnabled(true);
                play_button.setAlpha(1f);
            }
        });

        media_player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                Log.d(getClass().getName(), "onCompletionListener");
                Toast.makeText(context, getString(R.string.streaming_completed), Toast.LENGTH_LONG).show();
            }
        });
    }

    private void initStreaming(@NonNull final String uri) {
        new Thread(
            new Runnable() {
                @Override
                public void run() {
                    try {
                       media_player.setDataSource(uri);
                       media_player.prepareAsync();
                    } catch (Throwable e) {
                       Log.e(getClass().getName(), "Exception: " + e.getMessage());
                    }
                }
           }
       ).start();
    }

    @Override
    protected void onDestroy() {
        //TODO: stop and free resources?
        Log.d(getClass().getName(), "onDestroy");

        if(media_player!=null && media_player.isPlaying())
            media_player.stop();

        super.onDestroy();
    }

    private void enablePlay() {
        play_button.setEnabled(true);
        stop_button.setEnabled(false);
        play_button.setAlpha(1f);
        stop_button.setAlpha(0.5f);
    }

    private void disablePlay() {
        play_button.setEnabled(false);
        stop_button.setEnabled(true);
        play_button.setAlpha(0.5f);
        stop_button.setAlpha(1f);
    }
}
public类MainActivity扩展了AppCompatActivity{
公共静态最终字符串键\u ADDRESS=“ADDRESS”;
专用静态最终int请求_互联网=21;
私有图像按钮退出按钮;
专用图像按钮停止按钮;
私人图像按钮播放按钮;
私人媒体播放器;
私有字符串uri;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
布尔值_skip_init=false;
int check_internet=ContextCompat.checkSelfPermission(getApplicationContext(),Manifest.permission.internet);
如果(检查互联网!=已授予PackageManager.PERMISSION){
Log.i(getClass().getName(),“请求internet访问权限”);
ActivityCompat.requestPermissions(此,
新字符串[]{Manifest.permission.INTERNET},
请求(互联网),;
_跳过_init=true;
}
getSettings(this);//设置uri
退出按钮=findViewById(R.id.exit按钮);
play_按钮=findviewbyd(R.id.play_按钮);
停止按钮=findViewById(R.id.停止按钮);
退出按钮.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
完成();
}
});
play_button.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO:开始播放
如果(媒体播放器!=null){
media_player.start();
禁用播放();
}
}
});
stop_button.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
//托多:停止比赛
如果(媒体播放器!=null){
媒体播放器。停止();
media_player.reset();
initStreaming(uri);
使能播放();
}
}
});
播放按钮。设置启用(错误);
停止按钮。设置启用(错误);
播放按钮。设置Alpha(0.5f);
停止按钮。设定α(0.5f);
如果(!\u跳过\u初始化){
initMediaPlayer(这个);
initStreaming(uri);
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
if((requestCode==REQUEST_INTERNET)&&(grantResults.length>0)){
for(int i=0;i
错误在哪里?有可能修复它吗

为什么模拟器能够运行
android:usesCleartextTraffic="true"