如何记录在奇巧4.4的Android屏幕视频编程
我知道这个问题已经被问了很多次,有这么多问题的,回答的和讨论可用。但我不知道什么该做,什么不该做。
I know this question has been asked so many times and there are so many question's, answer's and discussions available. But i don't know what to do and what not to do.
我已经提到这下面的所有链接以获得没有运气的解决方案。
I already referred this below all link to get solution with no luck.
如何录制视频奇巧4.4
I无法筛选记录我的奇巧4.4极限摩托
Android从应用
奇巧启动screenrecord
屏幕记录与奇巧
屏幕录制奇巧与按钮
how to record video on kitkat 4.4
I cannot screen record with my kitkat 4.4 Moto X
Android KitKat start screenrecord from App
screen recorder with kitkat
Screen Recording kitkat with button
通过大量的搜索,我没有得到任何简单的例子来实现这一任务。由于2-一天我试图做到这一点,但没有成功。
With lot's of search i didn't get any simple example to achieve this task. Since 2 day's i am trying to achieve this but with no success.
所以简单的问题是,是否有可能在Android的记录我们自己的屏幕的视频。我只是听说,有可能从Android 4.4系统的奇巧,我也检查从市场的一些应用程序。
So the simple question is whether it is possible to record video of our own screen in android. I just heard that it is possible from android 4.4 Kitkat and i also check some app from market.
我知道要做到这一点我们的设备应该植根和其他事情需要做。
I know to do this our device should be rooted and other things which required to do this.
但我没有得到如何以编程方式开发这个。如果任何人有任何想法,那么请指导我如何做到这一点。或任何例子或者code将是很大的帮助。
But i am not getting how to develop this programmatically. If any one have any idea then please guide me how to do this. or any example or code will be great help.
我AP preciate您的任何形式的帮助。
I appreciate your any kind of help.
我尝试开发这个简单的一块code,但没有得到任何东西。
I try to develop with this simple piece of code but not getting anything
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();
}
}
所以基本上我不知道我有什么做这个过程screenrecording
,我的意思是我如何开始取得进展。
so basically i don't know what i have to do with this Process screenrecording
, i mean how can i start progress.
很好的问题,但答案取决于你想用它来记录在Android的屏幕是什么类型的平台。
Good Question But the answer depends on what type of platform you want to use to record the screen in android.
下面是一些技巧.....
1)使用这个类,你可以录制屏幕的堡垒,你需要root权限的设备,你可以在genymotion 4.4还进行测试。
1) Using this class you can record the screen fort that you required rooted device you can test this in genymotion 4.4 also.
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)您可以捕获屏幕快照并从它使视频,也将努力为3.0+设备和用于将图像视频,你可以使用FFMPEG或JavaCV。
2) You can capture the screen shots and make the video from it and it will work for the 3.0+ devices And for converting the images to video you can use FFMPEG or JavaCV.
- 对于扎根设备(在你可以捕捉键盘屏幕还)
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();
}
}
- 对于没有root权限的设备(因为你无法捕捉键盘屏幕)
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();
}
}