以编程方式接受牛轧糖的电话

从一年以来,我一直在研究物联网产品,所附的应用程序工作正常。 现在我无法接受更高版本的android编程调用。 function对产品非常重要。 任何帮助,高度赞赏。

2016年11月安全修补程序更新之前, Runtime.getRunTime.exec("Command")正常工作,以编程方式接受调用。

 Runtime.getRuntime().exec("input keyevent " +Integer.toString(KeyEvent.KEYCODE_HEADSETHOOK)); 

如何使它成为可能在Android的牛轧糖版本。

寻找任何forms的黑客。

我已经打开了一个线程的增强。

https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened&groupby=&sort=&id=231938

注意*如果您有任何一个人面临同样的问题,请向Android Dev Team申请进入,并提供规定以获得用户的运行时权限。 按照上面提到的URL请求。

Solutions Collecting From Web of "以编程方式接受牛轧糖的电话"

由于我也在研究物联网产品,这是我遇到的最大的问题之一,但经过一番研究,我想我已经find了解决这个问题的一些解决scheme,或者你可以说一个简单的黑客攻击。 我在几个版本的设备上testing了这个黑客攻击,发现大部分设备都在响应。 只有三星设备没有响应,一些华为设备和一些OPPO设备也没有响应(我仍然在寻找这些设备的东西)。

我注意到Android提供了访问通知的一个function。 您可以使用NotificationListenerService读取通知并对其执行一些操作。 它提供了一些覆盖方法:

  onNotificationPosted() onNotificationRemoved() getActiveNotifications() 

…等

这是一个代码:创build一个扩展NotificationListenerService的服务

  class NLService extends NotificationListenerService { @Override public void onNotificationPosted(StatusBarNotification sbn) { .... } @Override public void onNotificationRemoved(StatusBarNotification sbn) { .... } 

在AndroidMenifest中,将此服务添加为:

  <service android:name=".NLService" android:label="@string/app_name" android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"> <intent-filter> <action android:name="android.service.notification.NotificationListenerService" /> </intent-filter> </service> 

这将允许您的应用程序读取收到的任何通知。

现在,这里是主要的代码:

在onNotificationPosted(StatusBarNotification sbn)添加此代码:

  @Override public void onNotificationPosted(StatusBarNotification sbn) { try { if (sbn.getNotification().actions != null) { for (Notification.Action action : sbn.getNotification().actions) { Log.e(TAG, "" + action.title); if (action.title.toString().equalsIgnoreCase("Answer")) { Log.e(TAG, "" + true); PendingIntent intent = action.actionIntent; try { intent.send(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } } } } catch (Exception e) { e.printStackTrace(); } } 

而已!

全部设置,运行应用程序和三星以外的设备(通过应答和拒绝/拒绝操作button显示来电通知)将允许您接听电话。

要打开“通知访问设置”并允许应用程序读取通知,请使用:

  Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"); startActivity(intent); 

只需创build一个POC,让我知道它是如何工作的。

请标记我的答案,如果这有帮助。

此外,如果您可以针对三星设备提供相同的解决scheme,请更新。

谢谢

使用button接听电话时,每当检测到来电时设置一个标志:

  if(state==TelephonyManager.CALL_STATE_RINGING){ shouldAnswerCallViaNotification = true; } else { shouldAnswerCallViaNotification = false; } 

现在,在NSLogService类中创build一个列表,

 static ArrayList<StatusBarNotification> statusBarNotifications; 

并在你的onNotificationPosted()将StatusBarNotification添加到列表中,

  @Override public void onNotificationPosted(StatusBarNotification sbn) { if (HomeScreen.shouldAnswerCallViaNotification) { if (statusBarNotifications == null) { updateNotificationList(); } statusBarNotifications.add(sbn); } else { updateNotificationList(); } } public static ArrayList<StatusBarNotification> getAllNotifications() { return statusBarNotifications; } public static void updateNotificationList() { if (statusBarNotifications != null) statusBarNotifications = null; statusBarNotifications = new ArrayList<StatusBarNotification>(); } 

在HomeScreen中点击button,调用performNotificationOperation(NLService.getAllNotifications());

这里是这个方法的定义:

  private void performNotificationOperation(ArrayList<StatusBarNotification> activeNotifications) { if (activeNotifications.size()> 0) { main_Loop: for (StatusBarNotification notification : activeNotifications) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { if (notification.getNotification().actions != null) { for (Notification.Action action : notification.getNotification().actions) { // Log.e(TAG, "" + action); Log.e(TAG, "" + action.title); if (action.title.toString().equalsIgnoreCase("Answer")) { Log.e(TAG, "" + true); PendingIntent intent = action.actionIntent; try { intent.send(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } break main_Loop; } } } } } catch (Exception e) { e.printStackTrace(); } } } try { NLService.updateNotificationList(); } catch (Exception e) { e.printStackTrace(); } } 

这是一种破解,你可以使用无障碍服务来接听电话。 要启用辅助function服务,您必须在设置 – 辅助function – 您的服务上启用您的服务。

首先,将typeWindowContentChanged添加到accessibilityEventTypes。

 <accessibility-service android:accessibilityEventTypes="typeViewClicked|typeViewFocused|typeViewScrolled|typeWindowContentChanged|typeWindowStateChanged" android:packageNames="com.example.android.myFirstApp, com.example.android.mySecondApp" android:accessibilityFeedbackType="feedbackSpoken" android:notificationTimeout="100" android:settingsActivity="com.example.android.apis.accessibility.TestBackActivity" android:canRetrieveWindowContent="true" /> 

和事件或“显示的文字”或“内容描述”做一些事情。

 @Override public void onAccessibilityEvent(AccessibilityEvent event) { // Do something with Click or Focused event final int eventType = event.getEventType(); String eventText = null; switch(eventType) { case AccessibilityEvent.TYPE_VIEW_CLICKED: eventText = "Focused: "; break; case AccessibilityEvent.TYPE_VIEW_FOCUSED: eventText = "Focused: "; break; } eventText = eventText + event.getContentDescription(); // Traverse all items in screen. // Do something with text. AccessibilityNodeInfo info = getRootInActiveWindow(); int index; int count = info.getChildCount(); AccessibilityNodeInfo child; for (index = 0; index < count; index++) { child = info.getChild(index); if (child.getText() != null) Log.d(TAG, "text: " + child.getText().toString() + " " + child.getContentDescription()); // perform Click //if (child.isClickable()); //child.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } 

是的,我知道这不是解决您的问题的优雅方式。 这是一种破解。