我正在开发一个应用程序,该应用程序可以打开某些音乐的链接,这些音乐将通过应用程序自动播放。屏幕未锁定时,此功能正常!但是,这在屏幕锁定和休眠时不起作用(它应该通过闹钟激活,音乐应用程序通常在手机休眠时播放音乐没有任何问题)。所以我导入了PowerManager:
import android.os.PowerManager;
在我的公开课中,我有:
private PowerManager.WakeLock mWakeLog;
这段代码:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLog = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "stuff");
mWakeLog.acquire();
然后该链接应该打开并且稍后:
mWakeLog.release();
我通过记录测试警报实际上正在激活此代码,但音乐无法播放。但是,当我解锁手机时,它会立即播放音乐,但这不是我想要的。
现在这很有趣:如果屏幕被锁定但是已经醒来,音乐会播放!
原因我添加了权限:
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
我还尝试过其他一些标志,例如“FULL_WAKE_LOCK”等,我也试过这个。警报正在调用这个类,并在它上面onCreate我得到了这个:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
//some code
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
或
v.setKeepScreenOn(true);
所以似乎主要问题可能是唤醒锁没有打开屏幕,例如“FULL_WAKE_LOCK”。
<小时/> 更新#2.1
所以根据Richard Le Mesurier和galex以及其他网站的建议,我现在正在用WakefulBroadcastReceiver
尝试这一切,但接下来会出现问题:我的接收器无法启动。所以这里是警报获取startet时MainActivity中的代码:
Intent intent = new Intent(MainActivity.this, AlarmReceiverActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, pendingIntent);
在我的AlarmReceiverActivity onCreate中,我正在调用广播
Intent intent = new Intent(AlarmReceiverActivity.this, MyWakefulReceiver.class);
sendBroadcast(intent);
在MyWakefulReceiver中,我得到了这个:
public class MyWakefulReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(MyWakefulReceiver.class.getSimpleName(), "received");
Intent service = new Intent(context, MyIntentService.class);
startWakefulService(context, service);
}
}
不幸的是,它没有记录“收到”:c
现在这是我的服务:
public class MyIntentService extends IntentService {
public MyIntentService() { super("MyIntentService"); }
@Override
protected void onHandleIntent(Intent intent) {
//bla code
Log.d(MyIntentService.class.getSimpleName(), "service");
MyWakefulReceiver.completeWakefulIntent(intent);
}
}
并没有记录“服务”
我当然更新了我的清单:
<service android:name=".MyIntentService" android:enabled="true"></service>
<receiver android:name=".MyWakefulReceiver"></receiver>
答案 0 :(得分:1)
似乎您的wakeLock是活动的一部分,但是当屏幕被锁定时,您的活动会进入暂停模式(至少)。
您需要使用Service播放收音机/音乐,然后将其唤醒以保持设备处于唤醒状态以继续播放。
答案 1 :(得分:0)
我正在开发一个应该打开某些音乐链接的应用程序 这将通过应用程序自动播放。
听起来你正确地获得了WakeLock
。
但是你试图在另一个没有唤醒锁的应用中打开音乐。
您的唤醒锁仅适用于您的应用,不适用于其他应用。你无法控制其他应用程序。
请注意,还有其他(可能更好)的方法可以实现您的目标:
使用Activity
保持屏幕开启:
FLAG_KEEP_SCREEN_ON
标志 使用BroadcastReceiver
从睡眠状态唤醒设备:
WakefulBroadcastReceiver
Intent
并继续在后台工作警报类型应用程序通常还需要通过锁定屏幕显示其活动。即,当手机被锁定时,您可能还想向用户显示您的活动。
这似乎超出了这个问题的范围,但在这篇相关文章中有很多信息:
答案 2 :(得分:0)
好吧,我想,我解决了这个问题。
似乎主要的问题是WakeLock
在唤醒我的手机时没有显示任何活动。我创建了一个活动来显示,但是打开的链接在某种程度上没有重点关注我的活动。但是我甚至不想在第一时间开展这样的活动,所以我写了一个onPause()
方法来finish
活动。谢谢你的帮助:P