בקשת מידע | אפליקצייה לעצירת שמע בשיחה - על ידי נגיעה באוזניה
-
ניסיתי במשך כמה זמן - (היום, לא מידי הרבה זמן...) ליצור אפליקצייה שתגרום לכך שבעת נגיעה באוזניה - ילחץ מקש השמע בפלאפון - זה שימושי מאוד למי ששומע שיחות/שיעורים/וכו'... בפלאפון, ותוכ"ד שיחה מישהו מדבר איתך, במקום להוציא את המכשיר, ללחוץ חמש, להחזיר לכיס, לגמור לדבר איתו, להוציא שוב, ללחוץ חמש, ולהכניס שוב לכיס - פשוט נוגעים באוזניה - וכמו בשמיעת מוזיקה - זה נעצר, נוגעים שוב - והשיחה ממשיכה.
כמה פשוט ככה גאוני.אממ'ה שאחרי 20 בדיקות שעשיתי, לא הצלחתי להגיע למשהו ממשי שעובד לי תוכ"ד שיחה - במכשיר בלי נגישות אבל עם רוט (אנדרואיד 4.4 = שיאומי קין)
מעלה את הגיטאב של זה - עם פירוט בספויילר מה נוסה עד כהאשמח מאוד אם מישהו יקח את זה לתשומת ליבו...
מאמין שמלא אנשים יודו לו!@חייא-שיאומי @בנימין-מחשבים ???
מאגר הגיטאב:
https://github.com/YairDaniel11/headset-press5סיכום הנסיונות:
מה נוסה, מה עבד ומה נכשל
מסמך סיכום לכל מי שרוצה להמשיך את הפרויקט. הוא מבדיל בין מה שנראה ביומנים שנאספו
על מכשיר אמיתי, מה שנקרא בקוד המקור של אנדרואיד (לא נבדק על המכשיר), והשערות.המטרה
אפליקציה קטנה שרצה ברקע (גם באנדרואיד 4.4), ובזמן שיחה, כשנוגעים באוזניית בלוטוס
(נגיעה אחת או כפולה, לפי הגדרה), מקישה את הספרה 5 לתוך השיחה. שימושי בקווי תוכן
שמושהים וממשיכים בהקשת 5.סביבת הבדיקה
- Xiaomi Qin S1+ (מכשיר מקשים), אנדרואיד 4.4, root דרך Magisk.
- אוזניית בלוטוס (ברשימת ההתאמות מופיעות soundcore). נגיעה קצרה בשיחה לא עושה כלום
לפי המשתמש; לחיצה ארוכה מנתקת שיחה. - אין במכשיר שירות נגישות שאפשר להפעיל.
- הבנייה: דחיפה ל-GitHub, ו-Actions מצרף APK ל-Release (אין SDK מקומי).
מה עבד (מאומת ביומנים)
- זיהוי שיחה:
PhoneStateListenerמדווחבשיחה/פנויבצורה אמינה. - נגיעה באוזנייה כשאין שיחה (האוזנייה מחוברת, מוזיקה): מגיעה לטלפון בשני מסלולים.
- דרך המערכת:
KEYCODE_MEDIA_PLAY,KEYCODE_MEDIA_PAUSE,KEYCODE_MEDIA_PREVIOUS
(registerMediaButtonEventReceiverב-4.4). - דרך הקלט הגולמי עם root (
getevent -l) :KEY_PLAYCD,KEY_PAUSECD,
KEY_NEXTSONG,KEY_PREVIOUSSONGמההתקןAVRCP(/dev/input/event4).
- דרך המערכת:
- ספירת נגיעות: נגיעה כפולה מגיעה בדרך כלל כ"שיר הבא" (
NEXT), לא כשתי נגיעות נפרדות. הקוד מתרגםNEXTל-2 ו-PREVIOUSל-3. - חיבור האוזנייה חייב להיות פעיל. בלי חיבור מדיה/שיחה אמיתי אין שום אירוע. ביומן
נבדק דרךBluetoothAdapter.getProfileConnectionState.
מה נכשל או לא הוכח
1. קליטת נגיעה באוזנייה בתוך שיחה (הבעיה המרכזית, לא נפתרה)
- בשיחות שבהן
AudioManager.isBluetoothScoOn() == true(הקול עובר דרך האוזנייה), נאספו
עשרות שניות של נגיעות בלי אף אירוע: לא במסלול המערכת ולא בקלט הגולמי של הקרנל.
למשל שיחה של 57 שניות עם לחיצות רבות ביומן ריק. - ההסבר הסביר: במצב שיחה (HFP) האוזנייה מטפלת בנגיעה קצרה בעצמה ולא שולחת לטלפון כלום.
רק לחיצה ארוכה (ניתוק) מגיעה לטלפון. - בשיחה אחת, בגרסה מוקדמת, כן הגיעו
KEYCODE_MEDIA_PLAY(אולי כשהקול לא עבר דרך
האוזנייה). לא נבדק אם הניתוב לרמקול/אוזנייה של הטלפון מחזיר את האירועים. - מסלול המערכת בשיחה: לפי קוד AOSP 4.4 (לפי סוכן מחקר, לא אומת על המכשיר),
PhoneWindowManagerמדכאPLAY/PAUSE/PLAY_PAUSEכשהטלפון לא ב-idle, ולחצני
המדיה בשיחה מנותבים לאפליקציית הטלפון. - אם האוזנייה שולחת
AT+CKPD(HFP), מחסנית הבלוטוס ב-4.4 מנתקת את השיחה ואף
אפליקציה לא רואה אותה.
2. הקשת 5 בתוך השיחה
שיטה תוצאה input keyevent 12(KEYCODE_5) כשאפליקציה אחרת על המסךהמקש הולך לאפליקציה שבפוקוס, לא לשיחה input keyevent 12כשמסך השיחה בפוקוסעבד לפעמים. לפי קוד AOSP 4.4, InCallActivityמקבל ספרה רק כשלוח המקשים שלו גלוי (לא נבדק במכשיר באופן מלא)uiautomator dumpו-input tapעל כפתור 5נכשל בשיחה: ERROR: could not get idle state, אוKilledam start -n com.android.incallui/.InCallActivity -f 0x10020000(+--ez InCallActivity.show_dialpad true) להעלאת מסך השיחההקריס את המחייגן ("אפליקציית חייגן נעצרה") שירות נגישות ( KeypadClickService)נכתב, לא נבדק: אין נגישות במכשיר service call phone 4 i32 1(ITelephony.showCallScreenWithDialpad) ואזinput keyevent 12נבנה (גרסה 1.19). לא נבדק מקצה לקצה, כי בשיחה הנגיעה לא הגיעה (סעיף 1). זהירות: מספר הטרנזקציה נלקח מקוד 4.4 ולא אומת ב-ROM הזה 3. Magisk ו-root
- אם ההרשאה לא נשמרה "לצמיתות", חלון הבקשה (
SuRequestActivity) קופץ באמצע שיחה
ומכסה את המסך. כל קריאתsuגם מקפיצה את ההודעה "הוענקו הרשאות". לכן ההקשה בנויה
כקריאתsuאחת.
רעיונות שלא נוסו
- שליחת DTMF ישירה דרך
IBluetoothHeadsetPhone.sendDtmf(int)של שירות הטלפון (לפי קריאת
קוד AOSP 4.4 על ידי סוכן מחקר, לא נוסה). שולח לחיבור למודם בלי מסך ובלי פוקוס. דורש
הרשאתMODIFY_PHONE_STATE, כלומר אפליקציית מערכת (/system/priv-app) או תהליך root דרך
app_process. בדיקה מקדימה:dumpsys package com.android.phone | grep -i HeadsetPhone. - מחוות ווליום באוזנייה במקום נגיעה: בשיחה פקודות ווליום (
AT+VGS) כן מגיעות לטלפון.
אפשר לזהות אתandroid.media.VOLUME_CHANGED_ACTION, להקיש 5 ולהחזיר את העוצמה.
תלוי בכך שהאוזנייה מאפשרת להגדיר מחווה כזו. נבנה בגרסה 1.21 ולא נבדק. - שירות נגישות עם
onKeyEvent(FLAG_REQUEST_FILTER_KEY_EVENTS) שרואה מקשים לפני
מדיניות המערכת. לא אומת שמקשי AVRCP עוברים בו. - ניתוב קול השיחה לטלפון (לא לאוזנייה) כדי שהאוזנייה תחזור לשלוח AVRCP.
- Xposed / hook ב-
com.android.phone, או להפוך לחייגן ברירת מחדל
(InCallService,Call.playDtmfTone) באנדרואיד 5 ומעלה. - בדיקה של לוגים:
logcat -v time | grep -iE 'ckpd|avrcp|bvra|btif_hf'בזמן נגיעה בשיחה,
כדי לראות אם הבלוטוס מקבל משהו (הקוד מכיל ניסיון לכך בכפתור "אבחון אוזנייה").
מבנה הקוד
CallWatcherService– שירות קדמי, מאזין למצב טלפון.HeadsetPressController– "חימוש" בזמן שיחה, ספירת נגיעות, נעילת סדרה על מסלול אחד.MediaButtonReceiver,MediaSessionHelper– מסלול המערכת.RootInputListener– מסלול הקלט הגולמי (getevent).VolumeGestureWatcher– טריגר מחוות ווליום.Key5Sender– ההקשה (נגישות או root).KeypadClickService– שירות נגישות (לא נבדק).DiagnosticsLog– יומן בתוך האפליקציה. הכפתור "אבחון אוזנייה" מאזין 30 שניות גם בלי שיחה.
מקורות שנאספו (על ידי סוכן מחקר, לא נבדקו אחד-אחד)
HeadsetStateMachine.java(android-4.4_r1): טיפול ב-AT+CKPDבשיחה.PhoneWindowManager.javaו-MediaFocusControl.java(4.4): דיכוי מקשי מדיה בשיחה.InCallActivity.java(4.4): ספרה מתקבלת רק כשלוח המקשים גלוי.BluetoothPhoneService.java(4.4):sendDtmf.
-
ניסיתי במשך כמה זמן - (היום, לא מידי הרבה זמן...) ליצור אפליקצייה שתגרום לכך שבעת נגיעה באוזניה - ילחץ מקש השמע בפלאפון - זה שימושי מאוד למי ששומע שיחות/שיעורים/וכו'... בפלאפון, ותוכ"ד שיחה מישהו מדבר איתך, במקום להוציא את המכשיר, ללחוץ חמש, להחזיר לכיס, לגמור לדבר איתו, להוציא שוב, ללחוץ חמש, ולהכניס שוב לכיס - פשוט נוגעים באוזניה - וכמו בשמיעת מוזיקה - זה נעצר, נוגעים שוב - והשיחה ממשיכה.
כמה פשוט ככה גאוני.אממ'ה שאחרי 20 בדיקות שעשיתי, לא הצלחתי להגיע למשהו ממשי שעובד לי תוכ"ד שיחה - במכשיר בלי נגישות אבל עם רוט (אנדרואיד 4.4 = שיאומי קין)
מעלה את הגיטאב של זה - עם פירוט בספויילר מה נוסה עד כהאשמח מאוד אם מישהו יקח את זה לתשומת ליבו...
מאמין שמלא אנשים יודו לו!@חייא-שיאומי @בנימין-מחשבים ???
מאגר הגיטאב:
https://github.com/YairDaniel11/headset-press5סיכום הנסיונות:
מה נוסה, מה עבד ומה נכשל
מסמך סיכום לכל מי שרוצה להמשיך את הפרויקט. הוא מבדיל בין מה שנראה ביומנים שנאספו
על מכשיר אמיתי, מה שנקרא בקוד המקור של אנדרואיד (לא נבדק על המכשיר), והשערות.המטרה
אפליקציה קטנה שרצה ברקע (גם באנדרואיד 4.4), ובזמן שיחה, כשנוגעים באוזניית בלוטוס
(נגיעה אחת או כפולה, לפי הגדרה), מקישה את הספרה 5 לתוך השיחה. שימושי בקווי תוכן
שמושהים וממשיכים בהקשת 5.סביבת הבדיקה
- Xiaomi Qin S1+ (מכשיר מקשים), אנדרואיד 4.4, root דרך Magisk.
- אוזניית בלוטוס (ברשימת ההתאמות מופיעות soundcore). נגיעה קצרה בשיחה לא עושה כלום
לפי המשתמש; לחיצה ארוכה מנתקת שיחה. - אין במכשיר שירות נגישות שאפשר להפעיל.
- הבנייה: דחיפה ל-GitHub, ו-Actions מצרף APK ל-Release (אין SDK מקומי).
מה עבד (מאומת ביומנים)
- זיהוי שיחה:
PhoneStateListenerמדווחבשיחה/פנויבצורה אמינה. - נגיעה באוזנייה כשאין שיחה (האוזנייה מחוברת, מוזיקה): מגיעה לטלפון בשני מסלולים.
- דרך המערכת:
KEYCODE_MEDIA_PLAY,KEYCODE_MEDIA_PAUSE,KEYCODE_MEDIA_PREVIOUS
(registerMediaButtonEventReceiverב-4.4). - דרך הקלט הגולמי עם root (
getevent -l) :KEY_PLAYCD,KEY_PAUSECD,
KEY_NEXTSONG,KEY_PREVIOUSSONGמההתקןAVRCP(/dev/input/event4).
- דרך המערכת:
- ספירת נגיעות: נגיעה כפולה מגיעה בדרך כלל כ"שיר הבא" (
NEXT), לא כשתי נגיעות נפרדות. הקוד מתרגםNEXTל-2 ו-PREVIOUSל-3. - חיבור האוזנייה חייב להיות פעיל. בלי חיבור מדיה/שיחה אמיתי אין שום אירוע. ביומן
נבדק דרךBluetoothAdapter.getProfileConnectionState.
מה נכשל או לא הוכח
1. קליטת נגיעה באוזנייה בתוך שיחה (הבעיה המרכזית, לא נפתרה)
- בשיחות שבהן
AudioManager.isBluetoothScoOn() == true(הקול עובר דרך האוזנייה), נאספו
עשרות שניות של נגיעות בלי אף אירוע: לא במסלול המערכת ולא בקלט הגולמי של הקרנל.
למשל שיחה של 57 שניות עם לחיצות רבות ביומן ריק. - ההסבר הסביר: במצב שיחה (HFP) האוזנייה מטפלת בנגיעה קצרה בעצמה ולא שולחת לטלפון כלום.
רק לחיצה ארוכה (ניתוק) מגיעה לטלפון. - בשיחה אחת, בגרסה מוקדמת, כן הגיעו
KEYCODE_MEDIA_PLAY(אולי כשהקול לא עבר דרך
האוזנייה). לא נבדק אם הניתוב לרמקול/אוזנייה של הטלפון מחזיר את האירועים. - מסלול המערכת בשיחה: לפי קוד AOSP 4.4 (לפי סוכן מחקר, לא אומת על המכשיר),
PhoneWindowManagerמדכאPLAY/PAUSE/PLAY_PAUSEכשהטלפון לא ב-idle, ולחצני
המדיה בשיחה מנותבים לאפליקציית הטלפון. - אם האוזנייה שולחת
AT+CKPD(HFP), מחסנית הבלוטוס ב-4.4 מנתקת את השיחה ואף
אפליקציה לא רואה אותה.
2. הקשת 5 בתוך השיחה
שיטה תוצאה input keyevent 12(KEYCODE_5) כשאפליקציה אחרת על המסךהמקש הולך לאפליקציה שבפוקוס, לא לשיחה input keyevent 12כשמסך השיחה בפוקוסעבד לפעמים. לפי קוד AOSP 4.4, InCallActivityמקבל ספרה רק כשלוח המקשים שלו גלוי (לא נבדק במכשיר באופן מלא)uiautomator dumpו-input tapעל כפתור 5נכשל בשיחה: ERROR: could not get idle state, אוKilledam start -n com.android.incallui/.InCallActivity -f 0x10020000(+--ez InCallActivity.show_dialpad true) להעלאת מסך השיחההקריס את המחייגן ("אפליקציית חייגן נעצרה") שירות נגישות ( KeypadClickService)נכתב, לא נבדק: אין נגישות במכשיר service call phone 4 i32 1(ITelephony.showCallScreenWithDialpad) ואזinput keyevent 12נבנה (גרסה 1.19). לא נבדק מקצה לקצה, כי בשיחה הנגיעה לא הגיעה (סעיף 1). זהירות: מספר הטרנזקציה נלקח מקוד 4.4 ולא אומת ב-ROM הזה 3. Magisk ו-root
- אם ההרשאה לא נשמרה "לצמיתות", חלון הבקשה (
SuRequestActivity) קופץ באמצע שיחה
ומכסה את המסך. כל קריאתsuגם מקפיצה את ההודעה "הוענקו הרשאות". לכן ההקשה בנויה
כקריאתsuאחת.
רעיונות שלא נוסו
- שליחת DTMF ישירה דרך
IBluetoothHeadsetPhone.sendDtmf(int)של שירות הטלפון (לפי קריאת
קוד AOSP 4.4 על ידי סוכן מחקר, לא נוסה). שולח לחיבור למודם בלי מסך ובלי פוקוס. דורש
הרשאתMODIFY_PHONE_STATE, כלומר אפליקציית מערכת (/system/priv-app) או תהליך root דרך
app_process. בדיקה מקדימה:dumpsys package com.android.phone | grep -i HeadsetPhone. - מחוות ווליום באוזנייה במקום נגיעה: בשיחה פקודות ווליום (
AT+VGS) כן מגיעות לטלפון.
אפשר לזהות אתandroid.media.VOLUME_CHANGED_ACTION, להקיש 5 ולהחזיר את העוצמה.
תלוי בכך שהאוזנייה מאפשרת להגדיר מחווה כזו. נבנה בגרסה 1.21 ולא נבדק. - שירות נגישות עם
onKeyEvent(FLAG_REQUEST_FILTER_KEY_EVENTS) שרואה מקשים לפני
מדיניות המערכת. לא אומת שמקשי AVRCP עוברים בו. - ניתוב קול השיחה לטלפון (לא לאוזנייה) כדי שהאוזנייה תחזור לשלוח AVRCP.
- Xposed / hook ב-
com.android.phone, או להפוך לחייגן ברירת מחדל
(InCallService,Call.playDtmfTone) באנדרואיד 5 ומעלה. - בדיקה של לוגים:
logcat -v time | grep -iE 'ckpd|avrcp|bvra|btif_hf'בזמן נגיעה בשיחה,
כדי לראות אם הבלוטוס מקבל משהו (הקוד מכיל ניסיון לכך בכפתור "אבחון אוזנייה").
מבנה הקוד
CallWatcherService– שירות קדמי, מאזין למצב טלפון.HeadsetPressController– "חימוש" בזמן שיחה, ספירת נגיעות, נעילת סדרה על מסלול אחד.MediaButtonReceiver,MediaSessionHelper– מסלול המערכת.RootInputListener– מסלול הקלט הגולמי (getevent).VolumeGestureWatcher– טריגר מחוות ווליום.Key5Sender– ההקשה (נגישות או root).KeypadClickService– שירות נגישות (לא נבדק).DiagnosticsLog– יומן בתוך האפליקציה. הכפתור "אבחון אוזנייה" מאזין 30 שניות גם בלי שיחה.
מקורות שנאספו (על ידי סוכן מחקר, לא נבדקו אחד-אחד)
HeadsetStateMachine.java(android-4.4_r1): טיפול ב-AT+CKPDבשיחה.PhoneWindowManager.javaו-MediaFocusControl.java(4.4): דיכוי מקשי מדיה בשיחה.InCallActivity.java(4.4): ספרה מתקבלת רק כשלוח המקשים גלוי.BluetoothPhoneService.java(4.4):sendDtmf.
סטאר קיבלת ממני כי זה רעיון חשוב. מעבר לזה אין לי חלק באפליקצייה שלא קשורה לפחות בעקיפין לווינדוס... ;)
-
סטאר קיבלת ממני כי זה רעיון חשוב. מעבר לזה אין לי חלק באפליקצייה שלא קשורה לפחות בעקיפין לווינדוס... ;)
@בנימין-מחשבים אל תדאג נמצא דרך לקשר את זה...
יאללה לך על זה.
עם איזה פלאפון אתה? -
@בנימין-מחשבים אל תדאג נמצא דרך לקשר את זה...
יאללה לך על זה.
עם איזה פלאפון אתה?@יאיר-דניאל חוששני שאאכזב אותך. אני עם מכשיר כשר למהדרין (עד ש @צול-גאה יפרוץ לי אותו...)
אם כי אם השמועות נכונות וQ9 יהיה אנדרואיד - אני קונה אותו ברגע שיצא -
סטאר קיבלת ממני כי זה רעיון חשוב. מעבר לזה אין לי חלק באפליקצייה שלא קשורה לפחות בעקיפין לווינדוס... ;)
@בנימין-מחשבים אם יעשו את מה ש@המפתיע רצה בשרשור של שליחה קלה. יהיה אפשר לעשות תוכנה לוינדוס שתלחץ על 5, הנה גייסתי אותך לשתיהם
-
@יאיר-דניאל חוששני שאאכזב אותך. אני עם מכשיר כשר למהדרין (עד ש @צול-גאה יפרוץ לי אותו...)
אם כי אם השמועות נכונות וQ9 יהיה אנדרואיד - אני קונה אותו ברגע שיצא -
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות
