我写了个视频播放器,要求是一直循环播放文件夹下的所有视频,但我这个播放器循环播一段时间后就停了,有时还死机,我写了个log看了下,内存从刚开始的200多M,到最后的10M,我找了很久也找不出我这播放器哪耗内存啊,请各位高手帮我看看我代码哪里不写的不好
package ycq.informationPublish;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import ycq.informationPublish.filehandle.PropertiesFile;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Debug.MemoryInfo;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;import android.widget.TextView;
import android.widget.Toast;public class MediaActivity extends Activity implements SurfaceHolder.Callback,MediaPlayer.OnPreparedListener
{
/** Called when the activity is first created. */
private SurfaceView surfaceView; private SurfaceHolder surfaceHolder;
MediaPlayer mMediaPlayer;
private List<String> listVideo=new ArrayList<String>();
int video=0;
private int videoWidth;
private int videoHeight;
private MyReceiver receiver;
String path="/mnt/flash/video";
// String path="/sdcard/video";
PropertiesFile pro=new PropertiesFile();
BufferedWriter bos;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.media);
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_VIDEO");
//注册
registerReceiver(receiver, filter);
surfaceView = (SurfaceView)findViewById(R.id.videoView);
surfaceHolder = surfaceView.getHolder();
mMediaPlayer = new MediaPlayer();
path=pro.getPath(); //获得视频文件路径
surfaceHolder.addCallback(this);
surfaceHolder.setFixedSize(480,800);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//log的存储位置
File log=new File("/mnt/flash/log.txt");
if(log.exists())
{
log=new File("/mnt/flash/log1.txt");
}
try {
bos= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(log)));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
writeToFile("start mediaActivity");//调用写log的方法
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_BACK)
{
mMediaPlayer.stop();
mMediaPlayer.release();
unregisterReceiver(receiver);
MediaActivity.this.finish();
return true;
} //System.exit(0);
return super.onKeyDown(keyCode, event);
}
//获得视频列表
public void getFileName(String path)
{
try{
File file=new File(path);
File [] file_list=file.listFiles();
if(file_list!=null)
{
for(int i=0;i<file_list.length;i++)
{
File f=file_list[i];
listVideo.add(f.getName().toString());
}
file_list=null;
}
}catch(Exception e){
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
getFileName(path);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener()
{
// @Override
/*覆盖文件播出完毕事件*/
public void onCompletion(MediaPlayer arg0)
{
//checkError=0;
writeToFile("end media:"+listVideo.get(video));
try
{
if(listVideo.size()!=0)
{
video++; //下一个视屏文件
if(video>=listVideo.size())
{
video=0;
}
player();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
/* 当MediaPlayer.OnErrorListener会运行的Listener */
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener()
{
@Override
/*覆盖错误处理事件*/
public boolean onError(MediaPlayer arg0, int arg1, int arg2)
{
// TODO Auto-generated method stub
writeToFile("error media:"+listVideo.get(video));
if(listVideo.size()==0)//但checkError大于listVideo.size()说明所有文件都是不可播放的
{
if(mMediaPlayer!=null&&mMediaPlayer.isPlaying())
{
mMediaPlayer.stop();
}
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}else
{
try{
String name_video=listVideo.get(video);
Toast.makeText(MediaActivity.this,name_video+"视频不能播放,请删除",Toast.LENGTH_SHORT).show();
listVideo.remove(video);
}catch(OutOfMemoryError e)
{
System.gc();
}catch(Exception e)
{
System.gc();
}
try
{
if(video>=listVideo.size())//当错误文件时最后一个文件时,就播放第一个文件
{
video=0;
}
if(listVideo.size()==0)
{
if(mMediaPlayer!=null&&mMediaPlayer.isPlaying())
{
mMediaPlayer.stop();
}
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}else
{
player();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
return true;
}
});
if(listVideo.size()!=0)
{
player();
}else
{
mMediaPlayer.stop();
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void onPrepared(MediaPlayer mp) {
//TODO Auto-generated method stub
this.videoWidth = this.mMediaPlayer.getVideoWidth();
this.videoHeight = this.mMediaPlayer.getVideoHeight();
if (this.videoHeight != 0 && this.videoWidth != 0) {
this.surfaceHolder.setFixedSize(this.videoWidth, this.videoHeight);
// mp.start();
}
this.surfaceHolder.setFixedSize(780,780);
writeToFile("start media:"+listVideo.get(video));
mMediaPlayer.start();
}
//接收广播
private class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
int check = bundle.getInt("check");
if(check==1)
{
//mMediaPlayer.stop();
path=pro.getPath();
listVideo.clear();
getFileName(path);//得到所有文件
video=0;
try{
if(listVideo!=null&&listVideo.size()!=0)
{
player();
}else
{
if(path.equals("/mnt/flash/video"))//路径下视频为空就转变路径
{
path="/sdcard/video";
}else
{
path="/mnt/flash/video";
}
listVideo.clear();
getFileName(path);
if(listVideo!=null&&listVideo.size()!=0)
{
player();
}else
{
if(mMediaPlayer.isPlaying())
{
mMediaPlayer.stop();
}
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
}
//播放器的设置
public void player()
{
if(mMediaPlayer!=null)
{
mMediaPlayer.stop();
}
System.gc();
mMediaPlayer.reset();
mMediaPlayer.setDisplay(surfaceHolder);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mMediaPlayer.setDataSource(path+"/"+listVideo.get(video));
mMediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
package ycq.informationPublish;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import ycq.informationPublish.filehandle.PropertiesFile;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Debug.MemoryInfo;
import android.util.Log;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;import android.widget.TextView;
import android.widget.Toast;public class MediaActivity extends Activity implements SurfaceHolder.Callback,MediaPlayer.OnPreparedListener
{
/** Called when the activity is first created. */
private SurfaceView surfaceView; private SurfaceHolder surfaceHolder;
MediaPlayer mMediaPlayer;
private List<String> listVideo=new ArrayList<String>();
int video=0;
private int videoWidth;
private int videoHeight;
private MyReceiver receiver;
String path="/mnt/flash/video";
// String path="/sdcard/video";
PropertiesFile pro=new PropertiesFile();
BufferedWriter bos;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.media);
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_VIDEO");
//注册
registerReceiver(receiver, filter);
surfaceView = (SurfaceView)findViewById(R.id.videoView);
surfaceHolder = surfaceView.getHolder();
mMediaPlayer = new MediaPlayer();
path=pro.getPath(); //获得视频文件路径
surfaceHolder.addCallback(this);
surfaceHolder.setFixedSize(480,800);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
//log的存储位置
File log=new File("/mnt/flash/log.txt");
if(log.exists())
{
log=new File("/mnt/flash/log1.txt");
}
try {
bos= new BufferedWriter(new OutputStreamWriter(new FileOutputStream(log)));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
writeToFile("start mediaActivity");//调用写log的方法
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if(keyCode == KeyEvent.KEYCODE_BACK)
{
mMediaPlayer.stop();
mMediaPlayer.release();
unregisterReceiver(receiver);
MediaActivity.this.finish();
return true;
} //System.exit(0);
return super.onKeyDown(keyCode, event);
}
//获得视频列表
public void getFileName(String path)
{
try{
File file=new File(path);
File [] file_list=file.listFiles();
if(file_list!=null)
{
for(int i=0;i<file_list.length;i++)
{
File f=file_list[i];
listVideo.add(f.getName().toString());
}
file_list=null;
}
}catch(Exception e){
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
getFileName(path);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(
new MediaPlayer.OnCompletionListener()
{
// @Override
/*覆盖文件播出完毕事件*/
public void onCompletion(MediaPlayer arg0)
{
//checkError=0;
writeToFile("end media:"+listVideo.get(video));
try
{
if(listVideo.size()!=0)
{
video++; //下一个视屏文件
if(video>=listVideo.size())
{
video=0;
}
player();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
/* 当MediaPlayer.OnErrorListener会运行的Listener */
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener()
{
@Override
/*覆盖错误处理事件*/
public boolean onError(MediaPlayer arg0, int arg1, int arg2)
{
// TODO Auto-generated method stub
writeToFile("error media:"+listVideo.get(video));
if(listVideo.size()==0)//但checkError大于listVideo.size()说明所有文件都是不可播放的
{
if(mMediaPlayer!=null&&mMediaPlayer.isPlaying())
{
mMediaPlayer.stop();
}
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}else
{
try{
String name_video=listVideo.get(video);
Toast.makeText(MediaActivity.this,name_video+"视频不能播放,请删除",Toast.LENGTH_SHORT).show();
listVideo.remove(video);
}catch(OutOfMemoryError e)
{
System.gc();
}catch(Exception e)
{
System.gc();
}
try
{
if(video>=listVideo.size())//当错误文件时最后一个文件时,就播放第一个文件
{
video=0;
}
if(listVideo.size()==0)
{
if(mMediaPlayer!=null&&mMediaPlayer.isPlaying())
{
mMediaPlayer.stop();
}
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}else
{
player();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
return true;
}
});
if(listVideo.size()!=0)
{
player();
}else
{
mMediaPlayer.stop();
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void onPrepared(MediaPlayer mp) {
//TODO Auto-generated method stub
this.videoWidth = this.mMediaPlayer.getVideoWidth();
this.videoHeight = this.mMediaPlayer.getVideoHeight();
if (this.videoHeight != 0 && this.videoWidth != 0) {
this.surfaceHolder.setFixedSize(this.videoWidth, this.videoHeight);
// mp.start();
}
this.surfaceHolder.setFixedSize(780,780);
writeToFile("start media:"+listVideo.get(video));
mMediaPlayer.start();
}
//接收广播
private class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
int check = bundle.getInt("check");
if(check==1)
{
//mMediaPlayer.stop();
path=pro.getPath();
listVideo.clear();
getFileName(path);//得到所有文件
video=0;
try{
if(listVideo!=null&&listVideo.size()!=0)
{
player();
}else
{
if(path.equals("/mnt/flash/video"))//路径下视频为空就转变路径
{
path="/sdcard/video";
}else
{
path="/mnt/flash/video";
}
listVideo.clear();
getFileName(path);
if(listVideo!=null&&listVideo.size()!=0)
{
player();
}else
{
if(mMediaPlayer.isPlaying())
{
mMediaPlayer.stop();
}
Toast.makeText(MediaActivity.this,"无可播放视频文件,请上传可播放视频",Toast.LENGTH_LONG).show();
}
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
}
//播放器的设置
public void player()
{
if(mMediaPlayer!=null)
{
mMediaPlayer.stop();
}
System.gc();
mMediaPlayer.reset();
mMediaPlayer.setDisplay(surfaceHolder);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mMediaPlayer.setDataSource(path+"/"+listVideo.get(video));
mMediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
解决方案 »
- Android如何访问facebook
- 为什么我重新安装了个eclipse不能下载adt?
- 竖屏拍照预览方向和尺寸问题
- google GPS问题
- android中实现收藏夹功能,在线等
- videoview如何触发OnPreparedListener事件
- NDK下怎么搭建C++编译环境?我的环境编译C文件没问题但编译CPP文件就报莫名的错误,CPP文件格式不对?
- 请教:Activity 查找根目录下的所有文件,为什么总是运行不成功,提示:the application has stopped unexpectedly
- 自定义View 全屏显示的问题
- 开发一个应用主屏幕图片在手机上无法显示
- 安卓的软件
- android浮动view问题。
//写log方法
private void writeToFile(String vlaue) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd/HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
String str = formatter.format(curDate);
try {
bos.write(str+":"+vlaue+" System free memory: "+getMemory());
bos.newLine();
bos.flush();
// bos.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
//系统剩余内存大小
private String getMemory()
{
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
android.app.ActivityManager.MemoryInfo outInfo =new ActivityManager.MemoryInfo();
am.getMemoryInfo(outInfo);
long availMemorySize = outInfo.availMem;
String strMemorySize = availMemorySize/1024/1024 + "MB";
return strMemorySize; }
}
明示
下面是我写的音乐播放器停止的方法,将media player先停止,然后释放资源,置空,下次播放是重新new一个对象就好 private void stopMediaPlayer() {
if (mMiniMediaPlayer != null) {
mMiniMediaPlayer.stop();
mMiniMediaPlayer.release();
mMiniMediaPlayer = null;
}
}
我也试过你这样的,每次都释放,可以还是一样的