错误,而试图从远程MP3文件的Andr​​oid的检索元数据 [英] Error while trying to retrieve Metadata from a remote MP3 file Android

查看:238
本文介绍了错误,而试图从远程MP3文件的Andr​​oid的检索元数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的无线电Streming应用程序为Android。
音乐是很好收到并在MediaPlayer类出战,但问题是,当我尝试检索元数据,在App块,并返回错误。
这是code:

 包com.tests.mediaplayer1;
进口java.io.IOException异常;
进口android.media.AudioManager;
进口android.media.MediaMetadataRetriever;
进口android.media.MediaPlayer;
进口android.os.Bundle;
进口android.app.Activity;
进口android.content.Context;
进口android.util.Log;
进口android.view.Menu;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Button;
进口android.widget.SeekBar;
进口android.widget.SeekBar.OnSeekBarChangeListener;
进口android.widget.TextView;公共类MainActivity延伸活动{私人按钮btn_ preV;
私人按钮btn_pause;
私人按钮btn_play;
私人按钮btn_next;
私人TextView的txt_song_title;
私人搜索栏seekBar_volume;私人的MediaPlayer媒体播放器;
私人MediaMetadataRetriever猎犬;
私人字符串URL =htt​​p://support.k-designed.net/test-z/music/Accordossie.mp3;
私人AudioManager audioManager;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.activity_main);    btn_ preV =(按钮)findViewById(R.id.btn_ preV);
    btn_pause =(按钮)findViewById(R.id.btn_pause);
    btn_play =(按钮)findViewById(R.id.btn_play);
    btn_next =(按钮)findViewById(R.id.btn_next);
    txt_song_title =(的TextView)findViewById(R.id.txt_song_title);
    seekBar_volume =(搜索栏)findViewById(R.id.seekBar_volume);
    媒体播放器=新的MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);     audioManager =(AudioManager)getSystemService(Context.AUDIO_SERVICE);
     INT maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
     INT curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);     seekBar_volume.setMax(maxVolume);
     seekBar_volume.setProgress(curVolume);     seekBar_volume.setOnSeekBarChangeListener(新OnSeekBarChangeListener(){        @覆盖
        公共无效onStopTrackingTouch(搜索栏搜索栏){
            // TODO自动生成方法存根        }        @覆盖
        公共无效onStartTrackingTouch(搜索栏搜索栏){
            // TODO自动生成方法存根        }        @覆盖
        公共无效onProgressChanged(搜索栏搜索栏,INT进步,
                布尔FROMUSER){
            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,进度,0);        }
    });    btn_play.setOnClickListener(新OnClickListener(){        @覆盖
        公共无效的onClick(视图v){
            尝试{
                mediaPlayer.setDataSource(URL);
                retriever.setDataSource(URL);
                媒体播放器prepare()。 //可能需要很长时间! (用于缓冲等)
                mediaPlayer.start();
                txt_song_title.setText(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
            }赶上(例外五){
                e.printStackTrace();
            }
        }
    });    btn_pause.setOnClickListener(新OnClickListener(){        @覆盖
        公共无效的onClick(视图v){
            mediaPlayer.pause();        }
    });
}@覆盖
公共布尔onCreateOptionsMenu(菜单菜单){
    //充气菜单;如果是present这增加了项目操作栏。
    。getMenuInflater()膨胀(R.menu.main,菜单);
    返回true;
}
  }

这是我的错误:

  java.lang.IllegalStateException
在android.media.MediaPlayer.setDataSource(本机方法)
在com.tests.mediaplayer1.MainActivity $ 2.onClick(MainActivity.java:84)
在android.view.View.performClick(View.java:2485)
在android.view.View $ PerformClick.run(View.java:9080)
在android.os.Handler.handleCallback(Handler.java:587)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:130)
在android.app.ActivityThread.main(ActivityThread.java:3687)
在java.lang.reflect.Method.invokeNative(本机方法)
在java.lang.reflect.Method.invoke(Method.java:507)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:867)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
在dalvik.system.NativeStart.main(本机方法)


解决方案

从错误code,我们可以观察报告如下错误

  java.lang.IllegalStateException
在android.media.MediaPlayer.setDataSource(本机方法)

如果你指的是本地实施的MediaPlayer的 IllegalStateException异常的MediaPlayer 对象为null,则抛出。

从您的源,如果我们检查猎犬,我们可以观察到你声明这个变量,但还没有创建一个对象。在你的源代码,请创建的MediaPlayer 对象之前,请尝试以下code。

  retreiver =新MediaMetadataRetriever();

随着这一变化,将创建猎犬对象和您的来电的setDataSource retriever.setDataSource(URL); 会成功

I'm working on a Radio Streming application for Android. The music is well recieved and played by the MediaPlayer class, but the problem is when I try to retrieve the Metadata, the App blocks and returns errors. This is the code:

package com.tests.mediaplayer1;
import java.io.IOException;
import android.media.AudioManager;
import android.media.MediaMetadataRetriever;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class MainActivity extends Activity {

private Button btn_prev;
private Button btn_pause;
private Button btn_play;
private Button btn_next;
private TextView txt_song_title;
private SeekBar seekBar_volume;

private MediaPlayer mediaPlayer;
private MediaMetadataRetriever retriever;
private String url = "http://support.k-designed.net/test-z/music/Accordossie.mp3"; 
private AudioManager audioManager;

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

    btn_prev = (Button) findViewById(R.id.btn_prev);
    btn_pause = (Button) findViewById(R.id.btn_pause);
    btn_play = (Button) findViewById(R.id.btn_play);
    btn_next = (Button) findViewById(R.id.btn_next);
    txt_song_title = (TextView) findViewById(R.id.txt_song_title);
    seekBar_volume = (SeekBar) findViewById(R.id.seekBar_volume);
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

     audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
     int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
     int curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

     seekBar_volume.setMax(maxVolume);
     seekBar_volume.setProgress(curVolume);

     seekBar_volume.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,
                boolean fromUser) {
            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);

        }
    });

    btn_play.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            try {
                mediaPlayer.setDataSource(url);
                retriever.setDataSource(url);
                mediaPlayer.prepare(); // might take long! (for buffering, etc)
                mediaPlayer.start();
                txt_song_title.setText(retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    });

    btn_pause.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            mediaPlayer.pause();

        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
  }

And this is the error I get:

 java.lang.IllegalStateException
at android.media.MediaPlayer.setDataSource(Native Method)
at com.tests.mediaplayer1.MainActivity$2.onClick(MainActivity.java:84)
at android.view.View.performClick(View.java:2485)
at android.view.View$PerformClick.run(View.java:9080)
at android.os.Handler.handleCallback(Handler.java:587)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3687)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
at dalvik.system.NativeStart.main(Native Method)

解决方案

From the error code, we can observe the reported error as below

java.lang.IllegalStateException
at android.media.MediaPlayer.setDataSource(Native Method)

If you refer to the native implementation of MediaPlayer, IllegalStateException is thrown when MediaPlayer object is null.

From your source, if we check for retriever, we can observe that you have declared this variable, but haven't created an object. In your sources, please try the following code before creating mediaPlayer object.

retreiver = new MediaMetadataRetriever();

With this change, retriever object would be created and your call to setDataSource i.e. retriever.setDataSource(url); would be successful.

这篇关于错误,而试图从远程MP3文件的Andr​​oid的检索元数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