Я пытаюсь сделать снимок всего экрана в приложении для Android, но на захваченном изображении нет значков строки состояния. Я хочу сделать полный снимок экрана, включающий в себя как системные значки, так и содержимое приложения.
В настоящее время я использую следующий метод для создания снимка экрана:
public void takeAndSaveScreenshot() {
Window window = getWindow();
View rootView = window.getDecorView().getRootView();
rootView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(rootView.getDrawingCache());
rootView.setDrawingCacheEnabled(false);
// file path
File filePath = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/est_screenshot.png");
FileOutputStream fileOutputStream;
try {
fileOutputStream = new FileOutputStream(filePath);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
Toast.makeText(getApplicationContext(), "Saved: " + filePath.getPath(), Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "IOException", Toast.LENGTH_LONG).show();
}
}
К сожалению, этот метод фиксирует только вид моего приложения, исключая строку состояния и ее значки. Я также пробовал использовать MediaProjection для захвата экрана, но проблемы все равно возникали.
public class CaptureActivity extends AppCompatActivity {
private static final int REQUEST_CODE = 1000;
private VirtualDisplay virtualDisplay;
private ImageReader imageReader;
TextView button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_capture);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
button = findViewById(R.id.button_capture);
button.setOnClickListener(v -> {
MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
Intent permissionIntent = projectionManager.createScreenCaptureIntent();
startActivityForResult(permissionIntent, 1000);
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
MediaProjectionManager projectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);
startForegroundService();
}
}
private void startForegroundService() {
Intent serviceIntent = new Intent(this, MediaProjectionService.class);
ContextCompat.startForegroundService(this, serviceIntent);
}
}
/////////////////
public class MediaProjectionService extends Service {
private static final String CHANNEL_ID = "MediaProjectionServiceChannel";
@Override
public void onCreate() {
super.onCreate();
createNotificationChannel();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Screen")
.setContentText("Screen Screen")
.setSmallIcon(R.drawable.ic_ui_add_circle)
.build();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
startForeground(1, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION);
} else {
startForeground(1,notification);
}
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel = new NotificationChannel(
CHANNEL_ID,
"Media Projection Service Channel",
NotificationManager.IMPORTANCE_DEFAULT
);
NotificationManager manager = getSystemService(NotificationManager.class);
if (manager != null) {
manager.createNotificationChannel(serviceChannel);
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... ons-in-and
Как сделать полноэкранный снимок экрана, включая значки строки состояния, в Android 14? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как сделать полноэкранный снимок экрана, включая значки строки состояния, в Android 14?
Anonymous » » в форуме Android - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как сделать снимок экрана браузера, включая URL-адрес и вкладки, с помощью Selenium и C#
Anonymous » » в форуме C# - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-