您的位置:首页 > 其它

音乐播放器和视频播放器的使用

2015-10-26 20:05 309 查看
player.setOnPreparedListener();//当资源准备完成的时候就能够开始播放

mediaPlayerP只有播放中的状态,程序进行处理的时候,需要检测下player的各种状态;使用成员变量标识

音乐播放以及MediaPlayer的使用:

package com.bluezhang.standerdcompuse;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import com.bluezhang.standerdcompuse.service.MusicService;

public class MainActivity extends AppCompatActivity {
private BroadcastReceiver progressRcciver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
String[] urls = intent.getStringArrayExtra("urls");
if (urls.length == 0) {
if (BuildConfig.DEBUG) Log.d("MainActivity", "URLS长度为0");

}else{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < urls.length; i++) {
sb.append(urls[i]);
sb.append('\n');

}
txtInfo.setText(sb.toString());
}
}

}
};

private TextView txtInfo;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtInfo = (TextView)findViewById(R.id.progress_info);

}

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();

//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}

return super.onOptionsItemSelected(item);
}

@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter(Constants.ACTION_PROGRESS_UPDATE);
registerReceiver(progressRcciver,intentFilter);
}

@Override
protected void onPause() {
super.onPause();
unregisterReceiver(progressRcciver);
}

public void btnAddRequest(View view) {
Intent service = new Intent(Constants.ACTION_DARA_FETCH);
service.putExtra("action",0);//0 代表添加请求
service.putExtra("url","http://www.baidu.com/");
service.setPackage(getPackageName());
startService(service);
}

public void btnGetProgress(View view) {
Intent service = new Intent(Constants.ACTION_DARA_FETCH);
service.putExtra("action",1);//0 代表添加请求
service.setPackage(getPackageName());
startService(service);
}

public void removeProgress(View view) {
Intent service = new Intent(Constants.ACTION_DARA_FETCH);
service.putExtra("action", 1);//0 代表添加请求
service.setPackage(getPackageName());
startService(service);

}

/**
* 启动服务播放音乐
*
* @param view
*/
public void btnPlayClick(View view) {
Intent intent = new Intent(this, MusicService.class);
intent.putExtra("action",0);
intent.putExtra("url","http://10.10.60.18:8080/nobody.mp3");

startService(intent);

}

public void btnPauseMusic(View view) {
Intent intent = new Intent(this, MusicService.class);
intent.putExtra("action",1);
intent.putExtra("url", "http://10.10.60.18:8080/nobody.mp3");

}

@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){

}
return super.onTouchEvent(event);
}
}


service的使用:

package com.bluezhang.standerdcompuse.service;

import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
import com.bluezhang.standerdcompuse.BuildConfig;
import com.bluezhang.standerdcompuse.Constants;

import java.util.LinkedList;
import java.util.Queue;

/**
* 创建之后会自动在清单配置文件中创建Service的配置
* 配置隐式意图,intent_filter 隐式起动 Service
* 数据加载服务
* 如果是启动服务和进程的生命周期是相同的
* 1、第一个生命周期是onCreat()(进行资源的初始化数据)
* 所有的on开头的方法都是在主线程执行的
* 2、onStartCommend(intent,int flag,int id):
* 第一个参数用于传递参数,
* 这个方法在主线程执行,同时Intent需要多传递一些参数,不要只传递一个extra
* Intent可以传递一些int类型的参数用于区分service内部的操作
*/
public class DataFetchService extends android.app.Service implements Runnable {
private Queue<String> urls;

public DataFetchService() {
if (BuildConfig.DEBUG) Log.d("DataFetchService", "构造");
}

private Thread downloadThread;
//控制县城时候继续运行
private boolean running;

/**
* @param intent
* @return
*/
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
if (BuildConfig.DEBUG) Log.d("DataFetchService", "onBind");
return null;

}

/**
* 在对象的存活期间只会执行一次,
* 用于初始化数据、对象
* 通常都是启动线程;
*/
@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.DEBUG) Log.d("DataFetchService", "onCreat()");
urls = new LinkedList<>();

//启动线程
downloadThread = new Thread(this);
downloadThread.start();

}

@Override
public void onDestroy() {
super.onDestroy();
if (BuildConfig.DEBUG) Log.d("DataFetchService", "onDestory");

running = false;
downloadThread.interrupt();

//urls 关闭
urls.clear();
urls = null;

}

/**
* @param intent
* @param flags
* @param startId
* @return int 返回int类型代表的是意外终止的情况下,服务应该怎么恢复
*/
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//如果调用的是super,那么启动的服务就是粘性的,进程终止,服务重新启动
//但是 intent 为null

