Saturday, December 29, 2018

Đưa activity ra ngoài màn hình khóa.



Ta muốn ứng dụng của mình hiện một view, chữ hoặc ảnh lên trên màn hình khóa, và làm sao để sau khi mở khóa nó mất đi. Nếu người dùng không để chế độ khóa thì view đó sẽ không hiển thị. Ta dùng Broadcast để lắng nghe các action của người dùng.
Hãy tạo một service bất kỳ, khai báo vào file Manifest.
  <service
   android:name=".myservice"
   android:enabled="true"
   android:exported="false" />
Khai báo trên đầu service.
private WindowManager wm;
WindowManager.LayoutParams myParams;
TextView mView;
int dem=0;
static IntentFilter s_intentFilter = new IntentFilter();
 static {
s_intentFilter.addAction(Intent.ACTION_SCREEN_ON);
s_intentFilter.addAction(Intent.ACTION_USER_PRESENT);
}
Copy vào trong onCreate()
registerReceiver(ti, s_intentFilter);
mView = new TextView(this);
         mView.setText(" Đây là chữ ví dụ ");
         mView.setTextColor(Color.parseColor("#ffffff"));
         mView.setGravity(Gravity.CENTER);
         mView.setTextSize((float) 13.7);
         mView.setTypeface(null, Typeface.BOLD);
         wm = (WindowManager) getSystemService(WINDOW_SERVICE);
myParams = new WindowManager.LayoutParams(
 LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE     
                /* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
PixelFormat.RGBA_8888);
myParams.gravity = Gravity.TOP | Gravity.CENTER_VERTICAL;
myParams.x = 0;
myParams.y = 50;
myParams.setTitle("Load Average");
Copy hàm ti ra ngoài onCreate()
private final BroadcastReceiver ti = new BroadcastReceiver() {
     @Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
  KeyguardManager myKM = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
     if(action.equals(Intent.ACTION_USER_PRESENT)  ){
          if (dem==1){
              wm.removeView(mView);
              dem=0;
          } 
     }
if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
      if( myKM.inKeyguardRestrictedInputMode())
      {
       if ( dem==0){
         wm.addView(mView, myParams);
         dem=1;
              }
         }
     }
     }
     };
Thêm quyền vào file Manifest.
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
Thêm đoạn sau để hủy.
@Override
    protected void onDestroy() {
         unregisterReceiver(ti);
         super.onDestroy();
    }
Tại class Main để bật service ta dùng đoạn này.
Intent intent = new Intent(this, myservice.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startService(intent);
Chạy thử để thấy dòng chữ chỉ hiện khi màn hình có khóa, vuốt khóa mở vào thì chữ biến mất.

No comments:

Post a Comment