安卓ICS原生锁屏

6
我已经在SW、谷歌等网站上寻找了过去2天。我正在寻找一种实现原生Android ICS锁屏活动的方法,如下图所示。 这些屏幕来自Player Pro,但我注意到其他播放器(例如PlayerPro)也具有完全相同的功能,因此我认为这是一种本地或至少有一种常见的实现方式。
到目前为止,我只能使用以下标志获取并替换锁屏的Activity:
  • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
  • WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
在这些事件上使用BroadCaseReciever:
  • Intent.ACTION_SCREEN_ON
  • Intent.ACTION_SCREEN_OFF
  • Intent.ACTION_USER_PRESENT
我的问题是,我希望我的活动在锁屏界面上显示而不是替换它。你们知道如何实现这个吗?
是否有原生的隐藏API可以做到这一点?
你们能链接一些实现这个特定功能的示例给我吗?
提前感谢;)

enter image description here enter image description here enter image description here


请查看此帖子:http://stackoverflow.com/questions/4065201/android-how-can-i-programmatically-draw-text-on-key-guard-screen-lock-screen但是,也许自从4.0版本以后有可能了,否则Player Pro使用自己的API。 - Guillaume
“它自己的API”是什么意思?顺便说一下,其他播放器也有同样的功能(例如PowerAmp),所以我猜这不是由PlayerPro团队开发的。 - Mario Lenci
也许是使用show when locked标志的对话框片段吗?编辑:还有一个FLAG_SPLIT_TOUCH,如果窗口上有该标志,则允许将触摸传输到该窗口外...看起来这两者的组合可以实现这一点。 - Drake Clarris
好的,我已经尝试过了,但无法使其工作,因为我无法从BroadCastReciever中显示对话框,它会出现这个错误“BadTockenException:无法添加窗口--令牌为空不是应用程序”。你知道如何检索锁屏令牌吗?那将是解决方案。 - Mario Lenci
我也尝试在我的对话框样式活动中使用FLAG_SPLIT_TOUCH,但仍然不起作用,因为一旦我将"android:windowIsFloating"设置为true,该活动就会在锁屏后显示。而没有它,它不会显示在锁屏的覆盖层上。还有其他想法吗? - Mario Lenci
2个回答

7
我认为您可能在寻找Android 4.0(API级别14)中添加的音频控件“远程视图”(RemoteControlClient) API。我在Android开发者文档中找到了RemoteControlClient API,它可以公开要被遥控器消费的信息,包括元数据、艺术作品和媒体传输控制按钮。
(这个API是从这个页面链接过来的。)
注意:我自己从未使用过这个API,如果无法使用,请见谅。

+1 这绝对是他正在寻找的,也是他应该用于与锁屏本地集成的东西。 - Kevin Coppock
终于找到了我一直在寻找的答案。加一赞和悬赏奖励。 我知道有一个API,但我找不到它。非常感谢,我很高兴我终于可以实现那个锁屏界面:D。 - Mario Lenci
注意:示例在开发者门户中不再可用。 - radley

1

你做得差不多了。继续使用BroadcastReceiver,这是正确的方法。对于Window,这些是你需要使用的标志:

  • WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
  • WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL

不要使用FLAG_DISMISS_KEYGAURD

这些标志的作用:SHOW_WHEN_LOCKED允许您的活动显示在锁定屏幕的顶部。FLAG_NOT_TOUCH_MODAL允许非活动触摸事件传递到其他活动,即允许用户解锁屏幕。FLAG_DISMISS_KEYGUARD消除了锁定屏幕,因此我们不使用它。

在res/values/styles.xml文件中定义此样式

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="Theme.FloatingTranslucent" parent="android:Theme.Translucent.NoTitleBar">
    <item name="android:windowIsFloating">true</item>
  </style>
</resources>

在你的清单文件中,定义你的活动样式。
<activity android:name=".SampleActivity" android:theme="@style/Theme.FloatingTranslucent">
...
</activity>

这样做可以使您的活动完全透明并且可以“包裹内容”。

现在,您的活动应该位于锁定屏幕的顶部,允许触摸输入到锁定屏幕和您的应用程序,而您的活动不是全屏大小。

干杯。


你已经按照那种方式实现了吗?因为我尝试过,只要我将android:windowIsFloating设置为true,即使我设置了FLAG_SHOW_WHEN_LOCKED,也无法让Activity显示在锁屏界面之上。 - Mario Lenci
我还尝试将TYPE_KEYGUARD_DIALOG作为窗口类型放置,但什么也没改变。 - Mario Lenci
你好 @Zaid-Daghestani,你有没有解决这个问题的办法? http://stackoverflow.com/questions/33466950/creating-a-real-lockscreen-module-for-android - Rafael Ruiz Muñoz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接