2017-02-20 73 views
1

我已经完成了使用媒体控制器播放音频的代码。我的代码运行正常,但运行代码时发生一些异常。如何创建用于播放音频的媒体控制器?

public class CallHistoryActivity extends Activity implements MediaPlayer.OnPreparedListener, MediaController.MediaPlayerControl{ 

    Button audioPlayer; 

    private static final String TAG = "AudioPlayer"; 

    public static final String AUDIO_FILE_NAME = "audioFileName"; 

    private MediaPlayer mediaPlayer; 
    private MediaController mediaController; 
    private String audioFile; 

    private Handler handler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_call_history); 
     audioPlayer = (Button)findViewById(R.id.audioPlayer); 

    } 

    public void audioplayer(View view) 
    { 

     String path =new String(Environment.getExternalStorageDirectory() + "/NewCallLogs/Yaendi Yaendi.mp3 "); 
     Uri uri = Uri.parse(path); 

     mediaPlayer = new MediaPlayer(); 

     mediaController = new MediaController(this); 


     mediaPlayer.reset(); 
     try { 
      mediaPlayer.setDataSource(String.valueOf(uri)); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     try { 
      mediaPlayer.setOnPreparedListener(this); 
      mediaPlayer.prepare(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 


public void stopPlayer(View view) 
{ 
    mediaPlayer.stop(); 
    mediaController.hide(); 
    mediaPlayer.release(); 
} 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     //the MediaController will hide after 3 seconds - tap the screen to make it appear again 
     mediaController.show(); 
     return false; 
    } 

    //--MediaPlayerControl methods---------------------------------------------------- 
    public void start() { 
     mediaPlayer.start(); 
    } 

    public void pause() { 
     mediaPlayer.pause(); 
    } 

    public int getDuration() { 
     return mediaPlayer.getDuration(); 
    } 

    public int getCurrentPosition() { 
     return mediaPlayer.getCurrentPosition(); 
    } 

    public void seekTo(int i) { 
     mediaPlayer.seekTo(i); 
    } 

    public boolean isPlaying() { 
     return mediaPlayer.isPlaying(); 
    } 

    public int getBufferPercentage() { 
     return 0; 
    } 

    public boolean canPause() { 
     return true; 
    } 

    public boolean canSeekBackward() { 
     return true; 
    } 

    public boolean canSeekForward() { 
     return true; 
    } 

    @Override 
    public int getAudioSessionId() { 
     return 0; 
    } 
    //-------------------------------------------------------------------------------- 

    public void onPrepared(MediaPlayer mediaPlayer) { 

     mediaPlayer.start(); 

     Log.d(TAG, "onPrepared"); 
     mediaController.setMediaPlayer((MediaController.MediaPlayerControl) this); 
     mediaController.setAnchorView(findViewById(R.id.main_audio_view)); 

     handler.post(new Runnable() { 
      public void run() { 
       mediaController.setEnabled(true); 
       mediaController.show(); 
      } 
     }); 
    } 
} 

在logcat中所示的异常如下所示

02-20 14:56:42.402 21410-21410/com.sey.newcalllogs E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 46 
02-20 14:56:42.412 21410-21410/com.sey.newcalllogs E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 49 
02-20 14:56:42.412 21410-21410/com.sey.newcalllogs E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 50 
02-20 14:56:42.422 21410-21410/com.sey.newcalllogs E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 50 
02-20 14:56:42.422 21410-21410/com.sey.newcalllogs E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 50 
02-20 14:56:42.422 21410-21410/com.sey.newcalllogs E/IMGSRV: :0: PVRDRMOpen: TP3, ret = 52 
02-20 14:56:45.442 21410-21410/com.sey.newcalllogs E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering 
02-20 14:56:53.402 21410-21421/com.sey.newcalllogs E/MediaPlayer: error (1, -2147483648) 
02-20 14:56:56.072 21410-21421/com.sey.newcalllogs E/MediaPlayer: error (1, -2147483648) 
02-20 14:56:57.602 21410-21421/com.sey.newcalllogs E/MediaPlayer: error (1, -2147483648) 
02-20 14:56:58.792 21410-21410/com.sey.newcalllogs E/MediaPlayer: stop called in state 0 
02-20 14:56:58.792 21410-21410/com.sey.newcalllogs E/MediaPlayer: error (-38, 0) 

然后如下所示

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/main_audio_view" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
tools:context="com.seyali.newcalllogs.CallHistoryActivity"> 

<Button 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/audioPlayer" 
    android:onClick="audioplayer"/> 


<Button 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/stopPlaying" 
    android:onClick="stopPlayer"/> 


<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center" 
    android:text="Now playing:" 
    android:textSize="25sp" 
    android:textStyle="bold" 
    /> 
<TextView 
    android:id="@+id/now_playing_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="20dip" 
    android:layout_marginLeft="10dip" 
    android:layout_marginRight="10dip" 
    android:layout_gravity="center" 
    android:text="Now playing.." 
    android:textSize="16sp" 
    android:textStyle="italic"/> 

的布局设计,为媒体控制器,请帮助我如何克服了这个例外。我尝试了所有的方法,但是我的问题没有解决。请帮助我。

+1

看到这个..... https://www.sitepoint.com/a-step-by -step-guide-to-building-an-android-audio-player-app/ –

+0

好吧,我会试试这个。 –

+0

请帮我解决这个例外。 –

回答

2

MediaPlayer应遵循设计。 请参阅:https://developer.android.com/reference/android/media/MediaPlayer.html

mediaplayer.stop()应从播放状态(调用开始后)触发。

02-20 14:56:58.792 21410-21410/com.sey.newcalllogs E/MediaPlayer的:所谓的停止状态0

mediaPlayer.reset(); 
mediaPlayer.setDataSource(String.valueOf(uri)); 
mediaPlayer.prepare(); 

    public void onPrepared(MediaPlayer mediaPlayer) { 
     mediaPlayer.start(); 
    } 

只有在所有这些步骤中,您可以拨打mediaPlayer.stop() ;

显示从错误您的电话停机state.Please检查

+0

How to mediaplayer.stop()should play from play state()。@ Ranjith KP –

+0

我不知道如何实现你发布的答案。 –

+0

请参阅该链接中的流程图。 –

0

要解决此问题,在调用方法之前检查MediaPlayer的状态上述错误。例如:

if(mediaPlayer.isPlaying()) { 
mediaPlayer.pause(); 

}

请让我知道它解决了这个问题还是不

+0

不,问题没有解决。 –

+0

你这样做了吗?请确认 public void stopPlayer(View view) if(mediaPlayer.isPlaying()){ mediaPlayer.stop(); mediaController.hide(); mediaPlayer.release(); } } – dheerajraaj

相关问题