最近客户有个小需求:在一个android系统平台上一开机就自动播放SD卡某文件目录下的视频文件。
需求比较简单,不多说了,直接贴代码:
1 首先配置 AndroidManifest.xml 注册一个开机服务广播
主要代码如下:
<receiver android:name=".BootBroadCastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</receiver>
权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
2广播接受类:
public class BootBroadCastReceiver extends BroadcastReceiver {
public static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION)) {
Log.i("Videoplayer", "onReceive");
Intent myintent = new Intent(context, Videoplayer.class);
myintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//这个一定要加否则无法启动activity
context.startActivity(myintent);
}
}
}
3 就是视频播放类了 Videoplayer.java
package cn.com.sy;
import java.io.File;
import java.io.FilenameFilter;
import java.util.List;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;
import android.widget.EditText;
import android.widget.Toast;
public class Videoplayer extends Activity implements OnCompletionListener {
public static final String TAG = "Videoplayer";
private String path;
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
private File[] mVideoFiles;
private int index = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 全屏显示
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
// 播放器
mediaPlayer = new MediaPlayer();
// 每次播完后监听事件
mediaPlayer.setOnCompletionListener(this);
// 遍历SD卡下的视频文件
/*
* String url = Environment.getExternalStorageDirectory()
* .getAbsolutePath() + File.separatorChar + "目录名";
*/
String url = Environment.getExternalStorageDirectory()
.getAbsolutePath();
Log.i(TAG, url);
getFiles(url);
surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
// 把输送给surfaceView的视频画面,直接显示到屏幕上,不要维持它自身的缓冲区
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
// 屏幕尺寸
surfaceView.getHolder().setFixedSize(176, 144);
// 保持屏幕唤醒状态
surfaceView.getHolder().setKeepScreenOn(true);
// 回调SurfaceViewCallback对象
surfaceView.getHolder().addCallback(new SurfaceCallback());
}
private final class SurfaceCallback implements Callback {
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
public void surfaceCreated(SurfaceHolder holder) {
play();
}
public void surfaceDestroyed(SurfaceHolder holder) {
onStop();
}
}
@Override
protected void onStop() {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
}
releaseMediaPlayer();
super.onStop();
}
@Override
protected void onDestroy() {
releaseMediaPlayer();
super.onDestroy();
}
// 释放播放器资源
private void releaseMediaPlayer() {
if (mediaPlayer != null) {
Log.i(TAG, "Release MediaPlayer");
mediaPlayer.release();
mediaPlayer = null;
}
}
// 封装播放方法
private void play() {
if (mVideoFiles == null || mVideoFiles.length == 0) {
Toast.makeText(this.getApplicationContext(), "No video files",
Toast.LENGTH_LONG).show();
return;
}
try {
path = mVideoFiles[index].getAbsolutePath();
Log.i(TAG, "οnplaying==" + path);
index++;
if (index == mVideoFiles.length)
index = 0;
// 播放器重置
mediaPlayer.reset();
// 文件路径
mediaPlayer.setDataSource(path);
// 设置Video影片以SurfaceHolder播放
mediaPlayer.setDisplay(surfaceView.getHolder());
// 设置播放器播放数据流类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
// 缓冲
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCompletion(MediaPlayer mp) {
Log.i(TAG, "onCompletion");
play();
}
// 遍历指定目录下的视频文件
private void getFiles(String url) {
try {
File file = new File(url);
mVideoFiles = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".mp4") || name.endsWith(".3gp");
}
});
Log.i("Videoplayer", "files.length==" + mVideoFiles.length);
} catch (Exception e) {
Log.i("Videoplayer", "not find file !");
}
}
}