MediaMetaDataRetriever.setDataSource return 空

MediaMetaDataRetriever.setDataSource return null

我正在尝试开发一个应用程序 (Radio Stream) 应用程序,我想获取正在播放的歌曲的详细信息MediaMetadataRetriever API 但是当我设置 URL 时出现此错误:

java.lang.IllegalArgumentException at android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:71) at maa.myapp.MainActivity$PlayerTask.onPostExecute(MainActivity.java:447) at maa.myapp.MainActivity$PlayerTask.onPostExecute(MainActivity.java:419)

这是我的代码:

MediaPlayer mediaPlayer;
    String stream = "https://plaza.one/mp3";
    boolean prepared =false;
    boolean started =false ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mediaPlayer = new MediaPlayer();
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            AudioAttributes attribs = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build();
            mediaPlayer.setAudioAttributes(attribs);

        } else {
            mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        }


        new PlayerTask().execute(stream);
}
    public class PlayerTask extends AsyncTask<String,Void,Boolean> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loadingRL.setVisibility(View.VISIBLE);
        }
        @Override
        protected Boolean doInBackground(String... strings) {
            try {
                mediaPlayer.reset();
                mediaPlayer.setDataSource(strings[0]);
                prepared=true;
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return prepared;
        }
        @Override
        protected void onPostExecute(Boolean aBoolean) {
            super.onPostExecute(aBoolean);

            /*get details : */
            MediaMetadataRetriever mMediaMetaDataRetriever = new MediaMetadataRetriever();
            mMediaMetaDataRetriever.setDataSource(stream,new HashMap<String, String>());
            String titleName = mMediaMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
            Toast.makeText(MainActivity.this, "Title : "+titleName, Toast.LENGTH_SHORT).show();
        }
    }
}

试试这个:

@Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);

        MediaMetadataRetriever mmr = new MediaMetadataRetriever(); 

        if (Build.VERSION.SDK_INT >= 14){
          mmr.setDataSource(stream, new HashMap<String, String>()); 
        }else {
          mmr.setDataSource(stream); 
        }

        String titleName = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
        Toast.makeText(MainActivity.this, "Title : "+titleName, Toast.LENGTH_SHORT).show();
    }

如果这不起作用,那么您应该确保您正在使用的 link 实际上是 returns 一个文件。

尝试在 onCreate 中执行上述操作,问题可能出在您的 AsyncTask 上。

终于可以与 'com.vodyasov:amr:0.5'

一起使用了
Uri uri = Uri.parse(stream);
            OnNewMetadataListener listener = new OnNewMetadataListener() {
                @Override
                public void onNewHeaders(String stringUri, List<String> name, List<String> desc, List<String> br, List<String> genre, List<String> info) {}
                @Override
                public void onNewStreamTitle(String stringUri, String streamTitle) {
                    songinfo.setText("Song Name : "+streamTitle);
                }
            };
            AudiostreamMetadataManager.getInstance()
                    .setUri(uri)
                    .setOnNewMetadataListener(listener)
                    .setUserAgent(UserAgent.WINDOWS_MEDIA_PLAYER)
                    .start();