Экранная видеозапись текущей активности Android

Можно ли записывать видеоизображение текущей текущей активности из той же самой активности?
Я знаю, как сделать снимок экрана текущей активности, но не имею ни малейшего представления о записи видео на экране. Как мне начать с этого? Я не знаю, как это начать.

Для программной записи видео из вашего приложения потребуется root-доступ. Вы заметите, что приложения, доступные для этого в Play Store, на видном месте перечисляют «REQUIRES ROOT» в описаниях своих приложений. Вы также заметите, что могут быть некоторые конкретные требования к оборудованию для этого подхода к работе («Не работает на Galaxy Nexus или Tegra 2/3 …» – из описания приложения Screencast Video Recorder .

Я никогда не писал этот код сам, но я собрал очень высокий уровень представления о требуемом подходе. Из этого сообщения видно, что вам нужно получить доступ к данным буфера кадров через «/ dev / graphics / fb0». Режим доступа для буфера кадров составляет 660, что означает, что вам нужен root-доступ для доступа к нему. После того как у вас есть root-доступ, вы можете использовать данные буфера кадров для создания снимков экрана (этот проект может работать для этой задачи), а затем создавать видео с этих снимков экрана (см. Этот другой вопрос о том, как создавать видео из последовательности изображений ).

Я использовал приложение Screencast, и он хорошо работает на Samsung Note. Я подозреваю, что это основной подход, который они приняли.

С Lollipop мы можем использовать API Media Projection! (API 21+)

Вот следующий код, который я использую для записи. Обратите внимание, что сначала нам нужно получить разрешения пользователя для этого;)

