Android: Java – реализовать код снимка экрана для плавающей кнопки ⇐ JAVA
Android: Java – реализовать код снимка экрана для плавающей кнопки
У меня есть две программы, которые работают. Но мне нужно реализовать функцию скриншота в коде плавающей кнопки (второй).
В первом сделан скриншот после нажатия кнопки:
MainActivity.java
пакет com.example.screenshotapp; импортировать android.Manifest; импортировать android.content.pm.PackageManager; импортировать android.graphics.Bitmap; импортировать android.os.Bundle; импортировать android.os.Environment; импортировать android.view.View; импортировать android.widget.Button; импортировать android.widget.Toast; импортировать androidx.annotation.NonNull; импортировать androidx.appcompat.app.AppCompatActivity; импортировать androidx.core.app.ActivityCompat; импортировать androidx.core.content.ContextCompat; импортировать java.io.File; импортировать java.io.FileOutputStream; импортировать java.util.Date; публичный класс MainActivity расширяет AppCompatActivity { частный статический финал int REQUEST_CODE_PERMISSION = 101; @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_main); Кнопка скриншотаButton = findViewById(R.id.screenshotButton); скриншотButton.setOnClickListener(v -> { если (checkPermission()) { взятьСкриншот(); } еще { просить разрешение(); } }); } частная логическая функция checkPermission() { разрешение int = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); разрешение на возврат == PackageManager.PERMISSION_GRANTED; } частный недействительный requestPermission () { ActivityCompat.requestPermissions(это, новая строка[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION); } @Override public void onRequestPermissionsResult(int requestCode, разрешения @NonNull String[], @NonNull int[]grantResults) { super.onRequestPermissionsResult(requestCode, разрешения, GrantResults); если (requestCode == REQUEST_CODE_PERMISSION) { if (grantResults.length > 0 && GrantResults[0] == PackageManager.PERMISSION_GRANTED) { взятьСкриншот(); } еще { Toast.makeText(this, «В разрешении отказано. Невозможно сделать снимок экрана.", Toast.LENGTH_SHORT).show(); } } } частная пустота takeScreenshot() { пытаться { Просмотр rootView = getWindow().getDecorView().getRootView(); rootView.setDrawingCacheEnabled(истина); Растровое изображение = Bitmap.createBitmap(rootView.getDrawingCache()); rootView.setDrawingCacheEnabled (ложь); Строка fileName = «screenshot_» + новая дата().getTime() + «.png»; Скриншот файлаFile = новый файл (Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES), fileName); FileOutputStream outputStream = новый FileOutputStream (screenshotFile); bitmap.compress(Bitmap.CompressFormat.PNG, 100, выходной поток); выходной поток.flush(); выходной поток.закрыть(); Toast.makeText(this, «Скриншот сохранен: » + screenFile.getAbsolutePath(), Toast.LENGTH_SHORT).show(); } catch (Исключение е) { е.printStackTrace(); Toast.makeText(this, «Ошибка при создании снимка экрана.», Toast.LENGTH_SHORT).show(); } } } AndroidManifest.xml
activity_main.xml
И есть второй код — виджет с плавающей кнопкой, который виден и в других приложениях: MainAcivity.java
пакет com.example.mywidget2; импортировать android.app.Activity; импортировать android.os.Bundle; импортировать android.view.View; импортировать android.content.Intent; импортировать android.os.Bundle; импортировать android.view.View; импортировать androidx.appcompat.app.AppCompatActivity; публичный класс MainActivity расширяет AppCompatActivity { @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_main); startFloatingWidgetService(); } частная пустота startFloatingWidgetService() { Намерение намерение = новое намерение (это, FloatingWidgetService.class); startService (намерение); } } FloatingWidgetService.java
пакет com.example.mywidget2; импортировать android.app.Service; импортировать android.content.Intent; импортировать android.graphics.PixelFormat; импортировать android.net.Uri; импортировать android.os.Build; импортировать android.os.IBinder; импортировать android.provider.Settings; импортировать android.view.Gravity; импортировать android.view.LayoutInflater; импортировать android.view.View; импортировать android.view.WindowManager; импортировать android.widget.Button; импортировать com.example.mywidget2.R; общественный класс FloatingWidgetService расширяет службу { частный WindowManager mWindowManager; частный просмотр mFloatingWidgetView; @Override public IBinder onBind (Намерение) { вернуть ноль; } // Метод запроса разрешения SYSTEM_ALERT_WINDOW частный недействительный requestOverlayPermission () { если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Намерение намерение = новое намерение (Settings.ACTION_MANAGE_OVERLAY_PERMISSION); Intent.setData(Uri.parse("пакет:" + getPackageName())); Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity (намерение); } } // Метод создания плавающего виджета частная пустота createFloatingWidget() { // Раздуваем макет плавающего виджета mFloatingWidgetView = LayoutInflater.from(this).inflate(R.layout.floating_widget_layout, нулевой); // Инициализируем кнопку на плавающем виджете Кнопка button = mFloatingWidgetView.findViewById(R.id.floating_button); button.setOnClickListener(new View.OnClickListener() { @Override общественная недействительность onClick (Просмотр v) { // Обрабатываем событие нажатия кнопки показатьТекстДиалог(); // Здесь вы можете выполнять другие действия по мере необходимости } }); // Инициализируем оконный менеджер mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); // Настраиваем WindowManager.LayoutParams для плавающего виджета Параметры WindowManager.LayoutParams = новый WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ); // Устанавливаем гравитацию плавающего виджета (положение на экране) params.gravity = Gravity.BOTTOM | Гравитация.КОНЕЦ; // Добавляем плавающий виджет в WindowManager mWindowManager.addView(mFloatingWidgetView, params); } @Override общественная недействительность onCreate() { супер.onCreate(); // Проверяем, предоставлено ли разрешение (только для уровня API 23 и выше) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { // У вас нет разрешения на рисование наложений, поэтому запросите его requestOverlayPermission(); } еще { // Разрешение получено, приступаем к созданию плавающего виджета createFloatingWidget(); } } @Override общественная недействительность onDestroy () { супер.onDestroy(); if (mFloatingWidgetView != null && mWindowManager != null) { mWindowManager.removeView(mFloatingWidgetView); } } частный недействительный showTextDialog() { } } AndroidManifest.xml
floating_widget_layout.xml
У меня есть две программы, которые работают. Но мне нужно реализовать функцию скриншота в коде плавающей кнопки (второй).
В первом сделан скриншот после нажатия кнопки:
MainActivity.java
пакет com.example.screenshotapp; импортировать android.Manifest; импортировать android.content.pm.PackageManager; импортировать android.graphics.Bitmap; импортировать android.os.Bundle; импортировать android.os.Environment; импортировать android.view.View; импортировать android.widget.Button; импортировать android.widget.Toast; импортировать androidx.annotation.NonNull; импортировать androidx.appcompat.app.AppCompatActivity; импортировать androidx.core.app.ActivityCompat; импортировать androidx.core.content.ContextCompat; импортировать java.io.File; импортировать java.io.FileOutputStream; импортировать java.util.Date; публичный класс MainActivity расширяет AppCompatActivity { частный статический финал int REQUEST_CODE_PERMISSION = 101; @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_main); Кнопка скриншотаButton = findViewById(R.id.screenshotButton); скриншотButton.setOnClickListener(v -> { если (checkPermission()) { взятьСкриншот(); } еще { просить разрешение(); } }); } частная логическая функция checkPermission() { разрешение int = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); разрешение на возврат == PackageManager.PERMISSION_GRANTED; } частный недействительный requestPermission () { ActivityCompat.requestPermissions(это, новая строка[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_PERMISSION); } @Override public void onRequestPermissionsResult(int requestCode, разрешения @NonNull String[], @NonNull int[]grantResults) { super.onRequestPermissionsResult(requestCode, разрешения, GrantResults); если (requestCode == REQUEST_CODE_PERMISSION) { if (grantResults.length > 0 && GrantResults[0] == PackageManager.PERMISSION_GRANTED) { взятьСкриншот(); } еще { Toast.makeText(this, «В разрешении отказано. Невозможно сделать снимок экрана.", Toast.LENGTH_SHORT).show(); } } } частная пустота takeScreenshot() { пытаться { Просмотр rootView = getWindow().getDecorView().getRootView(); rootView.setDrawingCacheEnabled(истина); Растровое изображение = Bitmap.createBitmap(rootView.getDrawingCache()); rootView.setDrawingCacheEnabled (ложь); Строка fileName = «screenshot_» + новая дата().getTime() + «.png»; Скриншот файлаFile = новый файл (Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES), fileName); FileOutputStream outputStream = новый FileOutputStream (screenshotFile); bitmap.compress(Bitmap.CompressFormat.PNG, 100, выходной поток); выходной поток.flush(); выходной поток.закрыть(); Toast.makeText(this, «Скриншот сохранен: » + screenFile.getAbsolutePath(), Toast.LENGTH_SHORT).show(); } catch (Исключение е) { е.printStackTrace(); Toast.makeText(this, «Ошибка при создании снимка экрана.», Toast.LENGTH_SHORT).show(); } } } AndroidManifest.xml
activity_main.xml
И есть второй код — виджет с плавающей кнопкой, который виден и в других приложениях: MainAcivity.java
пакет com.example.mywidget2; импортировать android.app.Activity; импортировать android.os.Bundle; импортировать android.view.View; импортировать android.content.Intent; импортировать android.os.Bundle; импортировать android.view.View; импортировать androidx.appcompat.app.AppCompatActivity; публичный класс MainActivity расширяет AppCompatActivity { @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_main); startFloatingWidgetService(); } частная пустота startFloatingWidgetService() { Намерение намерение = новое намерение (это, FloatingWidgetService.class); startService (намерение); } } FloatingWidgetService.java
пакет com.example.mywidget2; импортировать android.app.Service; импортировать android.content.Intent; импортировать android.graphics.PixelFormat; импортировать android.net.Uri; импортировать android.os.Build; импортировать android.os.IBinder; импортировать android.provider.Settings; импортировать android.view.Gravity; импортировать android.view.LayoutInflater; импортировать android.view.View; импортировать android.view.WindowManager; импортировать android.widget.Button; импортировать com.example.mywidget2.R; общественный класс FloatingWidgetService расширяет службу { частный WindowManager mWindowManager; частный просмотр mFloatingWidgetView; @Override public IBinder onBind (Намерение) { вернуть ноль; } // Метод запроса разрешения SYSTEM_ALERT_WINDOW частный недействительный requestOverlayPermission () { если (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Намерение намерение = новое намерение (Settings.ACTION_MANAGE_OVERLAY_PERMISSION); Intent.setData(Uri.parse("пакет:" + getPackageName())); Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity (намерение); } } // Метод создания плавающего виджета частная пустота createFloatingWidget() { // Раздуваем макет плавающего виджета mFloatingWidgetView = LayoutInflater.from(this).inflate(R.layout.floating_widget_layout, нулевой); // Инициализируем кнопку на плавающем виджете Кнопка button = mFloatingWidgetView.findViewById(R.id.floating_button); button.setOnClickListener(new View.OnClickListener() { @Override общественная недействительность onClick (Просмотр v) { // Обрабатываем событие нажатия кнопки показатьТекстДиалог(); // Здесь вы можете выполнять другие действия по мере необходимости } }); // Инициализируем оконный менеджер mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); // Настраиваем WindowManager.LayoutParams для плавающего виджета Параметры WindowManager.LayoutParams = новый WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ); // Устанавливаем гравитацию плавающего виджета (положение на экране) params.gravity = Gravity.BOTTOM | Гравитация.КОНЕЦ; // Добавляем плавающий виджет в WindowManager mWindowManager.addView(mFloatingWidgetView, params); } @Override общественная недействительность onCreate() { супер.onCreate(); // Проверяем, предоставлено ли разрешение (только для уровня API 23 и выше) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { // У вас нет разрешения на рисование наложений, поэтому запросите его requestOverlayPermission(); } еще { // Разрешение получено, приступаем к созданию плавающего виджета createFloatingWidget(); } } @Override общественная недействительность onDestroy () { супер.onDestroy(); if (mFloatingWidgetView != null && mWindowManager != null) { mWindowManager.removeView(mFloatingWidgetView); } } частный недействительный showTextDialog() { } } AndroidManifest.xml
floating_widget_layout.xml
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение