gpt4 book ai didi

android - 如何以编程方式在 android 中录制超过 3 分钟的屏幕?

转载 作者:行者123 更新时间:2023-11-29 01:41:47 26 4
gpt4 key购买 nike

我尝试在 Android 4.4 上使用屏幕录制。我找到了代码示例,但是不能写超过 3 分钟的视频。我该如何解决这个 Android 限制?在某些应用程序中,例如 Rec。此限制已被删除。

这是我使用的示例。

public class MainActivity extends Activity {
private static final int RUNNING_NOTIFICATION_ID = 73;
private static final int FINISHED_NOTIFICATION_ID = 1337;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new MainFragment())
.commit();
}
}

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();
}
}
}

}

最佳答案

您不能绕过 3 分钟的限制。您可以组合多个 3 分钟的视频来制作更长的视频。

如果您愿意编写自己的屏幕录制功能,那么您将需要在线程中不断截取屏幕截图并将所有这些图像转换为视频。希望有一些库可供您使用。

另一种选择是从您的应用程序启动屏幕录制应用程序,但这需要在设备上也安装屏幕录制应用程序。

关于android - 如何以编程方式在 android 中录制超过 3 分钟的屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com