6

Tôi đang tạo tiện ích đơn giản cho quản lý liên hệ, cho phép người dùng quay số và gửi tin nhắn đến người liên hệ mong muốn.Làm cách nào để bắt đầu hoạt động mới từ màn hình khóa?

Nó hoạt động tốt như "tiện ích thông thường", nhưng khi tôi thêm nó làm tiện ích khóa màn hình trên Android 4.2, ứng dụng sms hoặc ứng dụng quay số không bắt đầu. Trên thực tế họ sao, nhưng "đằng sau" lockscreen, do đó người dùng vẫn phải tự mở khóa màn hình để có thể quay số/gửi sms.

Tôi đã tìm kiếm một số giải pháp trên web nhưng không có gì hữu ích. Tôi biết FLAG_DISABLE_KEYGUARD hoặc FLAG_SHOW_WHEN_LOCKED, nhưng vì ứng dụng sms/quay số không phải là "của tôi" nên tôi không biết liệu họ có thiết lập đúng cờ hay không. Như một cách giải quyết, tôi đã cố gắng tạo ra hoạt động của tôi mà thiết lập những lá cờ và sau đó chỉ đơn giản là bắt đầu một mong muốn (quay số hoặc sms), nhưng điều này không giúp đỡ.

Có cách mở khóa màn hình, nhưng điều này liên quan đến việc sử dụng KeyguardManager và KeyguardLock (hoạt động tốt), nhưng nhờ sử dụng KeyguardLock.newKeyguardLock() tôi kết thúc bằng điện thoại không thể tự động khóa, chắc chắn bởi vì tôi không phát hành khóa này (nó gây ra khóa để xuất hiện một lần nữa, đó không phải là những gì tôi muốn).

Thực tế, tiện ích này sẽ hoạt động tương tự như tiện ích con hoặc tiện ích con mặc định trên màn hình khóa?

Vì vậy, câu hỏi của tôi là, cách đạt được điều đó và bắt đầu hoạt động mới từ màn hình khóa?

+0

Hi Filip. Tôi đã tự hỏi về điều tương tự. Tôi khá mới với android. Vì vậy, bạn có thể giúp tôi một chút ở đây? Làm thế nào để bạn đặt trình nghe nhấp chuột vào các nút hoặc chế độ xem trong bố cục tiện ích con? Điều đó có liên quan gì đến phương thức onReceive của Lớp AppWidgetProvider của bạn không? –

+0

Xin chào, Vâng, điều này không rõ ràng và khá phức tạp để giải thích (chưa kể đến việc triển khai nó :)). Tôi đã cho tôi một thời gian để tìm ra điều này. Tóm lại, bạn cần sử dụng các lớp 'PendingIntent' và' RemoteView' để đạt được nó. Cách tốt nhất là xem bên trong [tài liệu] (http://developer.android.com/guide/topics/appwidgets/index.html#implementing_collections). Tóm lại, khi bạn đã định cấu hình chế độ xem của mình qua 'RemoteView', chỉ cần tiêm đối tượng' PendingIntent' vào nó thông qua phương thức 'RemoteView # setOnClickFillInIntent'. –

Trả lời

7

Vâng, tôi tự tìm thấy giải pháp. hóa ra tôi đã đóng :)

Để khởi chạy ứng dụng/hoạt động của bên thứ 3, giải pháp đơn giản nhất là tạo một số hoạt động proxy, sẽ đặt cờ thích hợp trên cửa sổ rồi khởi chạy hoạt động mong muốn và HOÀN THÀNH.

mẫu mã được hiển thị dưới đây:

ý định gọi trong widget (gọi proxy):

@Override 
public void onReceive(Context context, Intent intent) { 
    Utilities.printLog(TAG, "onReceive"); 
    Utilities.printLog(TAG, "intent: " + intent); 
    if (intent.getAction().equals(ACTION)) { 

     final String number = intent.getStringExtra(EXTRAS); 
     Toast.makeText(context, "Selected number: " + number, 
       Toast.LENGTH_SHORT) 
       .show(); 


     /** REMOVING KEYGUARD RECEIVER **/ 
     // not really an option - lock is still holded by widget and screen 
     // cannot be locked again ;(
     // KeyguardManager keyguardManager = (KeyguardManager) context 
     // .getSystemService(Context.KEYGUARD_SERVICE); 
     // KeyguardLock lock = keyguardManager 
     // .newKeyguardLock(Context.KEYGUARD_SERVICE); 
     // lock.disableKeyguard(); 

     final Intent activity = new Intent(context, MainActivity.class); 
     activity.putExtras(intent.getExtras()); 
     activity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     activity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
     activity.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
     context.startActivity(activity); 
    } 

    super.onReceive(context, intent); 
} 

trong hoạt động ủy quyền chỉ cần gọi:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    // getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 

    final Intent callingIntent = getIntent(); 

    final String actionToLaunch = callingIntent.getStringExtra(ContactsStackWidgetProvider.ACTION); 
    final String number = callingIntent.getStringExtra(ContactsStackWidgetProvider.EXTRAS); 

    final Intent activity = new Intent(); 
    if (actionToLaunch.equals(Intent.ACTION_DIAL)) { 
     activity.setAction(Intent.ACTION_DIAL); 
     activity.setData(Uri.parse("tel:"+number)); 
    } else if (actionToLaunch.equals(Intent.ACTION_SENDTO)) { 
     activity.setAction(Intent.ACTION_SENDTO); 
     activity.setData(Uri.parse("sms:"+number)); 
    } else { 
     throw new IllegalArgumentException("Unrecognized action: " 
       + actionToLaunch); 
    } 

    new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() { 
      startActivity(activity); 
      finish();//it is important to finish, but after a small delay 
     } 
    }, 50L); 


} 
+0

Hai xu của tôi: Thay vì sử dụng một trình xử lý, bạn có thể gọi 'startActivity()' và 'finish()' trong 'onWindowsFocusChanged (pHasFocus)' khi 'pHasFocus' là đúng. – mamuso