您的位置:首页 > 移动开发 > Android开发

QML for Android通过ScreenRecorder录制屏幕并保存为本地视频

2017-06-23 11:57 555 查看

前言

最近在学习android截屏相关的知识点,找了很多资料,终于在github上找到一个源码ScreenRecorder,感谢这位哥们的无私奉献,然后又有一篇专门针对这个源码做详细讲解的文章,通过文中的分析,大致了解了其工作原理,我一直是做Qt方面的开发,对于android原生方面其实并不是很熟悉,这次通过这两位大神的文章然后新建一个Qt Quick工程,用QML来实现界面,通过调用ScreenRecorder的接口来实现android端屏幕录制并保存为视频文件,亲测可用,效果也非常好,再次感谢ScreenRecorder原作者的源码贡献。代码结构很简单,有需要的童鞋可以去阅读源码。

正文

OK,废话不多说,开始来叨叨我的工程结构。

新建Quick工程

这个很简单,就不多说了吧。我这里创建一个名为AndroidScreenRecorderTest的工程。



创建AndroidManifest.xml和Java文件

这个在上一篇文章已经详细讲过了(查看),然后将ScreenRecorder.java文件拷贝到同级目录,如图



修改MainActivity.java文件

在MainActivity.java中添加我们需要访问的接口,一个是开始录制接口,一个是停止录制接口。注意,接口一定要声明为静态才行。来看看代码

package com.tl.screen;
import android.content.Intent;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import java.io.File;
import android.view.Window;
import android.view.WindowManager;
import android.content.Context;
import android.util.DisplayMetrics;
import android.view.Display;

public class MainActivity extends org.qtproject.qt5.android.bindings.QtActivity{

private static final int REQUEST_CODE = 1;
private static MediaProjectionManager mMediaProjectionManager;
private static ScreenRecorder mRecorder;
private static MainActivity m_instance;
public WindowManager wm;

public MainActivity(){
m_instance = this;
}

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//noinspection ResourceType
Log.e("MainActivity","onCreate..");
mMediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);
wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.e("MainActivity", "onActivityResult...");
MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);
if (mediaProjection == null) {
Log.e("@@", "media projection is null");
return;
}
// video size
final int width = wm.getDefaultDisplay().getWidth();
final int height = wm.getDefaultDisplay().getHeight();
Log.i("MainActivity","width = " + String.valueOf(width) + "  height = " + String.valueOf(height));
File file = new File(Environment.getExternalStorageDirectory(),
"record-" + width + "x" + height + "-" + System.currentTimeMillis() + ".mp4");
final int bitrate = 3000000; //默认是6000000
mRecorder = new ScreenRecorder(width, height, bitrate, 1, mediaProjection, file.getAbsolutePath());
mRecorder.start();
//        Toast.makeText(this, "Screen recorder is running...", Toast.LENGTH_SHORT).show();
moveTaskToBack(true);//回到桌面
}

@Override
protected void onDestroy() {
super.onDestroy();
if(mRecorder != null){
mRecorder.quit();
mRecorder = null;
}
}

public static void startRecord(){
Log.i("MainActivity","startRecord..");
Intent captureIntent = mMediaProjectionManager.createScreenCaptureIntent();
m_instance.startActivityForResult(captureIntent, REQUEST_CODE);
}
public static void stopRecord(){
Log.i("MainActivity","stopRecord..");
if (mRecorder != null) {
mRecorder.quit();
mRecorder = null;
}
}

}


其中ScreenRecorder.java文件内容不用变,直接是从GitHub上下载的源码。

定义访问java接口的类文件

我这里单独定义了一个单例类来封装访问java接口,这样便于管理。

#include "androidinterface.h"

AndroidInterface * AndroidInterface::m_pInstance = NULL;

AndroidInterface *AndroidInterface::GetInstance()
{
if(m_pInstance == NULL){
m_pInstance = new AndroidInterface();
atexit(Release);
}
return m_pInstance;
}

void AndroidInterface::Release()
{
if (m_pInstance) {
delete m_pInstance;
m_pInstance = NULL;
}
}

void AndroidInterface::startRecord()
{
QAndroidJniObject::callStaticMethod<void>("com/tl/screen/MainActivity",
"startRecord",
"()V");
}

void AndroidInterface::stopRecord()
{
QAndroidJniObject::callStaticMethod<void>("com/tl/screen/MainActivity",
"stopRecord",
"()V");
}

AndroidInterface::AndroidInterface(QObject *parent) : QObject(parent)
{

}


设计界面

在QML中做一个简单的界面,这里只需要两个按钮–开始和结束。

修改main.qml文件,如下

import QtQuick 2.6
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

Window {
id:root
visible: true
width: 720
height: 1080

Column{
Button{
width: root.width/3.0
height: width/2.
text: "start recorde"
onClicked: {
androidInterface.startRecord()
}
}
Button{
width: root.width/3.0
height: width/2.
text: "stop recorde"
onClicked: {
androidInterface.stopRecord()
}
}
}
}


OK,主要代码已贴完了,点击开始录制按钮会自动进入到手机桌面,录制完成后会将视频文件存储在系统根目录下。

源码下载

本文参考

http://blog.csdn.net/zxccxzzxz/article/details/54150396

https://github.com/yrom/ScreenRecorder
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android录屏 qt