//如果intent 不是空
if (BuildConfig.DEBUG) Log.d("DataFetchService", "onStartCommend   " + flags);
if (intent != null) {
int action = intent.getIntExtra("action", -1);

if (BuildConfig.DEBUG) Log.d("DataFetchService", "onStartCommend action = " + action);

switch (action) {
case 0: // 0 代表添加网址开始下载
processDownload(intent);
break;
case 1: //1 代表获取下载进度
getProgress(intent);
break;
case 2: //2 删除现在任务
removeDownloadRequest(intent);
break;
}
}

return super.onStartCommand(intent, flags, startId);
}

//---------------------------------------------

/**
* 处理地址下载的操作
*
* @param intent
*/
private void processDownload(Intent intent) {
if (intent != null) {
String url = intent.getStringExtra("url");

if (urls != null) {
urls.offer(url);
}
}
}
//--------------------------------------------------

/**
* 获取下载的进度 ,利用广播获取
*
* @param intent
*/
private void getProgress(Intent intent) {
//因为要获取进度,服务在没有绑定的情况下,要使用广播完成进度的更新
sendUpdateBroadcast();
}

private void sendUpdateBroadcast() {
Intent boardcast = new Intent(Constants.ACTION_PROGRESS_UPDATE);

String[] strs = new String[urls.size()];
urls.toArray(strs);
boardcast.putExtra("urls", strs);
sendBroadcast(boardcast);
}

//--------------------------------

/**
* 删除下载的任务
*
* @param intent
*/
private void removeDownloadRequest(Intent intent) {
if (!urls.isEmpty()) {
//删除第一个
urls.poll();

}

}

