【问题标题】:Android Facebook lock screen notificationAndroid Facebook 锁屏通知
【发布时间】:2014-09-15 06:32:17
【问题描述】:

在最新版本的 Android 应用上,Facebook 显示了锁屏通知功能,如下图所示:

有没有人尝试实现这个?

我知道在锁定屏幕上显示 Activity 很简单,但不幸的是它不适用于半透明背景。基本上它可以工作,但在我们的活动下方,我们看到的是启动器屏幕,而不是锁定屏幕(在这种情况下,锁定屏幕也是透明的)。

我现在尝试的是:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

在我的活动中。

我也试过这个例子:https://gist.github.com/daichan4649/5352944

正如我所描述的 - 一切正常,但没有透明度。

根据我的观察 Facebook 使用主题:

@android:style/Theme.Translucent.NoTitleBar

并且没有权限:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

我还注意到锁屏通知需要触摸,因此我们无法通过手势显示来自状态栏的通知。

关于如何在 Android L 发布之前创建这种通知的任何想法。

【问题讨论】:

  • 创建一个带有背景图片(半透明)的活动怎么样?
  • 同样 - 如果我使用半透明样式,我会在我的 Activity 下方看到启动器屏幕,而不是锁定屏幕。如果我不使用半透明,我在图像背景下方有黑色背景(来自窗口)。
  • 我觉得它不可能在 vanilla android 上运行。它专门运行在运行 Android 4.4.2 和 Sense 6 的 HTC One M8 上。refer-techcrunch.com/2014/07/08/…lifehacker.com/…
  • 实现这一点的一种方法是实现自定义锁屏以显示通知。这是市场上许多应用程序正在做的事情。
  • 我认为 Facebook 锁屏通知与设备和锁屏无关。我很确定我附加的屏幕显示的是带有香草 android 的 Nexus 5。我有 HTC M8 并看到相同的通知。

标签: android facebook notifications lockscreen


【解决方案1】:

实际上,ferdy182 曾经/正在做某事。

这是我使用android.permission.SYSTEM_ALERT_WINDOW 得到的结果:

所以,我无法使用 Activity 来执行此操作。它只是行不通。我必须实现一个Service,它使用WindowManager 添加了一个View

一个可能的工作流程是:您的BroadcastReceiver 收到一个广播 => 它启动一个服务 => 服务添加所需的视图。

现在,代码(cmets 解释了一些事情):

public class MyService extends Service {

    View mView;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        // instance of WindowManager
        WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        LayoutInflater mInflater = (LayoutInflater) 
                                      getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // inflate required layout file
        mView = mInflater.inflate(R.layout.abc, null);

        // attach OnClickListener
        mView.findViewById(R.id.some_id).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // you can fire an Intent accordingly - to deal with the click event
                // stop the service - this also removes `mView` from the window
                // because onDestroy() is called - that's where we remove `mView`
                stopSelf();
            }
        });

        // the LayoutParams for `mView`
        // main attraction here is `TYPE_SYSTEM_ERROR`
        // as you noted above, `TYPE_SYSTEM_ALERT` does not work on the lockscreen
        // `TYPE_SYSTEM_OVERLAY` works very well but is focusable - no click events
        // `TYPE_SYSTEM_ERROR` supports all these requirements
        WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, 
            ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, 
                      PixelFormat.RGBA_8888);

        // finally, add the view to window
        mWindowManager.addView(mView, mLayoutParams);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // remove `mView` from the window
        removeViewFromWindow();
    }

    // Removes `mView` from the window
    public void removeNow() {
        if (mView != null) {
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            wm.removeView(mView);
        }
    }
}

最后,将权限添加到应用的清单中:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

【讨论】:

  • @roiberg 是的。我以为把屏幕截图放上来就可以清楚地说明这一点了。
  • @roiberg 啊。对于那个很抱歉。不知道你问的是可点击性。而且点击效果很好。
  • 是的,可点击性是个问题。
  • @Vikram 只需输入权限SYSTEM_ALERT_WINDOW。 GCM 通知可以显示在锁定屏幕上吗?它对我不起作用。请告诉我更多的事情?
【解决方案2】:

我认为它可能使用了与 Messenger 的聊天头像气泡相同的技巧。

基本上你使用这个权限 “android.permission.SYSTEM_ALERT_WINDOW” 在其他应用程序上方显示您的视图。

我自己没试过,但我很确定他们用过这个。

来自文档 “允许应用程序使用 TYPE_SYSTEM_ALERT 类型打开窗口,显示在所有其他应用程序之上。” http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW

【讨论】:

  • 它显示在所有其他应用程序上,但不显示在锁屏顶部。这就是为什么您在锁屏上看不到聊天头的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
相关资源
最近更新 更多