private static final int CAST_PERMISSION_CODE = 22; private DisplayMetrics mDisplayMetrics; private MediaProjection mMediaProjection; private VirtualDisplay mVirtualDisplay; private MediaRecorder mMediaRecorder; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMediaRecorder = new MediaRecorder(); mProjectionManager = (MediaProjectionManager) getSystemService (Context.MEDIA_PROJECTION_SERVICE); getWindowManager().getDefaultDisplay().getMetrics(mDisplayMetrics); prepareRecording(); } private void startRecording() { // If mMediaProjection is null that means we didn't get a context, lets ask the user if (mMediaProjection == null) { // This asks for user permissions to capture the screen startActivityForResult(mProjectionManager.createScreenCaptureIntent(), CAST_PERMISSION_CODE); return; } mVirtualDisplay = createVirtualDisplay(); mMediaRecorder.start(); } private void stopRecording() { if (mMediaRecorder != null) { mMediaRecorder.stop(); mMediaRecorder.reset(); } if (mVirtualDisplay != null) { mVirtualDisplay.release(); } if (mMediaProjection != null) { mMediaProjection.stop(); } prepareRecording(); } public String getCurSysDate() { return new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date()); } private void prepareRecording() { try { mMediaRecorder.prepare(); } catch (Exception e) { e.printStackTrace(); return; } final String directory = Environment.getExternalStorageDirectory() + File.separator + "Recordings"; if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { Toast.makeText(this, "Failed to get External Storage", Toast.LENGTH_SHORT).show(); return; } final File folder = new File(directory); boolean success = true; if (!folder.exists()) { success = folder.mkdir(); } String filePath; if (success) { String videoName = ("capture_" + getCurSysDate() + ".mp4"); filePath = directory + File.separator + videoName; } else { Toast.makeText(this, "Failed to create Recordings directory", Toast.LENGTH_SHORT).show(); return; } int width = mDisplayMetrics.widthPixels; int height = mDisplayMetrics.heightPixels; mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mMediaRecorder.setVideoEncodingBitRate(512 * 1000); mMediaRecorder.setVideoFrameRate(30); mMediaRecorder.setVideoSize(width, height); mMediaRecorder.setOutputFile(filePath); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode != CAST_PERMISSION_CODE) { // Where did we get this request from ? -_- Log.w(TAG, "Unknown request code: " + requestCode); return; } if (resultCode != RESULT_OK) { Toast.makeText(this, "Screen Cast Permission Denied :(", Toast.LENGTH_SHORT).show(); return; } mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data); // TODO Register a callback that will listen onStop and release & prepare the recorder for next recording // mMediaProjection.registerCallback(callback, null); mVirtualDisplay = getVirtualDisplay(); mMediaRecorder.start(); } private VirtualDisplay getVirtualDisplay() { screenDensity = mDisplayMetrics.densityDpi; int width = mDisplayMetrics.widthPixels; int height = mDisplayMetrics.heightPixels; return mMediaProjection.createVirtualDisplay(this.getClass().getSimpleName(), width, height, screenDensity, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, mMediaRecorder.getSurface(), null /*Callbacks*/, null /*Handler*/); } 

Это не окончательный код, а ХОРОШАЯ база для начала 🙂

Обычным приложениям Android не хватает разрешения на захват буфера кадров (в частности, они не являются членами группы AID_GRAPHICS). Это по соображениям безопасности – в противном случае они могли бы скрыть пароли и т. Д. С помощью мягкой клавиатуры. Таким образом, вы вообще НЕ МОЖЕШЬ отображать экран из приложения для Android, не обойдя проблему с привилегией.

Вы можете более или менее фиксировать снимок области экрана, которая в настоящее время используется вашим приложением, перейдя в верхний вид в иерархии вашего представления и введя его в bitmap с использованием View.draw (Canvas), однако это не приведет к записи панель состояния, мягкая клавиатура, поверхности OpenGL и т. д.

Если вы хотите сделать это лучше, вам нужно будет использовать внешний инструмент. Инструменты либо нуждаются в корне, либо используют интерфейс ADB, так как процессы, запущенные через интерфейс ADB, имеют привилегию AID_GRAPHICS. Используя последний метод, непривилегированное приложение может подключиться к привилегированному серверу для записи.

Грубо инструменты можно разделить на следующие категории:

  • Рекордер-рекордер с корневым буфером (например, Screencast). Они записываются непосредственно с устройства / dev / graphics / fb0, но работают только на устройствах, где фреймбуфер читается (например, не на Tegra 2 Nexus 7).

  • Приложения для записи на экране только для корневых каналов (например, SCR, Rec и т. Д.). Они захватывают экран через SurfaceFlinger и работают на гораздо более широком диапазоне устройств.

  • Приложения без регистратора захвата экрана (например, Recordable, Ascrecorder). Они требуют от пользователя включить отладку USB и запустить демон при подключении через главный компьютер. После этого хост-компьютер не требуется, пока устройство не перезагрузится. Может также записывать аудио.

  • Инструменты ADB (например, встроенный screenrecorder на Android 4.4). Требовать, чтобы вы подключались через USB и не могли записывать аудио.

Несколько месяцев назад я сделал сравнение доступных приложений, которые доступны здесь:

http://recordable.mobi/compare

Для полноты есть также USB-инструменты (например, Mobizen), которые транслируют экран по USB (ограничен низкой пропускной способностью USB и не могут записывать аудио), а некоторые устройства также могут передавать экран через Wi-Fi, который затем может быть записан на отдельном устройстве ,

Это довольно старый пост, но я надеюсь, что это поможет кому-то, кто все еще ищет способ записи экрана устройства Android:

С Android 5.0 появился новый API, который можно использовать для записи на экране: MediaProjection MediaProjection предоставляет возможность захвата содержимого экрана, но не системного аудио. Также он не будет захватывать защищенный контент экрана.

На странице Мэтта Снайдера есть хороший пример того, как использовать API для фактической записи экрана в файл на SD-карте: LINK

вы можете захватить экран с помощью DDMS по мере запуска adb и иметь разрешение на фреймбуфер:

перейдите по этой ссылке для получения более подробной информации:

http://thetechjournal.com/electronics/android/how-to-capture-screenshots-and-record-video-on-android-device.xhtml

ТАКЖЕ проверить эти ссылки могут получить некоторые идеи о том, что вам нужно:

http://answers.oreilly.com/topic/951-how-to-capture-video-of-the-screen-on-android/

http://www.mightypocket.com/2010/09/installing-android-screenshots-screen-capture-screen-cast-for-windows/

и проверьте этот проект:

http://sourceforge.net/projects/ashot/

надеюсь эта помощь.

Вы также можете записать свой экран следующим образом: http://www.youtube.com/watch?v=4K2UDfP4lN8&list=UU4fDGas-Vz1xruuUY4QbF0w&feature=c4-overview .

Видео называется «Как захватить / записать экран Android без корня (Mobizen)».

В видеорекламе используется Mobizen: https://play.google.com/store/apps/details?id=com.rsupport.mvagent

Interesting Posts
Давайте будем гением компьютера.