Я создаю фоновую службу только для своего потребления. Мне нужно перезагрузить устройство при определенных условиях.
Я понимаю, что для того, чтобы приложение / служба перезагрузили устройство, это должно быть системное приложение.
Поскольку я буду использовать ТОЛЬКО это приложение, есть ли способ подписать его для своего устройства и использовать для указанной цели (перезагрузка в зависимости от условий)
Если да, не могли бы вы указать мне, как подписать приложение, чтобы оно могло стать системным приложением, и можно ли установить .apk в обычном режиме, как другие файлы.
Любая ссылка на код для перезагрузки также поможет мне начать проект при условии, что условие 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 потребует ли это требование рутирования, я имею в виду пункт 2
Если вы хотите, чтобы устройство перезагружалось (выключалось и снова), попробуйте PowerManager.reboot ()
PowerManager powerManager = (PowerManager)getSystemService(Context.POWER_SERVICE);
powerManager.reboot(null);
/**
* 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)
Хорошо, он показывает мне эту ошибку - ни у пользователя 10055, ни у текущего процесса нет android.permission.REBOOT. Я добавил то же самое в манифест и добавил код разрешения запроса, но он все равно не работает. [Появляется сообщение Permission Not Done] Добавлен код в основной вопрос
Я считаю, что разрешение .REBOOT и permission.SHUTDOWN требуют, чтобы ваше приложение было системным. То есть установлен производителем и в исходной прошивке системы. В android 9 мне пришлось установить свое приложение на планшеты компании и добавить эти разрешения в белый список, который в основном представляет собой манифест, установленный в системную папку отдельно ... в любом случае вам нужно, чтобы ваше приложение было системой app (или с привилегиями), либо станьте суперпользователем, чтобы получить эти разрешения. Это так, что обычные приложения не могут сделать пользовательские устройства бесполезными.
Вы не можете установить свое приложение в качестве системного без рутирования устройства. Если у вас все в порядке с рутированием устройства, я могу объяснить дальше.