Программная перезагрузка устройства

Я создаю фоновую службу только для своего потребления. Мне нужно перезагрузить устройство при определенных условиях.

  1. Я понимаю, что для того, чтобы приложение / служба перезагрузили устройство, это должно быть системное приложение.

  2. Поскольку я буду использовать ТОЛЬКО это приложение, есть ли способ подписать его для своего устройства и использовать для указанной цели (перезагрузка в зависимости от условий)

  3. Если да, не могли бы вы указать мне, как подписать приложение, чтобы оно могло стать системным приложением, и можно ли установить .apk в обычном режиме, как другие файлы.

  4. Любая ссылка на код для перезагрузки также поможет мне начать проект при условии, что условие 2 удовлетворяет

Я использую устройство MI с Android 6.0. Я хотел бы добиться этого без рутирования своего устройства.

Добавление кода

        if (ContextCompat.checkSelfPermission(MainActivity.this,
            Manifest.permission.REBOOT)
            != PackageManager.PERMISSION_GRANTED) {


        System.out.println("Permission Ask");

        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                Manifest.permission.REBOOT)) {
            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.
            Toast.makeText(MainActivity.this,"Explain",Toast.LENGTH_LONG).show();
        } else {

            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.REBOOT},
                    MY_PERMISSIONS_REQUEST_REBOOT);
        }

    } else {
        // Permission has already been granted
        Toast.makeText(MainActivity.this,"You have been granter permission",Toast.LENGTH_LONG).show();
    }

@Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {

       if (requestCode == MY_PERMISSIONS_REQUEST_REBOOT) {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.

                    Toast.makeText(MainActivity.this,"Permission Done",Toast.LENGTH_LONG).show();
                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.

                    Toast.makeText(MainActivity.this, "Permission Not Done", Toast.LENGTH_LONG).show();

                }
            }

            // other 'case' lines to check for other
            // permissions this app might request.
        }

Вы не можете установить свое приложение в качестве системного без рутирования устройства. Если у вас все в порядке с рутированием устройства, я могу объяснить дальше.

sak 27.06.2018 08:47

@sak потребует ли это требование рутирования, я имею в виду пункт 2

bukubapi 27.06.2018 08:50
2
2
4 461
1

Ответы 1

Если вы хотите, чтобы устройство перезагружалось (выключалось и снова), попробуйте PowerManager.reboot ()

PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
powerManager.reboot(null);

android.os.PowerManager:

  /**
 * Reboot the device.  Will not return if the reboot is successful.
 * <p>
 * Requires the {@link android.Manifest.permission#REBOOT} permission.
 * </p>
 *
 * @param reason code to pass to the kernel (e.g., "recovery") to
 *               request special boot modes, or null.
 */
public void reboot(String reason) {
    try {
        mService.reboot(false, reason, true);
    } catch (RemoteException e) {
    }
}

Если вы хотите полностью выключить устройство, используйте PowerManagerService.shutdown()

  IPowerManager powerManager = IPowerManager.Stub.asInterface(
        ServiceManager.getService(Context.POWER_SERVICE));
try {
    powerManager.shutdown(false, false);
} catch (RemoteException e) {
}




   /**
 * Shuts down the device.
 *
 * @param confirm If true, shows a shutdown confirmation dialog.
 * @param wait If true, this call waits for the shutdown to complete and does not return.
 */
@Override // Binder call
public void shutdown(boolean confirm, boolean wait) {
    mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null);

    final long ident = Binder.clearCallingIdentity();
    try {
        shutdownOrRebootInternal(true, confirm, null, wait);
    } finally {
        Binder.restoreCallingIdentity(ident);
    }
}

Получение ошибки - когда я выполняю код .reboot (null) при нажатии кнопки. Не уверен, что это за ошибка. Процесс: com.miui.miui.miuiservice, PID: 4579 java.lang.IllegalStateException: не удалось выполнить метод для android: onClick на android.support.v7.app.AppCompatViewInflater $ DeclaredOnClick‌ Listener.onClick (App‌ CompatViewInflater.j ava: 293) на android.view.View.performClick (View.java:5198) на android.view.View $ PerformClick.run (View.java:21147)

bukubapi 27.06.2018 15:56

Хорошо, он показывает мне эту ошибку - ни у пользователя 10055, ни у текущего процесса нет android.permission.REBOOT. Я добавил то же самое в манифест и добавил код разрешения запроса, но он все равно не работает. [Появляется сообщение Permission Not Done] Добавлен код в основной вопрос

bukubapi 27.06.2018 17:02

Я считаю, что разрешение .REBOOT и permission.SHUTDOWN требуют, чтобы ваше приложение было системным. То есть установлен производителем и в исходной прошивке системы. В android 9 мне пришлось установить свое приложение на планшеты компании и добавить эти разрешения в белый список, который в основном представляет собой манифест, установленный в системную папку отдельно ... в любом случае вам нужно, чтобы ваше приложение было системой app (или с привилегиями), либо станьте суперпользователем, чтобы получить эти разрешения. Это так, что обычные приложения не могут сделать пользовательские устройства бесполезными.

FoxDonut 24.04.2020 03:38

Другие вопросы по теме