2014-07-23 37 views
18

Trên phiên bản mới nhất của ứng dụng Android Facebook cho thấy tính năng thông báo trên màn hình khóa, giống như trên ảnh chụp màn hình này:Android Facebook màn hình khóa thông báo

screenshot

Có ai cố gắng để thực hiện điều này?

Tôi biết rằng Việc hiển thị Hoạt động ở trên cùng màn hình khóa thật đơn giản, nhưng rất tiếc Nó không hoạt động với nền mờ. Về cơ bản nó hoạt động nhưng bên dưới hoạt động của chúng ta, chúng ta thấy màn hình phóng, không khóa màn hình (như màn hình khóa trong trường hợp này cũng sẽ trong suốt).

Những gì tôi cố gắng ngay bây giờ là:

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); 

trong Hoạt động của tôi.

Ngoài ra tôi đã cố gắng ví dụ này: https://gist.github.com/daichan4649/5352944

Và như tôi đã mô tả - mọi thứ hoạt động nhưng không có sự minh bạch.

Theo quan sát của tôi Facebook sử dụng theme:

@android:style/Theme.Translucent.NoTitleBar 

và không được phép:

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

Ngoài ra tôi nhận thấy rằng thông báo trên màn hình khóa aquires chạm vì vậy chúng tôi không thể hiển thị thông báo từ statusbar bằng cử chỉ .

Bất kỳ ý tưởng nào về cách tạo loại thông báo đó trước khi phát hành Android L.

+0

Làm thế nào về việc tạo ra một hoạt động với một hình nền (mà là mờ)? –

+0

Giống nhau - nếu tôi sử dụng kiểu mờ, tôi thấy màn hình trình khởi chạy bên dưới Actvity của tôi, chứ không phải màn hình khóa. Nếu tôi không sử dụng mờ, tôi có nền đen (từ cửa sổ) bên dưới nền hình ảnh. –

+0

Tôi cảm thấy nó không khả thi trên Android vanilla..Its đặc biệt chạy trên HTC One M8 chạy Android 4.4.2 với Sense 6. refer-http: //techcrunch.com/2014/07/08/facebook-tests-android-l -style-lock-screen-notifications và http://lifehacker.com/floatify-brings-android-ls-new-notifications-to-any-and-1601708892 –

Trả lời

17

Trên thực tế, ferdy182 là/là vào một cái gì đó.

Đây là những gì tôi đã sử dụng android.permission.SYSTEM_ALERT_WINDOW:

enter image description here

Vì vậy, tôi không thể làm điều này với một Activity. Nó sẽ không hoạt động. Tôi phải triển khai Service đã thêm View bằng cách sử dụng WindowManager.

Một luồng công việc có thể là: một phát sóng được nhận bởi BroadcastReceiver => nó bắt đầu Dịch vụ => Dịch vụ thêm chế độ xem được yêu cầu.

Bây giờ, mã (các ý kiến ​​giải thích một vài điều):

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); 
     } 
    } 
} 

Và cuối cùng, thêm phép manifest của ứng dụng của bạn:

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

Bạn đã kiểm tra mã này chưa? – roiberg

+1

@roiberg Có. Tôi nghĩ việc đưa lên ảnh chụp màn hình sẽ làm rõ điều đó. – Vikram

+0

Cảm ơn người đàn ông !!! Tôi sẽ phê duyệt câu trả lời của bạn sau vài giờ nữa. – roiberg

0

Tôi nghĩ rằng đó có thể là sử dụng cùng một mẹo như Trò chuyện đánh bóng cho Messenger.

Về cơ bản bạn sử dụng quyền này "android.permission.SYSTEM_ALERT_WINDOW" để hiển thị chế độ xem của bạn ở trên các ứng dụng khác.

Tôi đã không cố gắng bản thân mình nhưng tôi khá chắc chắn rằng họ đã sử dụng điều này.

Từ các tài liệu "Cho phép ứng dụng để mở cửa sổ bằng cách sử dụng TYPE_SYSTEM_ALERT loại, thể hiện trên đầu trang của tất cả các ứng dụng khác." http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW

+1

Nó hiển thị trên tất cả các ứng dụng khác nhưng không hiển thị trên màn hình khóa. Đó là lý do tại sao bạn không thể nhìn thấy chatheads trên lockscreen của bạn. –

Các vấn đề liên quan