如何在我的应用程序(System-App+根设备)中的Android Studio(API LEVEL>=17)中实现它?
我知道这是可能的,因为我的手机(联想A516)和其他一些手机都有这个功能--->gt>屏幕截图<lt<---
首先需要一些想法。。我可以使用AlarmClock吗?
@PM77-1确实回答了您的问题。在AOSP中,没有API会在给定时间打开电话(从关闭状态)。然而,一些手机确实支持此功能,但其实现取决于手机。通常,无法从关闭状态打开手机(无论root权限和系统权限如何)。话虽如此,有一种方法可以重新启动手机但有趣的是,没有办法通过程序将手机断电(OP有根,这不适用)
这里有一个解决方案(在联想A516、API LEVEL 17上测试,但它应该类似于其他具有"定时通电/断电功能"的设备(如本文所述):
卸载/system/app/SchedulePowerOnOff.apk
编译并安装此代码
enableAlertPowerOn(…)是神奇发生的功能:
private static void enableAlertPowerOn(Context context, long atTimeInMillis){
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, SchPwrOnReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
am.set(7, atTimeInMillis, sender);
}
SchPwrOnReceiver.java:
package com.mediatek.schpwronoff.receivers;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class SchPwrOnReceiver extends BroadcastReceiver {
private static final int STALE_WINDOW = 1800;
private static final String TAG = "SchPwrOnReceiver";
@Override
public void onReceive(Context context, Intent intent) {
//TODO optional
}
}
build.gradle(:app),applicationId必须是";com.mediatek.schpwronoff">:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
defaultConfig {
applicationId "com.mediatek.schpwronoff"
minSdkVersion 17
targetSdkVersion 29
versionCode 17
versionName "4.2.2"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation 'com.android.support:support-compat:28.0.0'
}
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="17" android:versionName="4.2.2" package="com.mediatek.schpwronoff">
<application
android:name=".MYApplication"
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".receivers.SchPwrOnReceiver">
<intent-filter>
<action android:name="com.android.settings.schpwronoff.PWR_ON_ALERT"/>
</intent-filter>
</receiver>
</application>
</manifest>
示例如何从活动:调用enableAlertPowerOn(上下文上下文,长时间为TimeInMillis)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
showDateTimePickerPowerOn(this);
}
public void showDateTimePickerPowerOn(Context context) {
final Calendar currentDate = Calendar.getInstance();
date = Calendar.getInstance();
new DatePickerDialog(context, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
date.set(year, monthOfYear, dayOfMonth);
new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
date.set(Calendar.HOUR_OF_DAY, hourOfDay);
date.set(Calendar.MINUTE, minute);
date.set(Calendar.SECOND, 0);
long cTimeInMillis = date.getTimeInMillis();
enableAlertPowerOn(context, cTimeInMillis);
}
}, currentDate.get(Calendar.HOUR_OF_DAY), currentDate.get(Calendar.MINUTE), true).show();
}
}, currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE)).show();
}