update nougat juego descargar caracteristicas android android-7.0-nougat android-security android-7.1-nougat

android - nougat - Acepta programáticamente la llamada en turrón



android nougat juego (4)

Desde un año, he estado trabajando sobre el producto IOT y la solicitud adjunta funcionaba bien. Ahora no puedo aceptar llamadas programáticamente en versiones superiores de Android. La característica es muy importante para el producto. Cualquier ayuda es muy apreciada.

Antes de la actualización del parche de seguridad de noviembre de 2016 , Runtime.getRunTime.exec("Command") funcionaba bien para aceptar la llamada programáticamente.

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

Cómo hacerlo posible en la versión de Android Nougat.

Buscando cualquier tipo de hack.

He abierto un hilo para las mejoras.

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

Nota * Si alguno de ustedes se enfrenta al mismo problema, solicite al Android Dev Team que participe y proporcione la autorización necesaria para que el usuario obtenga permiso en tiempo de ejecución. Siga la dirección URL mencionada anteriormente para solicitar.


Como también estoy trabajando en el producto IOT, este fue uno de los mayores problemas que enfrenté, pero después de algunas Investigaciones, creo que he encontrado alguna solución para este problema, o puede decir un simple truco. He probado este truco en varios dispositivos con varias versiones y descubrí que la mayoría de los dispositivos están respondiendo. Solo los dispositivos Samsung no responden, algunos dispositivos Huawei y algunos dispositivos Oppo tampoco responden (todavía estoy buscando algo para estos dispositivos).

Me di cuenta de que Android proporciona una característica de acceso a notificaciones. Puede usar NotificationListenerService para leer notificaciones y realizar algunas acciones sobre ellas. Proporciona algunos métodos de anulación:

onNotificationPosted() onNotificationRemoved() getActiveNotifications()

... etc

Aquí hay un código: Crear un servicio que amplíe NotificationListenerService

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

En AndroidMenifest, agregue este servicio como:

<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>

Esto permitirá que su aplicación lea cualquier notificación recibida.

Ahora, aquí está el código principal:

En onNotificationPosted (StatusBarNotification sbn) agregue este código:

@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(); } }

¡Eso es!

Todo está configurado, ejecute la aplicación y los dispositivos, excepto Samsung, lo que muestre una notificación para Llamada entrante, con los botones Responder y Rechazar / Rechazar acción, le permitirá responder una llamada.

Para abrir la Configuración de acceso de notificación y permitir que su aplicación lea la notificación, use:

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

Simplemente crea un POC para esto y hazme saber cómo funciona.

Por favor, marque mi respuesta si esto ayuda.

Además, si pudiera proporcionar alguna solución para lo mismo con respecto a los dispositivos Samsung, actualice.

Gracias


De acuerdo con la respuesta de " Vishal Sharma ", podemos obtener el título del botón de acción dinámicamente, para apoyar otros idiomas:

@Override public void onNotificationPosted(StatusBarNotification sbn) { try { if (sbn.getNotification().actions != null) { Notification.Action[] notificationAction=sbn.getNotification().actions; //Log.e(G.TAG, "" +notificationAction + " =>"+notificationAction.length); String rejectTitle=""+notificationAction[0].title; String acceptTitle=""+notificationAction[1].title; for (Notification.Action action : notificationAction){ if (action.title.toString().equalsIgnoreCase(acceptTitle)) { PendingIntent intent = action.actionIntent; try { intent.send(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } } } } catch (Exception e) { e.printStackTrace(); } }


Es una especie de hack, puede utilizar el servicio de accesibilidad para recibir llamadas. Para habilitar el servicio de accesibilidad, debe habilitar su servicio en Configuración - Accesibilidad - Su servicio.

Primero, agregue typeWindowContentChanged a 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" />

Y haga algo con el evento o el "texto mostrado" o la "descripción del contenido".

@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); } }

Sí, sé que esta no es una forma elegante de resolver su problema. Es una especie de hack.


Para contestar una llamada usando un botón, establezca un indicador cada vez que se detecte una llamada entrante:

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

Ahora, crea una lista en tu clase NSLogService,

static ArrayList<StatusBarNotification> statusBarNotifications;

y en su onNotificationPosted () agregue StatusBarNotification a una lista,

@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>(); }

En su pantalla de inicio, al hacer clic en el botón, llame a performNotificationOperation(NLService.getAllNotifications());

Aquí hay una definición para este método:

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(); } }