我的要求是:在GCM消息到达后,设备应该唤醒以显示高优先级通知.设备应打开屏幕.
目前我正在使用WakeLock来实现这一目标.该newWakeLock()方法需要传递锁定级别和标志(作为第一个参数,按位或者).
我正在使用PowerManager.ACQUIRE_CAUSES_WAKEUP旗帜,因为它完全符合我的需要.但是,我对锁定级别有点沮丧.所以根据文档,我有以下选择:
PARTIAL_WAKE_LOCK- 与ACQUIRE_CAUSES_WAKEUP屏幕不兼容/不打开屏幕SCREEN_DIM_WAKE_LOCK - 已弃用SCREEN_BRIGHT_WAKE_LOCK - 已弃用FULL_WAKE_LOCK - 已弃用FLAG_KEEP_SCREEN_ON在这种情况下,建议完全没用.我最终只是在压制弃用警告:
@SuppressWarnings("deprecation")
PowerManager.WakeLock screenOn = ((PowerManager) c.getSystemService(Context.POWER_SERVICE)).newWakeLock(
PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, TAG);
screenOn.acquire();
mNotifyMgr.notify(mNotificationId, mBuilder.build());
screenOn.release();
Run Code Online (Sandbox Code Playgroud)
问题:在描述的情况下是否有一种非弃用的可靠方法来唤醒设备?
编辑 我不是要求解决方法来唤醒设备.我的问题是,是否可以Activity使用不弃用的API 从后台唤醒设备(没有运行)
我对Android比较陌生,所以我要问的可能看起来很明显(虽然我已经阅读了所有类似标题的问题,并且进行了广泛的搜索).我需要长时间连续监控加速度计.提出了两种方法:
1)获取部分唤醒锁定,该锁定在整个加速器被监视的时间内保持; 和
2)在前台服务中监控加速度计.
第一种方法似乎使用了大量的电池寿命.第二种方法应该导致服务很少被杀死,但我不确定"很少"意味着什么.应该使用哪种方法,还有哪些方法我应该考虑?
我的应用程序使用警报定期检查位置以BroastcastReceiver启动服务.我知道在开始服务之前我应该获得一个唤醒锁,但我的问题是我什么时候可以释放它?
如果我在通话后释放唤醒锁requestLocationUpdates,设备是否可以进入休眠状态并且不会打电话给我,LocationListener或者设备是否会一直唤醒以提供更新并保持清醒直到回叫返回?我不愿意抓住唤醒锁,因为这会阻止设备在更新之间休眠,直到我完成该位置.
我想在我的应用程序中每秒运行一次报警服务.它在5.1版本以下工作正常.但它不会在5.1设备中触发.我正在使用commonsware wakeful intent service.logcat消息说" 可疑短间隔1000毫秒;扩展到60秒 ".如何在5.1中每秒轮询一次?任何人都可以建议我如何实现这一目标?
更多解释:
我的用例是我需要每隔30分钟做一些操作.AFAIK为此使用报警管理器是一种有效的方法,但在这里
1)我需要向用户显示倒计时器.(计时器任务,倒计时器,ScheduledExecutorService对此非常有用)
2)我需要每30分钟通知用户(通过通知),即使应用程序在后台也是如此.(报警服务就足够了)
但在这里,我的问题是当应用程序处于后台时,当你从最近一次刷出应用程序时(即,应用程序进程被杀死)没有任何服务或计时器,处理程序,执行程序服务将无法工作).在这种情况下,如何在完成30分钟后通知用户.如果我以错误的方式思考,请指导我.
谢谢,
Chaitanya
在过去的几周里,我面临着Android中的电话管理器API的问题 - 基于监听器开始录制的呼入监听器以及结束呼叫停止录制(流程正常工作)
ISSUE
我现在面临的问题是,在一些手机,它正在所有的时间,但在一些手机,电话经理的广播听众停止后几个小时的工作.经过一些研究,我找到了一个使用唤醒锁来防止CPU睡眠的解决方案,我尝试了这个但是徒劳无功.
@Override
public void onReceive(Context context, Intent intent) {
//We listen to two intents. The new outgoing call only tells us of an
//outgoing call. We use it to get the number.
roPlantPrefs = RoPlantPrefs.getInstance(context);
databaseHelper = new DatabaseHelper(context);
//lastState = roPlantPrefs.getLastState();
if (roPlantPrefs.getLogin()) {
if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) {
savedNumber = intent.getExtras().getString("android.intent.extra.PHONE_NUMBER");
} else {
roPlantPrefs = RoPlantPrefs.getInstance(context);
// if (!roPlantPrefs.getIsOnCall()) {
String stateStr = intent.getExtras().getString(TelephonyManager.EXTRA_STATE);
String number = intent.getExtras().getString(TelephonyManager.EXTRA_INCOMING_NUMBER);
int state = 0;
if (stateStr.equals(TelephonyManager.EXTRA_STATE_IDLE)) …Run Code Online (Sandbox Code Playgroud) 我想在几个小时内定期从Android设备的相机拍照,以创建一个时间流逝的视频效果.
我设置了一个Alarm Manager,其AlarmManager.RTC_WAKEUP标志设置为每隔几分钟启动一次服务.
该服务包含部分唤醒锁,有些工作,然后通过启动活动的警报管理器调用广播接收器.
活动被创建(或恢复),打开它自己的唤醒锁,并设置相机预览表面.设置表面后,将调用SurfaceHolder侦听器的surfaceChanged()方法,最终拍摄照片.
如果设备处于唤醒状态,一切都会按预期完美运行.但是如果设备处于睡眠状态,一旦Activity的onResume()方法完成,Activity就会立即暂停.相机的预览表面永远不会完成初始化,也不会拍摄任何照片.
所以我的问题是:
有没有办法以编程方式唤醒手机?我甚至尝试使用:
PowerManager powerManager =
(PowerManager)this.getSystemService(Context.POWER_SERVICE);
powerManager.userActivity(SystemClock.currentThreadTimeMillis(),false);
Run Code Online (Sandbox Code Playgroud)但是,如果手机处于睡眠状态,则不会唤醒手机.
有没有办法在不使用预览表面视图的情况下拍照?
有没有办法拍摄不依赖异步回调的图片?我可以将所有代码放在Activities onResume()方法中来拍照吗?
有没有办法让Activity的onResume()方法运行得足够长,以便摄像头的预览有足够的时间来初始化并调用所有的监听器?
我正确使用了唤醒锁,并且我在清单文件中正确设置了所有权限.我的活动没有保持足够长的时间以使异步侦听器正常工作.
为了解决这个问题,我试图让所有Android 1.6兼容,因为这是我唯一可以访问的测试设备.
这是令人沮丧的事情!
我正在使用内置帐户系统(使用AccountManager API)为Android应用程序实现登录系统.
在Android 2.2+上一切都很好,但在Android 2.1上不包括SyncAdapter导致在帐户设置屏幕中重新启动(请参阅http://code.google.com/p/android/issues/detail?id=5009和AccountManager没有SyncAdapter?)
为了解决这个问题,我实现了一个存根SyncAdapter,它只是null从中返回IBinder onBind(Intent intent),并将相关内容添加到清单中.这解决了Android 2.1上的重启问题.
然而,它引入了另一个问题:添加帐户后,Android系统稍后会启动帐户同步.虽然没有发生错误(事实上我的SyncAdapter什么都不做,但除非通过返回null,否则无法导致错误),同步图标仍然卡在顶部的通知栏中.这导致Android同步系统保持永久唤醒锁定,防止设备休眠.
该帐户未在帐户设置屏幕中列出任何可同步组件(在"数据和同步"标题下),并且始终在帐户列表中显示"同步已关闭"同步状态(即使同步图标在通知栏).禁用帐户同步不会消除此问题.删除帐户可以解决问题.
我的猜测是我不应该返回null.我应该返回ThreadedSyncAdapter的基本实现吗?任何帮助获得帐户系统没有关联同步在2.1和2.2+上正常工作非常感谢.
android user-accounts accountmanager android-syncadapter android-wake-lock
我试图弄清楚如何通过服务唤醒和解锁手机.我一直在指这篇文章但是,我无法弄清楚为什么它不起作用.这是我到目前为止的代码:
public class WakephoneActivity extends Activity {
BroadcastReceiver mReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Log.v(TAG, "Screen OFF onReceive()");
screenOFFHandler.sendEmptyMessageDelayed(0, 2000);
}
};
}
private Handler screenOFFHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// do something
// wake up phone
// Log.i(TAG, "ake up the phone and disable keyguard");
PowerManager powerManager = (PowerManager) WakephoneActivity.this
.getSystemService(Context.POWER_SERVICE);
long l …Run Code Online (Sandbox Code Playgroud) 我在板上编译了一个AOSP树。我购买了无线键盘,并通过USB端口将其连接到板上。我希望板子处于挂起状态时,可以通过按键盘上的键来唤醒。但事实并非如此。
我在自举程序(uboot),内核等中尝试了几种方法。但是没有效果。另外,我进行了一个实验,发现在睡眠状态下,我的USB端口(其中有一个加密狗)只有1-5 mA。但是,加密狗的工作效率应该更高!
有人经历过吗?如何在Android中为USB启用远程唤醒?
谢谢
更多信息:uboot支持USB主机控制器接口。我调整了内核构建选项。但是这两个动作无效。
编辑:我在amlogic的p212参考板上工作。它的SoC是Amlogic S905X。
编辑2:我使用手机及其充电器测试了该板(实际上是一个电视盒),发现当盒进入睡眠状态时,充电停止了!因此,我可以推断出加密狗没有足够的能量来维持生命!(但仍将唤醒信号发送到SoC!)
然后,我进行了第二个实验:我使用仅具有两个引脚而不是四个引脚的USB充电器连接了手机。(仅供电;差分引脚(信号引脚)已断开)。结果:我的手机正在充电!似乎当SoC挂起时,它会向USB外设发送信号,告诉它们不要消耗功率。我对么?如何配置AOSP树和Linux内核以及uboot引导加载程序以避免发生这种情况?请指导我如何在内核或堆栈的其他部分修复它!
编辑3:
我已经在这里粘贴了内核配置。我将这些选项配置为y但没有效果:
CONFIG_PM_RUNTIME=y
CONFIG_PM_AUTOSLEEP=y
CONFIG_PM_DEBUG=y
CONFIG_USB_OTG_WAKELOCK=y
CONFIG_USB_DEBUG=y
CONFIG_USB_OTG=y
Run Code Online (Sandbox Code Playgroud)
另外,此链接是我的设备树文件。(在内核中。不是 uboot)
linux-kernel wake-on-lan android-source android-wake-lock wakelock
Android的AlarmManager Javadoc说明
When an alarm goes off, the Intent that had been registered for it is broadcast by the system,
AlarmServiceAndroid提供的API演示中有一个(包com.example.android.apis.app),它演示了正在使用的AlarmService.
在其中我们有以下内容(为清晰起见编辑):
PendingIntent mAlarmSender = PendingIntent.getService(AlarmService.this,
0, new Intent(AlarmService.this, AlarmService_Service.class), 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 30*1000, mAlarmSender);
Run Code Online (Sandbox Code Playgroud)
因此,在这个例子中,它不会执行,PendingIntent mAlarmSender = PendingIntent.getBroadcast(...);而是执行getServiceJavadoc从未提及的内容.
我问这个的原因是因为CPU唤醒锁的影响.Javadoc表示,一旦广播接收器onReceive()返回,AlarmManger的唤醒锁将被释放.
我想知道的是,如果您使用示例中的警报,唤醒锁定的含义是什么?Javadoc似乎没有解决这个问题.如果有什么似乎暗示你必须在设置警报时使用广播技术.