Android - Как сделать настоящий поддельный экран блокировки

Я разрабатываю приложение для Android, и мне нужно создать «фальшивый экран блокировки». Я объясняю.

Приложение должно отображать черный экран, как если бы экран был заблокирован (просто), тогда я хочу отобразить поддельный экран блокировки, когда пользователь нажимает кнопку блокировки/разблокировки телефона.

Моя проблема в том, что когда я устанавливаю фон приложения с текущими обоями (получить с помощью диспетчера обоев), фон не «обрезается». Фоновое изображение уместилось на экране, а не, как на «домашнем экране» телефона, уместилось на ряду с рабочим столом.

Я пытаюсь использовать getBuiltInDrawable(FLAG_LOCK), но он доступен только из API 24, и когда я пытаюсь, результат не такой, как я ожидаю =/

Есть ли здесь кто-нибудь, у кого есть идеи по этому вопросу?

Заранее спасибо. Батист.


person Baptiste    schedule 22.03.2017    source источник
comment
вы должны опубликовать некоторый код и реорганизовать свой ответ на вашу конкретную проблему, похоже, именно так вы можете изменить режим масштабирования изображения.   -  person rupps    schedule 23.03.2017
comment
@rupps Да, я мог бы, но помимо вопроса о том, как изменить режим масштабирования изображения, я хотел бы также узнать о передовой практике. Что лучше подделать экран блокировки или сделать действительно экран блокировки? Если я подделываю экран блокировки, как я могу отобразить верхний системный интерфейс, но не нижний системный интерфейс и т. д. Если возможно, я хотел бы обсудить мою общую проблему, как организовать мое приложение, чтобы подделать экран блокировки :)   -  person Baptiste    schedule 23.03.2017
comment
Я не думаю, что вы действительно можете сделать настоящий экран блокировки И заставить его использовать произвольные устройства, приложение блокировки экрана работает с системными привилегиями, и вы сможете заменить его, только внедрив его в пользовательскую прошивку или поэкспериментировав с экзотическими вещами. требующий root-доступа. Вам лучше подделать это с помощью модного приложения и молиться, чтобы пользователь не понял. Но не делай гадостей! Почему бы вместо этого не написать следующий Pokemon Go?   -  person rupps    schedule 23.03.2017
comment
Потому что это не то, что я хочу, ха-ха :D На самом деле, если я выставлю то, что хочу, это: я хочу фальшивый экран блокировки и, в зависимости от того, какой пин-код используется для разблокировки телефона, я отображаю другую активность. Пример: я студент, мой профессор идет позади меня, я запускаю приложение, черный экран, профессор: Эй, студент, что ты делаешь ?!, Студент: Я ищу помощь в вашем упражнении !!, кажется, разблокирует телефон, введите пин-код 3003, и отобразится изображение хрома, но если это пин-код 3004, это изображение карт Google или что-то еще! Ничего противного! :)   -  person Baptiste    schedule 23.03.2017


Ответы (1)


Хорошо, так что вам нужно

1) Создайте свою активность, используя полноэкранную тему без панели действий, чтобы она не выглядела как приложение. Для этого вы создадите стиль в файле styles.xml и примените его в файле manifest.xml.

Полноэкранная тема для AppCompat

2) Для фонового изображения используйте ImageView. ImageViews имеют свойство scaleType из коробки, позволяющее выбирать разные режимы: FIT, Center Crop и т.д...

https://developer.android.com/reference/android/widget/ImageView.ScaleType.html

3) Создайте остальную логику для ввода PIN-кода. и покажите свои разные макеты изображений. Есть хороший компонент, который действительно подходит для вашего «проекта», он называется ViewFlipper и, по сути, позволяет вам поместить все изображения внутрь и выбрать, какое из них показывать. Ваш корневой макет будет выглядеть примерно так:

<ViewFlipper 
   android:id="@+id/flipper"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

   <!-- page 0: the lock screen mock -->
   <FrameLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

      <ImageView
          android:src="@drawable/mock_lock_screen"
          android:scaleType="centerCrop"
          android:layout_width="match_parent"
          android:layout_height="match_parent"/>

       <EditText
          android:id="@+id/pinCode"
          android:layout_width="80dp"
          android:layout_height="wrap_content"
          android:layout_gravity="center"
          android:hint="PIN CODE" />
   </FrameLayout>

   <!-- page 1: chrome screen mock-->
   <ImageView
      android:src="@drawable/mock_chrome"
      android:scaleType="centerCrop"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

   <!-- page 2: wikipedia screen mock-->
   <ImageView
      android:src="@drawable/mock_wiki"
      android:scaleType="centerCrop"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

    .
    .
</ViewFlipper>

Затем в действии вы можете показать экран блокировки и любую макетную страницу:

ViewFlipper mFlipper;

@Override
public void onCreate(Bundle savedInstanceState) {
   .
   .
   mFlipper = (ViewFlipper)findViewById(R.id.flipper);
  .
  .
  .
}

и изменить отображаемый экран

  mFlipper.setDisplayedChild(0); // will show lock screen
  mFlipper.setDisplayedChild(1); // will show chrome mock
  mFlipper.setDisplayedChild(2); // will show wikipedia mock

надеюсь, вы поняли идею! счастливое кодирование.

person rupps    schedule 22.03.2017
comment
Большое спасибо ! Я думаю, это то, чего я ожидаю, и вся информация, которая мне нужна, возможно, здесь! - person Baptiste; 23.03.2017
comment
Поэтому я пробую ваше решение. Это довольно круто и почти то, что я хочу. Единственная оставшаяся проблема заключается в том, что фон (такой же, как обои) не подходит правильно. Действительно, при ширине match_parent ширина фона равна 1 экрану. Но если я нахожусь на домашнем экране Android с, например, 2 домашними экранами, ширина составляет 2 экрана. Есть ли какой-либо класс или услуга, чтобы получить номер домашнего экрана? Я нашел stackoverflow.com/questions /6086040/ или DisplayMetrics, но я не уверен, что это полезно в моем случае.. :( - person Baptiste; 24.03.2017