我想写一个APP来记录屏幕,有两种方式,RecordHelper_Method_A和RecordHelper_Method_B.
在RecordHelper_Method_A中,我将mMediaRecorder,MediaProjection mMediaProjection和mVirtualDisplay定义为静态var,它很容易调用,例如StartRecord( mContext, requestCode, resultCode,data),StopRecord().
在RecordHelper_Method_B中,我需要在主Activity类中定义mMediaRecorder,MediaProjection mMediaProjection,并在调用时传递参数StartRecord(mMediaRecorder, mMediaProjection,mVirtualDisplay),'StopRecord(mMediaRecorder,mMediaProjection,mVirtualDisplay)`......,这有点复杂.
我不知道哪一个更好,而且当我结束APP时,我不知道是否可以在RecordHelper_Method_A中正确释放这些静态var.
顺便说一句,如果你有更好的方法,请告诉我吗?谢谢!
RecordHelper_Method_A
public class RecordHelper_Method_A {
private static MediaRecorder mMediaRecorder;
private static MediaProjection mMediaProjection;
private static VirtualDisplay mVirtualDisplay;
public static void StartRecord(Context mContext,int requestCode, int resultCode, Intent data){
mMediaRecorder = new MediaRecorder();
initRecorder();
MediaProjectionManager mProjectionManager = (MediaProjectionManager) mContext.getSystemService(Context.MEDIA_PROJECTION_SERVICE);
mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);
mVirtualDisplay=mMediaProjection.createVirtualDisplay("MainActivity",
400,600, 300,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mMediaRecorder.getSurface(), null, null);
MediaProjectionCallback mMediaProjectionCallback = new MediaProjectionCallback();
mMediaProjection.registerCallback(mMediaProjectionCallback, null);
mMediaRecorder.start();
}
public static void StopRecord(){
mMediaProjection=null;
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mVirtualDisplay.release();
}
private static void initRecorder() {
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
//...
}
private static class MediaProjectionCallback extends MediaProjection.Callback {
@Override
public void onStop() {
mMediaRecorder.stop();
}
}
}
Run Code Online (Sandbox Code Playgroud)
RecordHelper_Method_B
public class RecordHelper_Method_B {
public static void StartRecord(MediaRecorder mMediaRecorder,MediaProjection mMediaProjection,VirtualDisplay mVirtualDisplay){
initRecorder(mMediaRecorder);
mVirtualDisplay=mMediaProjection.createVirtualDisplay("MainActivity",
400,600, 300,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mMediaRecorder.getSurface(), null, null);
MediaProjectionCallback mMediaProjectionCallback = new MediaProjectionCallback(mMediaRecorder);
mMediaProjection.registerCallback(mMediaProjectionCallback, null);
mMediaRecorder.start();
}
public static void StopRecord(MediaRecorder mMediaRecorder,MediaProjection mMediaProjection,VirtualDisplay mVirtualDisplay){
mMediaProjection=null;
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mVirtualDisplay.release();
}
private static void initRecorder(MediaRecorder mMediaRecorder) {
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE);
//...
}
private static class MediaProjectionCallback extends MediaProjection.Callback {
MediaRecorder mMediaRecorder;
public MediaProjectionCallback(MediaRecorder mMediaRecorder){
this.mMediaRecorder=mMediaRecorder;
}
@Override
public void onStop() {
mMediaRecorder.stop();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我建议你Objects不要活着statically.无论您创建什么对象或资源,都应该在活动消失时死亡.因此,在活动中创建这些资源然后传递它是很好的.
此外,我在您建议的两种方法中都看到,这些方法本身就是静态的.最好为类创建一个对象,然后将资源传递给该对象.这可以防止意外的内存泄漏.你可以在你的Activity中做这样的事情.
RecordHelper_Method_B helper = new RecordHelper_Method_B ();
helper.StopRecord(mMediaRecorder,mMediaProjection,mVirtualDisplay);
Run Code Online (Sandbox Code Playgroud)
这使事情变得简单.一旦你Activity死了,helper对象也会死.所以所有资源都将被释放.
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |