MediaMetaDataRetriever.setDataSource 返回 null
Posted
技术标签:
【中文标题】MediaMetaDataRetriever.setDataSource 返回 null【英文标题】:MediaMetaDataRetriever.setDataSource return null 【发布时间】:2018-04-24 16:49:00 【问题描述】:我正在尝试开发一个应用程序 (Radio Stream) 应用程序,我想获取该 MediaMetadataRetriever API 在收音机上播放的歌曲的详细信息但是当我设置我的网址时,我得到了这个错误:
java.lang.IllegalArgumentException 在 android.media.MediaMetadataRetriever.setDataSource(MediaMetadataRetriever.java:71) 在 maa.myapp.MainActivity$PlayerTask.onPostExecute(MainActivity.java:447) 在 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();
【问题讨论】:
你找到答案了吗?如果没有,请提供完整的 logcat @H.***sToast.makeText(MainActivity.this, "Title : "+titleName, Toast.LENGTH_SHORT).show();
显示 null : 标题 : null
你在测试什么sdk?
@H.***s minSdkVersion 15
这里没有'return null'。有一个IllegalArgumentException
。
【参考方案1】:
终于可以使用 '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();
【讨论】:
图书馆将如何解决这个问题?【参考方案2】:试试这个:
@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();
如果这不起作用,那么您应该确保您使用的链接实际上返回了一个文件。
尝试在onCreate
中执行上述操作,问题可能出在您的 AsyncTask 上。
【讨论】:
我的 minSdkVersion 是 15,所以没有必要使用Build.VERSION.SDK_INT >=14
并且仍然无法正常工作,但是当我在 VLC 媒体播放器中测试我的 URL 时工作正常,所以我没有不要认为是 URL 的问题
代码没有问题。尝试其他链接。
我尝试使用不同的网址,例如:94.23.43.135:8050/live.mp3 实际上是返回一个 file.mp3 并且仍然不起作用
我仍然得到一个标题:NULL
尝试在设备上获取歌曲的标题,例如metaRetriver.setDataSource("/sdcard/audio.mp3");
以上是关于MediaMetaDataRetriever.setDataSource 返回 null的主要内容,如果未能解决你的问题,请参考以下文章