美文网首页
android apk实现录屏功能

android apk实现录屏功能

作者: 早起有虫吃 | 来源:发表于2017-09-12 16:02 被阅读202次

    由于日常工作经常需要录屏,复现Bug给开发人员,对此我编写了一个录屏功能的apk,录屏时间是3分钟,下面是代码:

    1.在mainfest文件里添加如下权限:

      <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    

    2.布局文件代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/activity_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
       >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="50dp"
            >
            <EditText
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:id="@+id/ED_filename"
                android:digits="0123456789abcdefghigklmnopqrstuvwxyz"
                android:hint="输入录屏的文件名"
    
                />
            <Button
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_weight="3"
                android:text="开始录屏"
                android:maxLength="10"
    
                android:id="@+id/bt_recorder"/>
        </LinearLayout>
    
    
    </LinearLayout>
    

    3.工具类ShellUtils代码如下

    package com.example.administrator.videorecorder;
    
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.List;
    
    /**
     * Created by Administrator on 2017/7/13.
     * 有效启动shell类
     */
    
    public class ShellUtils {
    
        public static final String COMMAND_SU       = "su";
        public static final String COMMAND_SH       = "sh";
        public static final String COMMAND_EXIT     = "exit\n";
        public static final String COMMAND_LINE_END = "\n";
    
        private ShellUtils() {
            throw new AssertionError();
        }
    
        /**
         * check whether has root permission
         *
         * @return
         */
        public static boolean checkRootPermission() {
            return execCommand("echo root", true, false).result == 0;
        }
    
        /**
         * execute shell command, default return result msg
         *
         * @param command command
         * @param isRoot whether need to run with root
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(String command, boolean isRoot) {
            return execCommand(new String[] {command}, isRoot, true);
        }
    
        /**
         * execute shell commands, default return result msg
         *
         * @param commands command list
         * @param isRoot whether need to run with root
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(List<String> commands, boolean isRoot) {
            return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, true);
        }
    
        /**
         * execute shell commands, default return result msg
         *
         * @param commands command array
         * @param isRoot whether need to run with root
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(String[] commands, boolean isRoot) {
            return execCommand(commands, isRoot, true);
        }
    
        /**
         * execute shell command
         *
         * @param command command
         * @param isRoot whether need to run with root
         * @param isNeedResultMsg whether need result msg
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(String command, boolean isRoot, boolean isNeedResultMsg) {
            return execCommand(new String[] {command}, isRoot, isNeedResultMsg);
        }
    
        /**
         * execute shell commands
         *
         * @param commands command list
         * @param isRoot whether need to run with root
         * @param isNeedResultMsg whether need result msg
         * @return
         * @see ShellUtils#execCommand(String[], boolean, boolean)
         */
        public static CommandResult execCommand(List<String> commands, boolean isRoot, boolean isNeedResultMsg) {
            return execCommand(commands == null ? null : commands.toArray(new String[] {}), isRoot, isNeedResultMsg);
        }
    
        /**
         * execute shell commands
         *
         * @param commands command array
         * @param isRoot whether need to run with root
         * @param isNeedResultMsg whether need result msg
         * @return <ul>
         *         <li>if isNeedResultMsg is false, {@link CommandResult#successMsg} is null and
         *         {@link CommandResult#errorMsg} is null.</li>
         *         <li>if {@link CommandResult#result} is -1, there maybe some excepiton.</li>
         *         </ul>
         */
        public static CommandResult execCommand(String[] commands, boolean isRoot, boolean isNeedResultMsg) {
            int result = -1;
            if (commands == null || commands.length == 0) {
                return new CommandResult(result, null, null);
            }
    
            Process process = null;
            BufferedReader successResult = null;
            BufferedReader errorResult = null;
            StringBuilder successMsg = null;
            StringBuilder errorMsg = null;
    
            DataOutputStream os = null;
            try {
                process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH);
                os = new DataOutputStream(process.getOutputStream());
                for (String command : commands) {
                    if (command == null) {
                        continue;
                    }
    
                    // donnot use os.writeBytes(commmand), avoid chinese charset error
                    os.write(command.getBytes());
                    os.writeBytes(COMMAND_LINE_END);
                    os.flush();
                }
                os.writeBytes(COMMAND_EXIT);
                os.flush();
    
                result = process.waitFor();
                // get command result
                if (isNeedResultMsg) {
                    successMsg = new StringBuilder();
                    errorMsg = new StringBuilder();
                    successResult = new BufferedReader(new InputStreamReader(process.getInputStream()));
                    errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream()));
                    String s;
                    while ((s = successResult.readLine()) != null) {
                        successMsg.append(s);
                    }
                    while ((s = errorResult.readLine()) != null) {
                        errorMsg.append(s);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (os != null) {
                        os.close();
                    }
                    if (successResult != null) {
                        successResult.close();
                    }
                    if (errorResult != null) {
                        errorResult.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
                if (process != null) {
                    process.destroy();
                }
            }
            return new CommandResult(result, successMsg == null ? null : successMsg.toString(), errorMsg == null ? null
                    : errorMsg.toString());
        }
    
        /**
         * result of command
         * <ul>
         * <li>{@link CommandResult#result} means result of command, 0 means normal, else means error, same to excute in
         * linux shell</li>
         * <li>{@link CommandResult#successMsg} means success message of command result</li>
         * <li>{@link CommandResult#errorMsg} means error message of command result</li>
         * </ul>
         *
         * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2013-5-16
         */
        public static class CommandResult {
    
            /** result of command **/
            public int    result;
    
            /** success message of command result **/
            public String successMsg;
    
            /** error message of command result **/
            public String errorMsg;
    
            public CommandResult(int result) {
                this.result = result;
            }
    
            public CommandResult(int result, String successMsg, String errorMsg) {
                this.result = result;
                this.successMsg = successMsg;
                this.errorMsg = errorMsg;
            }
        }
    }
    
    
    

    4.MainActivity代码如下:

    package com.example.administrator.videorecorder;
    
    import android.os.Looper;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        Button button_recorde;
        EditText editText_filename;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            editText_filename= (EditText) findViewById(R.id.ED_filename);
            button_recorde=(Button) findViewById(R.id.bt_recorder);
            button_recorde.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new Recorder().start();
                }
            });
        }
    
    
        //视频录制线程
        class Recorder extends Thread{
            @Override
            public void run() {
                super.run();
                String filename=editText_filename.getText().toString();
    
                //输入的视频名为空时,弹出toast提示
                if(filename.equals("")){
                    Looper.prepare();
                    Toast toast=Toast.makeText(getApplicationContext(), "视频名不可为空", Toast.LENGTH_SHORT);
                    toast.show();
                    Looper.loop();
                }
                //否则执行录制,录制的文件在/mnt/sdcard下,可自行修改
                else{
                    String command="screenrecord /mnt/sdcard/"+filename+".mp4";
                    ShellUtils.execCommand(command,false);
                }
    
    
    
    
            }
        }
    
    }
    

    相关文章

      网友评论

          本文标题:android apk实现录屏功能

          本文链接:https://www.haomeiwen.com/subject/neicsxtx.html