2012-10-23 36 views
5

Tôi đang định vị thanh điều hướng tùy chỉnh cho Android 4.0.3.r1 và muốn gửi các sự kiện chính như "Trang chủ" và "Quay lại". Ứng dụng của tôi không phải là một hệ thống do đó:Tôi làm cách nào để gửi các sự kiện chính trong Android?

IWindowManager mWindowManager = IWindowManager.Stub.asInterface(
       ServiceManager.getService(Context.WINDOW_SERVICE)); 
mWindowManager.injectKeyEvent(ev, false); 

Nó không hoạt động, vì tôi không thể nhận được android.permission.INJECT_EVENTS từ ứng dụng không phải hệ thống. Tôi có thể làm cái này như thế nào?

+2

Có người thay đổi nội dung câu hỏi của tôi từ "Làm thế nào tôi có thể gửi các sự kiện quan trọng trong android?" tới "Làm thế nào tôi có thể xử lý các sự kiện quan trọng trong Android?" Vì vậy, tôi muốn biết làm thế nào tôi có thể gửi ** sự kiện quan trọng. –

Trả lời

0

Ngoài ra còn có chức năng sendKeyEvent của InputConnection. InputConnection chỉ API Cấp 3.

3
BaseInputConnection mInputConnection = new BaseInputConnection(targetView, true); 
mInputConnection.sendKeyEvent(new KeyEvent(...)); 
+0

Xin chào, cái mà targetView trong trường hợp này sẽ là gì và cách giải nén nó nếu người dùng ở trên màn hình chính. Cảm ơn – user2430771

+0

'targerView' là gì? ... –

+0

@ th3pat3l Tôi đoán đó là chế độ xem mục tiêu ... – Virus721

-1

Nó làm việc cho tôi:

public static void simulateKey(final int KeyCode) { 

    new Thread() { 
     @Override 
     public void run() { 
      try { 
       Instrumentation inst = new Instrumentation(); 
       inst.sendKeyDownUpSync(KeyCode); 
      } catch (Exception e) { 
       Log.e("Exception when sendKeyDownUpSync", e.toString()); 
      } 
     } 

    }.start(); 
} 
+1

Khi tôi sử dụng các phương pháp này, nó cho tôi lỗi về quyền INJECT_EVENTS. Vì vậy, tôi làm theo bài đăng này: http://stackoverflow.com/questions/5383401/android-inject-events-permission?rq=1. Khi tôi bao gồm sự cho phép android.permission.INJECT_EVENTS trong tệp kê khai, sau đó nó ném một lỗi cho phép được cấp cho các ứng dụng hệ thống. Làm thế nào tôi có thể bao gồm sự cho phép này?Cảm ơn – user2430771

2

bạn thể thử loại này

try 
{ 
    String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MENU; 
    Runtime runtime = Runtime.getRuntime(); 
    Process proc = runtime.exec(keyCommand); 
} 
catch (IOException e) 
{ 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

tất nhiên, bạn có thể chọn chỉ huy input text ... cho vào một văn bản.

+0

Xin chào, tôi đã thử sử dụng tính năng này để triển khai nút quay lại nhưng nó không hoạt động. Tôi đang xây dựng cho Android 4.4.3. Tôi đã tìm kiếm rất nhiều trong một tuần nhưng không thành công cho đến nay. Cảm ơn – user2430771

+2

nếu bạn sử dụng phương pháp này, bạn cần có quyền ưu tiên gốc – Huiyu

+1

Điều này yêu cầu vấn đề với gốc là Runtime.getRuntime(). Exec (new String [] {"su", "-c", "keyevent đầu vào" + KeyEvent. KEYCODE}); – UdayaLakmal

0

Làm sống lại chủ đề cũ - Bạn có thể thực hiện Home và Back với các API Khả năng tiếp cận tương đối mới - Kiểm tra "performGlobalAction" ở đây: http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

(Cụ thể với GLOBAL_ACTION_HOME và GLOBAL_ACTION_BACK hành động)

Tất nhiên bạn sẽ cần quyền thích hợp cho Dịch vụ trợ năng nhưng điều này không yêu cầu root

+0

Tôi không muốn nghe sự kiện, tôi muốn gửi sự kiện (phím quay lại), cách thực hiện điều đó bằng mã bằng cách sử dụng AccessibilityService? –

0

Bạn có thể thử điều này.

long now = SystemClock.uptimeMillis(); 
BaseInputConnection mInputConnection = new BaseInputConnection(findViewById(R.id.MainActivity), true); 
KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HOME, 0); 
mInputConnection.sendKeyEvent(down); 

Mã này có thể hoạt động đối với tôi.

Lưu ý: Hãy nhớ thay thế "R.id.MainActivity" thành tên Hoạt động của bạn.

0

Không có điều nào trong số này hợp lệ. Để chuyển đến Màn hình chính, hãy sử dụng mã bên dưới.

Intent home = new Intent(Intent.ACTION_MAIN); 
home.addCategory(Intent.CATEGORY_HOME); 
//home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(home); 

Nếu bạn không gọi từ hoạt động/đoạn bạn có thể phải bỏ ghi chú phần lá cờ. Để quay lại, mã hoạt động trên một số thiết bị.

dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); 
dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); 

Hãy cho tôi biết nếu điều này có ích!

1

Dưới đây là một số chính xác để Roman câu trả lời

BaseInputConnection mInputConnection = new BaseInputConnection(findViewById(R.id.main_content), true); 
KeyEvent kd = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MENU); 
KeyEvent ku = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MENU); 
mInputConnection.sendKeyEvent(kd); 
mInputConnection.sendKeyEvent(ku); 
Các vấn đề liên quan