2013-08-11 24 views
9

Tôi có biểu tượng nổi ở trên tất cả các hoạt động nhưng khi thiết bị bị khóa, thiết bị sẽ biến mất cho đến khi thiết bị được mở khóa.Hiển thị chế độ xem bằng cách sử dụng trình quản lý cửa sổ trên màn hình khóa

Một ý nghĩa khác, tôi muốn hiển thị chế độ xem (FloatIcon) trên màn hình khóa bằng cách sử dụng trình quản lý cửa sổ từ dịch vụ.

Đây là mã của tôi cho đến thời điểm này.

public class FloatIcon extends Service { 

    private WindowManager windowManager; 
    private ImageView floatIcon; 

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

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

     windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

     floatIcon = new ImageView(this); 
     floatIcon.setImageResource(R.drawable.ic_launcher); 
     floatIcon.setClickable(true); 
     floatIcon.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(getBaseContext(), MainActivity.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       getApplication().startActivity(intent); 
      } 
     }); 

     final WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD 
        + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); 

     params.gravity = Gravity.TOP | Gravity.LEFT; 
     params.x = 0; 
     params.y = 100; 

     windowManager.addView(floatIcon, params); 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (floatIcon != null) 
      windowManager.removeView(floatIcon); 
    } 
} 

Tôi không thể nhận được nội dung nào hữu ích khi tôi google.

+0

Bạn đã giải quyết được sự cố này chưa? Nếu vậy, bạn có thể vui lòng cho tôi biết làm thế nào bạn thực hiện nó? – TahaYusuf

Trả lời

8

Sử dụng WindowManager.LayoutParams.TYPE_SYSTEM_ERROR thay vì WindowManager.LayoutParams.TYPE_PHONE để khắc phục sự cố. Điều này sẽ làm cho chế độ xem có thể nghe các sự kiện chạm. Tuy nhiên bạn có thể sử dụng WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY cũng nhưng nó sẽ không nghe chạm vào các sự kiện

+0

Bạn có thể giải thích cách giải quyết vấn đề này không? – Kmeixner

+0

@Kmeixner Nếu bạn sử dụng SYSTER_ERROR làm kiểu tham số windowmanager, nó sẽ làm cho khung nhìn được thêm vào với các tham số đó xuất hiện trong màn hình khóa và tất cả các màn hình khác với tất cả các sự kiện cảm ứng hoạt động, tuy nhiên bạn cũng có thể sử dụng SYSTEM_OVERLAY để làm cho khung nhìn xuất hiện trong tất cả các màn hình bao gồm lockscreen nhưng nó sẽ không có bất kỳ sự kiện cảm ứng –

+0

Mặc dù điều này không hoạt động trên hầu như tất cả các thiết bị, tiếc là tôi đã thử nghiệm trên Samsung S3, nơi nó không hoạt động. Màn hình cuộc gọi đến và màn hình khóa cả hai chồng lên Chế độ xem tôi đã thêm vào WindowManager. – milosmns

5

mặc dù câu hỏi được trả lời, một số giải thích: - sử dụng cửa sổ TYPE_PHONE với FLAG_SHOW_WHEN_LOCKED sẽ chỉ hiển thị trên màn hình khóa nếu đó cửa sổ là toàn màn hình -visit android reference, trong khi sử dụng TYPE_SYSTEM_ERROR loại cửa sổ không có giới hạn toàn màn hình, do đó giải quyết được sự cố.

và theo yêu cầu của @milosmns, giải pháp cho việc này có thể là thêm thời gian trễ nói khoảng 100 mili giây, mã của bạn hiển thị cửa sổ trên màn hình cuộc gọi đến sẽ hoạt động như một nét duyên dáng.

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