MediaMetaDataRetriever.setDataSource返回null

我正在尝试开发一个应用程序( 无线电流 )应用程序,我想获取该MediaMetadataRetriever API的无线电上播放的歌曲的详细信息,但是当我设置我的URL时,我收到此错误:

java.lang.IllegalArgumentException位于maa.myapp.MainActivity $ PlayerTask.onPostExecute(MainActivity.java:447)上的android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:71)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 { @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 titleName = mMediaMetaDataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE); Toast.makeText(MainActivity.this, "Title : "+titleName, Toast.LENGTH_SHORT).show(); } } } 

最后它与‘com.vodyasov:amr:0.5’库一起使用

 Uri uri = Uri.parse(stream); OnNewMetadataListener listener = new OnNewMetadataListener() { @Override public void onNewHeaders(String stringUri, List name, List desc, List br, List genre, List 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(); 

试试这个:

 @Override protected void onPostExecute(Boolean aBoolean) { super.onPostExecute(aBoolean); MediaMetadataRetriever mmr = new MediaMetadataRetriever(); if (Build.VERSION.SDK_INT >= 14){ mmr.setDataSource(stream, new HashMap()); }else { mmr.setDataSource(stream); } String titleName = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)); Toast.makeText(MainActivity.this, "Title : "+titleName, Toast.LENGTH_SHORT).show(); } 

如果这不起作用,那么您应该确保您使用的链接实际上返回一个文件。

尝试在onCreate执行上述操作,问题可能与您的AsyncTask有关。