@Override
public void run() {
running = true;
try {
while (running) {

String url = urls.poll();
if (url != null) {
//TODO 模拟网络下载
Thread.sleep(3000);
sendUpdateBroadcast();

}
Thread.sleep(500);

}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


MusicService的使用:

package com.bluezhang.standerdcompuse.service;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

import java.io.IOException;
import java.util.Vector;

public class MusicService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener {

//确保服务唯一性
private  MediaPlayer player;
//创建状态
public static final int STATE_CREATED = 0;
//destoy 的状态
public static final int STATE_DESTORY = 1;
//准备中的状态
private static final int STATE_PREPARING = 2;
//播放中
private static final int STATE_START = 3;
//暂停的状态
private static final int STATE_POUSE = 4;
private static final int STATE_PLAYER_STOP =5 ;

/**
*
代表播放器的状态
*/
private int playerState;
/**
* 是否继续下一首
*
*/
private boolean configAutoNext;
/**
*  播放列表
*/

private Vector<String> playList;
private int currentPosition = 0;

public MusicService() {}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw null;
}

@Override
public void onCreate() {
super.onCreate();
playList = new Vector<>();
player = new MediaPlayer();
//当准备完成的时候就会回掉
player.setOnPreparedListener(this);
//播放结束的时候做的接口
player.setOnCompletionListener(this);

playerState = STATE_CREATED;

}

@Override
public void onDestroy() {
super.onDestroy();
try {
playerState = STATE_DESTORY;
if (player.isPlaying()) {
player.stop();
}
player.release();

}catch (Exception e){
//因为player的操作可能出现状态的错误
}
player = null;
playList .clear();
playList = null;

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

if (intent != null) {
int action = intent.getIntExtra("action",-1);
//http://10.10.60.18:8080/nobody.mp3

switch(action){
case 0://播放指定网址的声音
playMusic(intent);
break;
case 1:
pauseMusic(intent);
case 2:
continueMusic(intent);
break;
case 3://重新设置播放列表0 设置播放列表,可以添加自动播放功能
break;
}
}

return super.onStartCommand(intent, flags, startId);
}

private void pauseMusic(Intent intent) {
try {
if (playerState == STATE_START && player.isPlaying()) {
player.pause();
playerState = STATE_POUSE;

}
}catch (Exception e){
e.printStackTrace();

}

}

private void continueMusic(Intent intent){
if (player.isPlaying() && playerState == STATE_POUSE){
player.start();
playerState = STATE_START;
}else{

}

}

/**
* 播放intent中的网址
* @param intent
*/
private void playMusic(Intent intent) {
if (intent != null) {

String url = intent.getStringExtra("url");
playMusic(url);
}

}

private void playMusic(String url) {
if (url != null) {

resetPlayer();

try {

player.setDataSource(url);

player.prepareAsync();

playerState = STATE_PREPARING;

} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 如果正在播放,那么停止,并且重置mediaplayer
* 准备下次播放
*/
private void resetPlayer(){
try {

player.stop();

}catch(Exception e){

}
player.reset();

}

@Override
public void onPrepared(MediaPlayer mp) {
player.start();
playerState = STATE_START;
}

@Override
public void onCompletion(MediaPlayer mp) {
playerState = STATE_PLAYER_STOP;
if(playList != null && configAutoNext){
int size = playList.size();
if(currentPosition +1 >= size){
//TODO 不再播放
}else{
//下一首
String url = playList.get(currentPosition + 1);
playMusic(url);
currentPosition++;

}
}

}
}


播放视频的部分:

package com.bluezhang.standerdcompuse;

import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.*;

/**
* videoView 怎么扩充全屏 视频的尺寸影响了Vise哦VIew的尺寸的计算;
* VideoView中的onMeasure()方法,根据视频的尺寸进行了计算 ;
* 3)MeasureSpec 一个参数包含两个信息 ,size 、mode
* <p/>
* 4)size 就是容器的最大的剩余空间VideoView就应该充满:
*/
public class PlayerActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener, Runnable, SeekBar.OnSeekBarChangeListener {
private VideoView videoView;
private SeekBar seekBar;
private Thread thread;
private boolean running;
private RelativeLayout relativeLayout;
private LinearLayout linearLayout;
private boolean isShowing = true;

private android.os.Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
int what = msg.what;
if (what == 998) {
seekBar.setMax(msg.arg1);
seekBar.setProgress(msg.arg2);
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
relativeLayout = (RelativeLayout) findViewById(R.id.player_title_container);
linearLayout = (LinearLayout) findViewById(R.id.player_down_container);
button = (Button) findViewById(R.id.btn_stop);

videoView = (VideoView) findViewById(R.id.vidio_view);
seekBar = (SeekBar) findViewById(R.id.mc_seek_bar);
seekBar.setOnSeekBarChangeListener(this);
//本地 手机  网络
//        videoView.setVideoURI(Uri.parse("http://10.10.60.18:8080/video_test.3gp"));
videoView.setVideoURI(Uri.parse("http://10.10.60.18:8080/video_test.3gp"));
videoView.setVideoPath("mnt/sdcard/Download/a.3gp");
videoView.setOnPreparedListener(this);
thread = new Thread(this);
thread.start();
//加上前进后退的控制器
//videoView.setMediaController(new MediaController(this));

}

@Override
protected void onDestroy() {
super.onDestroy();
videoView.stopPlayback();
running = false;
thread.interrupt();

}

@Override
public void onPrepared(MediaPlayer mp) {
videoView.start();
}

@Override
public void run() {
running = true;
try {
while (running) {
if (videoView != null && videoView.isPlaying()) {

int currentPosition = videoView.getCurrentPosition();
int duration = videoView.getDuration();
Message message = handler.obtainMessage(998);
message.arg1 = duration;
message.arg2 = currentPosition;
handler.sendMessage(message);

}
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//使用seekBar进行拖拽处理
if (fromUser) {
//用户处理才操作
videoView.seekTo(progress);
}

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}

GoneThread goneThread = new GoneThread();
@Override
public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (isShowing) {
if(!goneThread.isAlive())
goneThread.start();

} else {

relativeLayout.setVisibility(View.VISIBLE);
linearLayout.setVisibility(View.VISIBLE);

isShowing = !isShowing;
}

}

return super.onTouchEvent(event);
}

private Handler myHandle = new Handler();
private Button button;

public void btnStopMove(View view) {
button.setBackgroundResource(android.R.drawable.ic_media_pause);
try {
if (videoView.isPlaying()) {

videoView.pause();

} else {
videoView.start();
}
} catch (Exception e) {
e.printStackTrace();
}

}

class GoneThread extends Thread {
@Override
public void run() {
try {

while (true) {
Thread.sleep(3000);
if(isShowing) {
handler.post(new Runnable() {
@Override
public void run() {
relativeLayout.setVisibility(View.GONE);
linearLayout.setVisibility(View.GONE);
isShowing = !isShowing;

}
});
}
}

} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}


自定义VideoView;

package com.bluezhang.standerdcompuse;

import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.*;

/**
* videoView 怎么扩充全屏 视频的尺寸影响了Vise哦VIew的尺寸的计算;
* VideoView中的onMeasure()方法,根据视频的尺寸进行了计算 ;
* 3)MeasureSpec 一个参数包含两个信息 ,size 、mode
* <p/>
* 4)size 就是容器的最大的剩余空间VideoView就应该充满:
*/
public class PlayerActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener, Runnable, SeekBar.OnSeekBarChangeListener {
private VideoView videoView;
private SeekBar seekBar;
private Thread thread;
private boolean running;
private RelativeLayout relativeLayout;
private LinearLayout linearLayout;
private boolean isShowing = true;

private android.os.Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
int what = msg.what;
if (what == 998) {
seekBar.setMax(msg.arg1);
seekBar.setProgress(msg.arg2);
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
relativeLayout = (RelativeLayout) findViewById(R.id.player_title_container);
linearLayout = (LinearLayout) findViewById(R.id.player_down_container);
button = (Button) findViewById(R.id.btn_stop);

videoView = (VideoView) findViewById(R.id.vidio_view);
seekBar = (SeekBar) findViewById(R.id.mc_seek_bar);
seekBar.setOnSeekBarChangeListener(this);
//本地 手机  网络
//        videoView.setVideoURI(Uri.parse("http://10.10.60.18:8080/video_test.3gp"));
videoView.setVideoURI(Uri.parse("http://10.10.60.18:8080/video_test.3gp"));
videoView.setVideoPath("mnt/sdcard/Download/a.3gp");
videoView.setOnPreparedListener(this);
thread = new Thread(this);
thread.start();
//加上前进后退的控制器
//videoView.setMediaController(new MediaController(this));

}

@Override
protected void onDestroy() {
super.onDestroy();
videoView.stopPlayback();
running = false;
thread.interrupt();

}

@Override
public void onPrepared(MediaPlayer mp) {
videoView.start();
}

@Override
public void run() {
running = true;
try {
while (running) {
if (videoView != null && videoView.isPlaying()) {

int currentPosition = videoView.getCurrentPosition();
int duration = videoView.getDuration();
Message message = handler.obtainMessage(998);
message.arg1 = duration;
message.arg2 = currentPosition;
handler.sendMessage(message);

}
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//使用seekBar进行拖拽处理
if (fromUser) {
//用户处理才操作
videoView.seekTo(progress);
}

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}

GoneThread goneThread = new GoneThread();
@Override
public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (isShowing) {
if(!goneThread.isAlive())
goneThread.start();

} else {

relativeLayout.setVisibility(View.VISIBLE);
linearLayout.setVisibility(View.VISIBLE);

isShowing = !isShowing;
}

}

return super.onTouchEvent(event);
}

private Handler myHandle = new Handler();
private Button button;

public void btnStopMove(View view) {
button.setBackgroundResource(android.R.drawable.ic_media_pause);
try {
if (videoView.isPlaying()) {

videoView.pause();

} else {
videoView.start();
}
} catch (Exception e) {
e.printStackTrace();
}

}

class GoneThread extends Thread {
@Override
public void run() {
try {

while (true) {
Thread.sleep(3000);
if(isShowing) {
handler.post(new Runnable() {
@Override
public void run() {
relativeLayout.setVisibility(View.GONE);
linearLayout.setVisibility(View.GONE);
isShowing = !isShowing;

}
});
}
}

} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}


两个布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="btnPlayClick"
android:text="播放"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="btnPauseMusic"
android:text="暂停"
/>

<TextView
android:id="@+id/progress_info"
android:text="Hello World!"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<Button
android:onClick="btnAddRequest"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="添加网址下载任务"

/>
<Button
android:onClick="btnGetProgress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="获取进度"

/>
<Button
android:onClick="removeProgress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="取消下载"
/>

</LinearLayout>


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.bluezhang.standerdcompuse.PlayerActivity">
<com.bluezhang.standerdcompuse.widgecs.FullVedioView
android:id="@+id/vidio_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<RelativeLayout
android:id="@+id/player_title_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#c999"
>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="back"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="share"
/>

</RelativeLayout>
<LinearLayout
android:id="@+id/player_down_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="bottom"
android:background="#c666"
android:gravity="center_vertical"

>
<Button
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@android:drawable/ic_media_previous"

/>
<Button
android:id="@+id/btn_stop"
android:layout_width="20dp"
android:layout_height="20dp"
android:onClick="btnStopMove"
android:background="@android:drawable/ic_media_play"

/>
<Button
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@android:drawable/ic_media_next"

/>

<SeekBar
android:id="@+id/mc_seek_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"

/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00"
android:textColor="@android:color/white"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:text="/"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:text="15:00"
/>
</LinearLayout>

</FrameLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: