android android-4.4-kitkat screen-capture

Cómo grabar el video de pantalla de Android programáticamente en KitKat 4.4



android-4.4-kitkat screen-capture (1)

Buena pregunta Pero la respuesta depende de qué tipo de plataforma desea utilizar para grabar la pantalla en Android.

Aquí hay algunos trucos ...

1) Utilizando esta clase, puede grabar la fortaleza de la pantalla que requirió del dispositivo rooteado y también puede probar esto en genymotion 4.4.

public static class MainFragment extends Fragment { private Context mContext; private EditText mWidthEditText; private EditText mHeightEditText; private EditText mBitrateEditText; private EditText mTimeEditText; private Button mRecordButton; public MainFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); mContext = getActivity(); mRecordButton = (Button) rootView.findViewById(R.id.btn_record); mRecordButton.setOnClickListener(RecordOnClickListener); mWidthEditText = (EditText) rootView.findViewById(R.id.et_width); mHeightEditText = (EditText) rootView.findViewById(R.id.et_height); mBitrateEditText = (EditText) rootView .findViewById(R.id.et_bitrate); mBitrateEditText.addTextChangedListener(BitrateTextWatcher); mTimeEditText = (EditText) rootView.findViewById(R.id.et_time); mTimeEditText.addTextChangedListener(TimeTextWatcher); return rootView; } private TextWatcher BitrateTextWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { // Not used. } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { if (TextUtils.isEmpty(charSequence)) { return; } int value = Integer.valueOf(charSequence.toString()); if (value > 50 || value == 0) { mBitrateEditText.setError(mContext .getString(R.string.error_bitrate_edittext)); return; } mTimeEditText.setError(null); } @Override public void afterTextChanged(Editable editable) { // Not used. } }; private TextWatcher TimeTextWatcher = new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { // Not used. } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { if (TextUtils.isEmpty(charSequence)) { return; } int value = Integer.valueOf(charSequence.toString()); if (value > 180 || value == 0) { mTimeEditText.setError(mContext .getString(R.string.error_time_editext)); return; } mTimeEditText.setError(null); } @Override public void afterTextChanged(Editable editable) { // Not used. } }; private View.OnClickListener RecordOnClickListener = new View.OnClickListener() { @Override public void onClick(View view) { if (!TextUtils.isEmpty(mTimeEditText.getError()) || !TextUtils.isEmpty(mBitrateEditText.getError())) { Toast.makeText(mContext, mContext.getString(R.string.toast_invalid_values), Toast.LENGTH_LONG).show(); return; } boolean widthSet = !TextUtils.isEmpty(mWidthEditText.getText()); boolean heightSet = !TextUtils.isEmpty(mHeightEditText .getText()); if ((!widthSet && heightSet) || (widthSet && !heightSet)) { Toast.makeText(mContext, mContext.getString(R.string.error_invalid_wxh), Toast.LENGTH_LONG).show(); return; } boolean bitrateSet = !TextUtils.isEmpty(mBitrateEditText .getText()); boolean timeSet = !TextUtils.isEmpty(mTimeEditText.getText()); StringBuilder stringBuilder = new StringBuilder( "/system/bin/screenrecord"); if (widthSet) { stringBuilder.append(" --size ") .append(mWidthEditText.getText()).append("x") .append(mHeightEditText.getText()); } if (bitrateSet) { stringBuilder.append(" --bit-rate ").append( mBitrateEditText.getText()); } if (timeSet) { stringBuilder.append(" --time-limit ").append( mTimeEditText.getText()); } // TODO User definable location. stringBuilder .append(" ") .append(Environment.getExternalStorageDirectory() .toString()).append("/recording.mp4"); Log.d("TAG", "comamnd: " + stringBuilder.toString()); try { new SuTask(stringBuilder.toString().getBytes("ASCII")) .execute(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }; private class SuTask extends AsyncTask<Boolean, Void, Boolean> { private final byte[] mCommand; public SuTask(byte[] command) { super(); this.mCommand = command; } @Override protected Boolean doInBackground(Boolean... booleans) { try { Process sh = Runtime.getRuntime().exec("su", null, null); OutputStream outputStream = sh.getOutputStream(); outputStream.write(mCommand); outputStream.flush(); outputStream.close(); final NotificationManager notificationManager = (NotificationManager) mContext .getSystemService(NOTIFICATION_SERVICE); notificationManager.notify(RUNNING_NOTIFICATION_ID, createRunningNotification(mContext)); sh.waitFor(); return true; } catch (InterruptedException e) { e.printStackTrace(); Toast.makeText(mContext, mContext.getString(R.string.error_start_recording), Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(mContext, mContext.getString(R.string.error_start_recording), Toast.LENGTH_LONG).show(); } return false; } @Override protected void onPostExecute(Boolean bool) { super.onPostExecute(bool); if (bool) { final NotificationManager notificationManager = (NotificationManager) mContext .getSystemService(NOTIFICATION_SERVICE); notificationManager.cancel(RUNNING_NOTIFICATION_ID); File file = new File(Environment .getExternalStorageDirectory().toString() + "/recording.mp4"); notificationManager.notify(FINISHED_NOTIFICATION_ID, createFinishedNotification(mContext, file)); } } private Notification createRunningNotification(Context context) { Notification.Builder mBuilder = new Notification.Builder( context) .setSmallIcon(android.R.drawable.stat_notify_sdcard) .setContentTitle( context.getResources().getString( R.string.app_name)) .setContentText("Recording Running") .setTicker("Recording Running") .setPriority(Integer.MAX_VALUE).setOngoing(true); return mBuilder.build(); } private Notification createFinishedNotification(Context context, File file) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "video/mp4"); PendingIntent pendingIntent = PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); Notification.Builder mBuilder = new Notification.Builder( context) .setSmallIcon(android.R.drawable.stat_notify_sdcard) .setContentTitle( context.getResources().getString( R.string.app_name)) .setContentText("Recording Finished") .setTicker("Recording Finished") .setContentIntent(pendingIntent).setOngoing(false) .setAutoCancel(true); return mBuilder.build(); } } }

2) Puede capturar las capturas de pantalla y hacer el video desde allí y funcionará para los dispositivos 3.0+. Y para convertir las imágenes a video, puede usar FFMPEG o JavaCV.

- Para dispositivos Rooted (en los que también puede capturar la pantalla del teclado)

if (Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { // we check if external storage is/ available, otherwise // display an error message to the user using Toast Message File sdCard = Environment.getExternalStorageDirectory(); File directory = new File(sdCard.getAbsolutePath() + "/ScreenShots"); directory.mkdirs(); String filename = "screenshot_jpeg_" + i + ".png"; File yourFile = new File(directory, filename); try { Process sh = Runtime.getRuntime().exec("su", null, null); OutputStream os = sh.getOutputStream(); os.write(("/system/bin/screencap -p " + "/sdcard/ScreenShots/" + filename).getBytes("ASCII")); os.flush(); os.close(); sh.waitFor(); i++; } catch (Exception e) { e.printStackTrace(); } }

- Para dispositivos sin Roots (en que no puede capturar la pantalla del teclado)

if (Environment.MEDIA_MOUNTED.equals(Environment .getExternalStorageState())) { // we check if external storage is/ available, otherwise // display an error message to the user using Toast Message File sdCard = Environment.getExternalStorageDirectory(); File directory = new File(sdCard.getAbsolutePath() + "/ScreenShots"); directory.mkdirs(); String filename = "screenshot_jpeg_" + i + ".png"; File yourFile = new File(directory, filename); try { Process sh = Runtime.getRuntime().exec("su", null, null); OutputStream os = sh.getOutputStream(); os.write(("/system/bin/screencap -p " + "/sdcard/ScreenShots/" + filename).getBytes("ASCII")); os.flush(); os.close(); sh.waitFor(); i++; } catch (Exception e) { e.printStackTrace(); } }

Sé que esta pregunta se ha hecho tantas veces y hay tantas preguntas, respuestas y discusiones disponibles. Pero no sé qué hacer y qué no hacer.

Ya me referí a los enlaces de abajo para obtener una solución sin suerte.

https://stackoverflow.com/questions/23438767/how-to-record-video-on-kitkat-4-4
https://stackoverflow.com/questions/23185125/i-cannot-screen-record-with-my-kitkat-4-4-moto-x
Android KitKat inicia el registro de pantalla desde la aplicación
grabador de pantalla con kitkat
Kit de grabación de pantalla con boton.

Con mucha búsqueda no obtuve ningún ejemplo simple para lograr esta tarea. Desde 2 días estoy tratando de lograr esto pero sin éxito.

Entonces la pregunta simple es si es posible grabar video de nuestra propia pantalla en Android. Acabo de escuchar que es posible desde Android 4.4 Kitkat y también verifico algunas aplicaciones del mercado.

Sé que para hacer esto, nuestro dispositivo debe estar rooteado y otras cosas que se requieren para hacer esto.

Pero no estoy aprendiendo cómo desarrollar esto programáticamente. Si alguien tiene alguna idea, por favor guíeme cómo hacer esto. O cualquier ejemplo o código será de gran ayuda.

Aprecio tu ayuda de cualquier tipo.

Intento desarrollar con este simple código pero no obtengo nada.

public void startRecording(View v) { File recordfolder = Environment.getExternalStorageDirectory(); String record = "su — bit rate 8000000 --time-limit 30 " + recordfolder + "Record.mp4"; recordfolder.mkdir(); try { Process screenrecording = Runtime.getRuntime().exec(record); } catch (IOException e) { e.printStackTrace(); } }

así que, básicamente, no sé qué tengo que hacer con este Process screenrecording , me refiero a cómo puedo comenzar el progreso.