BCR เป็นแอปบันทึกการโทรของ Android ที่เรียบง่ายสำหรับอุปกรณ์ที่รูทหรืออุปกรณ์ที่ใช้เฟิร์มแวร์ที่กำหนดเอง เมื่อเปิดใช้งานแล้ว ระบบจะไม่เกะกะและบันทึกสายเรียกเข้าและโทรออกโดยอัตโนมัติในเบื้องหลัง
ตามชื่อพาดพิงถึง BCR ตั้งใจที่จะเป็นพื้นฐานที่สุด โครงการนี้จะประสบความสำเร็จตามเป้าหมายหากจำเป็นต้องมีการอัปเดตเพียงอย่างเดียวเพื่อให้เข้ากันได้กับ Android เวอร์ชันใหม่ ดังนั้น คุณสมบัติที่อาจเป็นประโยชน์หลายประการจะไม่ถูกนำมาใช้ เช่น:
VOICE_CALL
(เช่น การใช้ไมโครโฟน + สปีกเกอร์โฟน)ดาวน์โหลดเวอร์ชันล่าสุดจากหน้าเผยแพร่ หากต้องการตรวจสอบลายเซ็นดิจิทัล โปรดดูส่วนการตรวจสอบลายเซ็นดิจิทัล
ติดตั้ง BCR เป็นแอประบบ
สำหรับอุปกรณ์ที่รูทด้วย Magisk/KernelSU เพียงแฟลชไฟล์ zip เป็นโมดูล Magisk/KernelSU จากภายในแอปพลิเคชันที่เกี่ยวข้อง
.apk
ออกจากไฟล์ zip และติดตั้งด้วยตนเองก่อนที่จะรีบูต นี่เป็นสิ่งจำเป็นเพื่อแก้ไขจุดบกพร่องในเฟิร์มแวร์ที่ไม่ได้สร้างไดเร็กทอรีข้อมูลแอป ทำให้ BCR เปิดขึ้นมาเป็นหน้าจอว่างเปล่าสำหรับเฟิร์มแวร์แบบกำหนดเองที่ไม่ได้รูท ให้แฟลชไฟล์ zip ขณะบู๊ตเข้าสู่การกู้คืน
READ_CALL_LOG
นั้นถูกจำกัดอย่างหนักใน Android 10+ ซึ่งทำให้ไม่สามารถให้สิทธิ์ได้ แม้จะผ่านการตั้งค่าของ Android ก็ตาม หากต้องการลบข้อจำกัดนี้ ให้เรียกใช้ผ่าน adb หลังจากรีบูตกลับเข้าสู่ Android: # If rooted, run inside of `su`:
CLASSPATH=/system/priv-app/com.chiller3.bcr/app-release.apk app_process / com.chiller3.bcr.standalone.RemoveHardRestrictionsKt
# If unrooted, install BCR as both a user app and a system app:
pm install /system/priv-app/com.chiller3.bcr/app-release.apk
system
ของเฟิร์มแวร์แบบกำหนดเองถูกฟอร์แมตด้วย erofs
ระบบไฟล์จะเป็นแบบอ่านอย่างเดียวและไม่สามารถใช้วิธีนี้ได้system/
โฟลเดอร์ใน zip ด้วยตนเองจะทำงานได้เช่นกัน ตราบใดที่ไฟล์นั้นมีสิทธิ์ 644
และป้ายกำกับ u:object_r:system_file:s0
SELinuxรีบูตและเปิด BCR
หากมีการติดตั้งเครื่องบันทึกการโทรอื่นๆ ไว้ ตรวจสอบให้แน่ใจว่าได้ปิดใช้งานฟังก์ชันการบันทึกการโทรแล้ว ในอุปกรณ์ส่วนใหญ่ ไม่สามารถบันทึกการโทรด้วยสองแอปพร้อมกันได้ อย่างไรก็ตาม เป็นเรื่องปกติที่จะมี BCR บันทึกการโทรและบันทึกแอปอื่น เช่น โทรแบบวีโอไอพี
เปิดใช้งานการบันทึกการโทรและเลือกไดเร็กทอรีเอาต์พุต
หากไม่มีการเลือกไดเร็กทอรีเอาต์พุตหรือหากไม่สามารถเข้าถึงไดเร็กทอรีเอาต์พุตอีกต่อไป การบันทึกจะถูกบันทึกลงใน /sdcard/Android/data/com.chiller3.bcr/files
โปรดทราบว่าใน Android 12+ นั้น /sdcard/Android/data/
สามารถเข้าถึงได้ผ่าน USB หรือ DocumentsUI เท่านั้น (ตัวจัดการไฟล์ในตัวของ AOSP)
เมื่อเปิดใช้งานการบันทึกการโทรในครั้งแรก BCR จะถามไมโครโฟน การแจ้งเตือน (Android 13+) บันทึกการโทร รายชื่อติดต่อ และการอนุญาตทางโทรศัพท์ ต้องใช้สิทธิ์ไมโครโฟนและการแจ้งเตือนเท่านั้นสำหรับฟังก์ชันการบันทึกการโทรขั้นพื้นฐาน หากได้รับสิทธิ์เพิ่มเติม จะมีการเพิ่มข้อมูลเพิ่มเติมลงในชื่อไฟล์เอาต์พุต ตัวอย่างเช่น การอนุญาตผู้ติดต่อจะอนุญาตให้เพิ่มชื่อผู้ติดต่อลงในชื่อไฟล์ได้
ดูส่วนสิทธิ์ด้านล่างสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการอนุญาต
หากต้องการติดตั้งการอัปเดตในอนาคต มีสองวิธี:
.apk
ยังสามารถแยกออกจากไฟล์ zip และติดตั้งได้โดยตรง ด้วยวิธีนี้ เวอร์ชันเก่าจะมีเป็นแอประบบและมีเวอร์ชันใหม่เป็นการอัปเดตแอประบบที่ผู้ใช้ติดตั้ง วิธีนี้จะสะดวกกว่าหากอบ BCR ลงในอิมเมจเฟิร์มแวร์ Android ต่างจากฟังก์ชันการบันทึกการโทรในตัวของแอปโทรออกที่ติดตั้งไว้ล่วงหน้าในอุปกรณ์บางเครื่อง BCR ไม่ได้ประกาศว่ากำลังบันทึกการโทรให้กับอีกฝ่าย BCR จะไม่ส่งสัญญาณเสียงใดๆ ไปยังสตรีมเสียงการโทร
เมื่อเปิดใช้งาน BCR ให้หลีกเลี่ยงการใช้เครื่องบันทึกการโทรในตัวของตัวโทรออกเลย มีโอกาสที่ดีที่การใช้จะทำให้เกิดพฤติกรรมที่ไม่คาดคิด เช่น การบันทึกทั้งสองล้มเหลวหรือผู้โทรออกประกาศว่ากำลังบันทึกการโทร
หากคุณอาศัยอยู่ในเขตอำนาจศาลที่ต้องได้รับความยินยอมจากทั้งสองฝ่าย คุณต้องรับผิดชอบในการแจ้งให้อีกฝ่ายทราบว่าการโทรนั้นกำลังถูกบันทึกอยู่ หากจำเป็น คุณสามารถใช้กฎการบันทึกอัตโนมัติเพื่อละทิ้งการบันทึกตามค่าเริ่มต้น อย่างไรก็ตาม โปรดทราบว่าหากคุณเลือกที่จะเก็บการบันทึกไว้ระหว่างการโทร การบันทึกจะมีการโทรทั้งหมด ไม่ใช่แค่ส่วนที่อีกฝ่ายยินยอมเท่านั้น
BCR รับรู้การบูตโดยตรง ซึ่งหมายความว่าสามารถเรียกใช้และบันทึกการโทรได้ก่อนที่อุปกรณ์จะถูกปลดล็อคในขั้นต้นหลังจากการรีบูต ในสถานะนี้ ฟังก์ชั่นส่วนใหญ่ของ BCR จะยังคงใช้งานได้ นอกเหนือจากคุณสมบัติที่ต้องใช้รายชื่อผู้ติดต่อหรือบันทึกการโทร ในทางปฏิบัติหมายถึง:
อย่างไรก็ตาม หากอุปกรณ์ถูกปลดล็อคก่อนที่การโทรจะสิ้นสุด จะไม่มีข้อจำกัดเหล่านี้เกิดขึ้น
โปรดทราบว่าไดเรกทอรีผลลัพธ์จะไม่พร้อมใช้งานก่อนที่อุปกรณ์จะถูกปลดล็อคเป็นครั้งแรก การบันทึกที่ทำขณะอยู่ในสถานะจะถูกจัดเก็บไว้ในไดเร็กทอรีภายในที่ผู้ใช้ไม่สามารถเข้าถึงได้ หลังจากปลดล็อคอุปกรณ์แล้ว BCR จะย้ายไฟล์ไปยังไดเร็กทอรีเอาต์พุต การดำเนินการนี้อาจใช้เวลาสักครู่จึงจะเสร็จสมบูรณ์
CAPTURE_AUDIO_OUTPUT
( ได้รับโดยอัตโนมัติจากการอนุญาตของแอประบบ )CONTROL_INCALL_EXPERIENCE
( ได้รับโดยอัตโนมัติจากการอนุญาตของแอประบบ )RECORD_AUDIO
( ต้องได้รับอนุญาตจากผู้ใช้ )FOREGROUND_SERVICE
, FOREGROUND_SERVICE_MICROPHONE
( ให้โดยอัตโนมัติ ณ เวลาติดตั้ง )POST_NOTIFICATIONS
( ต้องได้รับอนุญาตจากผู้ใช้บน Android 13+ )READ_CALL_LOG
( ไม่จำเป็น )READ_CONTACTS
( ไม่จำเป็น )RECEIVE_BOOT_COMPLETED
, FOREGROUND_SERVICE_SPECIAL_USE
( ให้โดยอัตโนมัติ ณ เวลาติดตั้ง )READ_PHONE_STATE
( ทางเลือก )REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
( ไม่จำเป็น )VIBRATE
( ได้รับโดยอัตโนมัติ ณ เวลาติดตั้ง ) โปรดทราบว่า INTERNET
ไม่ อยู่ในรายการ BCR ไม่และจะไม่มีวันเข้าถึงเครือข่าย BCR จะไม่สื่อสารกับแอปอื่นๆ เช่นกัน ยกเว้นในกรณีที่ผู้ใช้แตะปุ่ม Open
หรือ Share
อย่างชัดเจนในการแจ้งเตือนที่แสดงเมื่อการบันทึกเสร็จสิ้น ในสถานการณ์นั้น แอปเป้าหมายจะได้รับสิทธิ์ในการเข้าถึงการบันทึกเดียวเท่านั้น
BCR มีการสนับสนุนอย่างจำกัดสำหรับแอปเปลี่ยนเส้นทางการโทร เช่น Google Voice การโทรที่เปลี่ยนเส้นทางสามารถบันทึกได้เฉพาะในกรณีที่บริการเปลี่ยนเส้นทางการโทรใช้การโทรมาตรฐานเบื้องหลัง (แทน VOIP)
มีข้อจำกัดหลายประการเมื่อบันทึกการโทรที่เปลี่ยนเส้นทางเมื่อเปรียบเทียบกับการโทรปกติ:
All other calls
เท่านั้นข้อจำกัดเหล่านี้มีอยู่เนื่องจากเมื่อมีการเปลี่ยนเส้นทางสาย มีเพียงแอปตัวเรียกเลขหมายเท่านั้นที่ทราบหมายเลขโทรศัพท์เดิม ระบบโทรศัพท์ Android ไม่ทราบเรื่องนี้ BCR สามารถค้นหาหมายเลขโทรศัพท์เดิมได้โดยค้นหาบันทึกการโทรของระบบเมื่อผู้โทรออกเพิ่มรายการเมื่อสิ้นสุดการโทร
BCR รองรับการปรับแต่งเทมเพลตที่ใช้สำหรับกำหนดชื่อไฟล์เอาต์พุตของการบันทึก เทมเพลตเริ่มต้นคือ:
{date}[_{direction}|][_sim{sim_slot}|][_{phone_number}|][_[{contact_name}|{caller_name}|{call_log_name}]|]
{var}
) ใช้เพื่ออ้างถึงตัวแปร ตัวแปรจะถูกแทนที่ด้วยค่าที่มันเป็นตัวแทน ตัวอย่างเช่น {phone_number}
จะถูกแทนที่ด้วยหมายเลขโทรศัพท์จริงของการโทร[{var}|default]
) ใช้สำหรับระบุทางเลือกสำรอง ตัวอย่างเช่น [{contact_name}|{caller_name}|Unknown]
จะใส่ชื่อผู้ติดต่อหากหมายเลขนั้นอยู่ในรายชื่อติดต่อ มิฉะนั้น ระบบจะถอยกลับไปเป็นหมายเลขผู้โทรหรือ Unknown
หากไม่มีชื่อผู้ติดต่อหรือหมายเลขผู้โทร การถอยกลับไปเป็นสตริงว่างก็ใช้ได้เช่นกัน ตัวอย่างเช่น [{contact_name}|]
จะประเมินเป็นชื่อผู้ติดต่อหรือไม่ก็ได้{date}
: การประทับเวลาของการโทร รูปแบบการประทับเวลาเริ่มต้นจะพยายามทำให้ไม่คลุมเครือที่สุดเท่าที่จะเป็นไปได้และอยู่ในรูปแบบ: 20230414_215701.088-0400
คุณสามารถระบุรูปแบบการประทับเวลาที่กำหนดเองได้ด้วย {date:<format string>}
ตัวอย่างเช่น {date:yyyy-MM-dd @ h.mm.ss a}
จะสร้าง 2023-04-14 @ 9.57.01 PM
ดูรายการอักขระการจัดรูปแบบการประทับเวลาทั้งหมดได้ที่: https://developer.android.com/reference/java/time/format/DateTimeFormatterBuilder#appendPattern(java.lang.String){phone_number}{date}
จะทำให้การเก็บรักษาไฟล์ถูกปิดใช้งาน แต่ {phone_number} ({date})
ใช้งานได้เนื่องจากมีข้อความบางส่วน (
ระหว่างตัวแปรทั้งสองyyMMdd_HHmmss
ถูกเปลี่ยนเป็น HHmmss_yyMMdd
การประทับเวลาจากชื่อไฟล์ของการบันทึกเก่าจะถูกแยกวิเคราะห์ไม่ถูกต้องและอาจถูกลบ{direction}
: [Android 10+ เท่านั้น] สำหรับการโทรแบบ 1 ต่อ 1 ไม่ว่าจะ in
หรือ out
ขึ้นอยู่กับว่าเป็นสายเรียกเข้าหรือสายโทรออก หากการโทรเป็นการประชุมทางโทรศัพท์ ระบบจะใช้ conference
แทน{sim_slot}
: [Android 11+ เท่านั้น] หมายเลขช่องใส่ซิมสำหรับการโทร (นับจาก 1) สิ่งนี้ถูกกำหนดไว้เฉพาะสำหรับอุปกรณ์หลายซิมที่มีการใช้งานหลายซิมและหาก BCR ได้รับอนุญาตจากโทรศัพท์{sim_slot:always}
{phone_number}
: หมายเลขโทรศัพท์สำหรับการโทร นี่ไม่ได้กำหนดไว้สำหรับการโทรส่วนตัว ตัวเลือกการจัดรูปแบบที่ใช้ได้:{phone_number:E.164}
: ค่าเริ่มต้น (เหมือนกับ {phone_number}
) หมายเลขโทรศัพท์ที่จัดรูปแบบเป็นรูปแบบสากล E.164 ( +<country code><subscriber>
){phone_number:digits_only}
: หมายเลขโทรศัพท์ที่มีเฉพาะตัวเลข (ไม่มี +
หรือตัวคั่น){phone_number:formatted}
: หมายเลขโทรศัพท์ที่จัดรูปแบบโดยใช้รูปแบบเฉพาะประเทศ{caller_name}
: ID ผู้โทรที่ได้รับจาก CNAP จากผู้ให้บริการ{contact_name}
ชื่อของผู้ติดต่อ (คนแรก) ที่เชื่อมโยงกับหมายเลขโทรศัพท์ สิ่งนี้ถูกกำหนดไว้ก็ต่อเมื่อ BCR ได้รับสิทธิ์ในการติดต่อ{call_log_name}
: ชื่อที่แสดงในบันทึกการโทร ซึ่งอาจรวมถึงข้อมูลเพิ่มเติม เช่น ชื่อของธุรกิจ หากตัวเรียกเลขหมายของระบบทำการค้นหาแบบย้อนกลับ สิ่งนี้ถูกกำหนดไว้ก็ต่อเมื่อ BCR ได้รับสิทธิ์ในการอ่านบันทึกการโทร เทมเพลตชื่อไฟล์รองรับการระบุไดเรกทอรีย่อยโดยใช้อักขระ /
อนุญาตให้ใช้เครื่องหมายทับได้ทุกที่ภายในเทมเพลตชื่อไฟล์ รวมถึง {date}
(เช่น {date:yyyy/MM/dd}
) อย่างไรก็ตาม เครื่องหมายทับที่ปรากฏหลังจากขยายตัวแปรอื่นๆ จะถูกแทนที่ด้วยขีดล่าง ตัวอย่างเช่น หาก ID ผู้โทรสำหรับการโทรคือ First/Last
ดังนั้น {caller_name}
จะถูกขยายเป็น First_Last
โปรดทราบว่าเนื่องจากประสิทธิภาพที่ไม่ดีของ Android Storage Access Framework การใช้ไดเรกทอรีย่อยอาจทำให้การบันทึกบนอุปกรณ์บางอย่างช้าลงอย่างมาก บน Android เวอร์ชันที่มีการใช้งาน SAF ที่ดี อาจใช้เวลาเพียงไม่กี่วินาทีเท่านั้น ในรุ่น Android ของ OEM ที่มีการใช้งาน SAF ที่แย่ที่สุด การดำเนินการนี้อาจใช้เวลาหลายนาที ความล่าช้าจะแปรผันตามจำนวนไฟล์ในไดเร็กทอรีเอาต์พุต
หากเปิดใช้งานตัวเลือก Write metadata file
BCR จะเขียนไฟล์ JSON ไปยังไดเร็กทอรีเอาต์พุตที่มีรายละเอียดทั้งหมดที่ BCR รู้เกี่ยวกับการโทรตลอดจนข้อมูลเกี่ยวกับเสียงที่บันทึกไว้ ไฟล์นี้มีชื่อเดียวกับไฟล์เสียง ยกเว้นนามสกุล .json
โครงสร้าง JSON แสดงในตัวอย่างต่อไปนี้ โปรดทราบว่ามีเพียง timestamp_unix_ms
, timestamp
และ output.format.*
เท่านั้นที่รับประกันว่าจะมีอยู่ หากไม่สามารถกำหนดค่าสำหรับฟิลด์ได้ (เช่น เมื่อเกิดข้อผิดพลาดหรือการอนุญาตที่จำเป็นถูกปฏิเสธ) ค่านั้นจะถูกตั้งค่าเป็น null
{
// The timestamp represented as milliseconds since the Unix epoch in UTC.
"timestamp_unix_ms" : 1689817988931 ,
// The timestamp represented as ISO8601 (+ offset) in the local time zone.
"timestamp" : "2023-07-19T21:53:08.931-04:00" ,
// The call direction ("in", "out", or "conference").
// [Android 10+ only]
"direction" : "in" ,
// The SIM slot used for the call.
// [Android 11+ only; requires the Phone permission]
"sim_slot" : 1 ,
// The name shown in the dialer's call log. This may include the business'
// name for dialers that perform reverse lookups.
// [Requires the Call Log permission]
"call_log_name" : "John Doe" ,
// Details about the other party or parties in the call. There will be
// multiple entries for conference calls.
"calls" : [
{
// The raw phone number as reported by Android. For outgoing calls,
// this is usually what the user typed. For incoming calls, this is
// usually E.164 formatted. This will be null for private calls.
"phone_number" : "+11234567890" ,
// The phone number formatted using the country-specific style. This
// will be null for private calls or if Android cannot determine the
// country.
"phone_number_formatted" : "+1 123-456-7890" ,
// The caller name/ID as reported by CNAP from the carrier.
"caller_name" : "John Doe" ,
// The contact name associated with the phone number.
// [Requires the Contacts permission]
"contact_name" : "John Doe"
}
] ,
// Details about the output file.
"output" : {
// Details about the output file format.
"format" : {
// The audio encoding format.
"type" : "OGG/Opus" ,
// The MIME type of the container format (eg. OGG).
"mime_type_container" : "audio/ogg" ,
// The MIME type of the raw audio stream (eg. Opus).
"mime_type_audio" : "audio/opus" ,
// The type of the parameter value below. Either "bitrate",
// "compression_level", or "none".
"parameter_type" : "bitrate" ,
// The encoder quality/size parameter.
"parameter" : 48000 ,
} ,
// Details about the recording and encoding process. If the recording
// process fails, this is set to null.
"recording" : {
// The total number of audio frames that BCR read from the audio
// device. This includes the periods of time when the recording was
// paused or on hold.
// (Number of frames == number of samples * channel count)
"frames_total" : 96000 ,
// The number of audio frames that were actually saved to the output
// file. This excludes the periods of time when the recording was
// paused or on hold.
// (Number of frames == number of samples * channel count)
"frames_encoded" : 48000 ,
// The number of samples per second of audio.
"sample_rate" : 48000 ,
// The number of channels in the audio. This is currently always 1
// because no device supports stereo call audio.
"channel_count" : 1 ,
// The total time in seconds that BCR read from the audio device.
// (Equal to: frames_total / sample_rate / channel_count)
"duration_secs_total" : 2.0 ,
// The time in seconds of audio actually saved to the output file.
// (Equal to: frames_encoded / sample_rate / channel_count)
"duration_secs_encoded" : 1.0 ,
// The size of the recording buffer in frames. This is the maximum
// number of audio frames read from the audio driver before it is
// passed to the audio encoder.
"buffer_frames" : 640 ,
// The number of buffer overruns. This is the number of times that
// the CPU or storage couldn't keep up while encoding the raw audio,
// resulting in skips (loss of audio).
"buffer_overruns" : 0 ,
// Whether the call was ever paused by the user.
"was_ever_paused" : false ,
// Whether the call was ever placed on hold (call waiting).
"was_ever_holding" : false
}
}
}
ส่วนนี้จะอธิบายคุณลักษณะขั้นสูงที่ซ่อนอยู่ของ BCR
BCR มีโหมดแก้ไขข้อบกพร่องที่ซ่อนอยู่ซึ่งสามารถเปิดหรือปิดใช้งานได้โดยการกดหมายเลขเวอร์ชันค้างไว้
เมื่อเปิดใช้งานโหมดแก้ไขข้อบกพร่อง BCR จะเขียนไฟล์บันทึกไปยังไดเร็กทอรีเอาต์พุตหลังจากการบันทึกการโทรเสร็จสิ้น โดยตั้งชื่อในลักษณะเดียวกับไฟล์เสียง ไฟล์บันทึกประกอบด้วยข้อความเดียวกันกับที่ adb logcat
จะแสดง ยกเว้นข้อความที่ไม่เกี่ยวข้องกับ BCR จะถูกกรองออก (BCR ไม่มีสิทธิ์เข้าถึงข้อความเหล่านั้นอยู่แล้ว)
ภายในไฟล์บันทึก BCR มีเป้าหมายที่จะไม่บันทึกข้อมูลที่ละเอียดอ่อนใดๆ ข้อมูลเกี่ยวกับการโทรปัจจุบัน เช่น หมายเลขโทรศัพท์ จะถูกแทนที่ด้วยตัวยึดตำแหน่งแทน เช่น <phone number>
อย่างไรก็ตาม ข้อมูลอื่นๆ ไม่สามารถแก้ไขได้อย่างง่ายดายด้วยวิธีนี้จะถูกตัดทอนแทน ตัวอย่างเช่น เมื่อคุณลักษณะการเก็บรักษาไฟล์ล้างข้อมูลไฟล์เก่า ชื่อไฟล์เช่น 20230101_010203.456+0000_out_1234567890_John_Doe.oga
จะถูกบันทึกเป็น 20<...>ga
เมื่อรายงานข้อบกพร่อง โปรดรวมไฟล์บันทึกเนื่องจากมีประโยชน์อย่างมากในการระบุสิ่งที่อาจผิด (แต่โปรดตรวจสอบไฟล์บันทึกอีกครั้งเพื่อให้แน่ใจว่าไม่มีข้อมูลที่ละเอียดอ่อน!)
BCR อาศัยการอนุญาตของแอประบบเป็นอย่างมากเพื่อให้ทำงานได้อย่างถูกต้อง สาเหตุหลักมาจากสิทธิ์สองประการ:
CONTROL_INCALL_EXPERIENCE
การอนุญาตนี้ทำให้บริการโทรศัพท์ของ Android เชื่อมโยงกับ InCallService
ของ BCR โดยไม่ต้องให้ BCR เป็นแอปคู่หูที่สวมใส่ได้, UI ในรถยนต์ หรือโปรแกรมโทรออกเริ่มต้น เมื่อผูกแล้ว บริการจะได้รับการโทรกลับสำหรับเหตุการณ์การเปลี่ยนแปลงการโทร (เช่น สายเรียกเข้าในสถานะเสียงเรียกเข้า) วิธีนี้มีความน่าเชื่อถือมากกว่าการใช้สิทธิ์ READ_PHONE_STATE
และอาศัยการออกอากาศ android.intent.action.PHONE_STATE
วิธีนี้มีประโยชน์เพิ่มเติมอีกสองสามประการ เนื่องจากวิธีที่บริการโทรศัพท์เชื่อมโยงกับ InCallService
ของ BCR บริการจึงสามารถเข้าและออกจากเบื้องหน้าได้ตามต้องการเมื่อมีการโทร และเข้าถึงสตรีมเสียงโดยไม่กระทบกับข้อจำกัดการเข้าถึงไมโครโฟนพื้นหลังของ Android 12+ นอกจากนี้ยังไม่จำเป็นต้องเริ่มบริการด้วยตนเองจากเครื่องรับการออกอากาศ ACTION_BOOT_COMPLETED
ดังนั้นจึงไม่ได้รับผลกระทบจากความล่าช้าของการออกอากาศนั้นในระหว่างการบูตครั้งแรก
CAPTURE_AUDIO_OUTPUT
การอนุญาตนี้ใช้เพื่อบันทึกจากสตรีมเสียง VOICE_CALL
สตรีมนี้ รวมถึงสตรีมอื่นๆ เช่น VOICE_DOWNLINK
และ VOICE_UPLINK
ไม่สามารถเข้าถึงได้หากไม่ได้รับอนุญาตจากระบบ
ด้วยการอนุญาตทั้งสองนี้ BCR สามารถตรวจจับการโทรและบันทึกจากสตรีมเสียงของการโทรได้อย่างน่าเชื่อถือ กระบวนการบันทึกจะดึงเสียงดิบ PCM s16le และใช้ตัวเข้ารหัสในตัวของ Android เพื่อสร้างไฟล์เอาต์พุตที่บีบอัด
ทั้งไฟล์ zip และ APK ที่อยู่ภายในได้รับการเซ็นชื่อแบบดิจิทัล หมายเหตุ : กลไกการเซ็นชื่อไฟล์ zip เปลี่ยนจาก GPG เป็น SSH ตั้งแต่เวอร์ชัน 1.31 หากต้องการตรวจสอบลายเซ็นสำหรับเวอร์ชันเก่า โปรดดู README.md
เวอร์ชัน 1.30
หากต้องการตรวจสอบลายเซ็นดิจิทัลของการดาวน์โหลด ให้ทำตามขั้นตอนที่นี่
ขั้นแรก ให้แตก apk ออกจาก zip แล้วรัน:
apksigner verify --print-certs system/priv-app/com.chiller3.bcr/app-release.apk
จากนั้นตรวจสอบว่าสรุป SHA-256 ของใบรับรองการลงนาม APK คือ:
d16f9b375df668c58ef4bb855eae959713d6d02e45f7f2c05ce2c27ae944f4f9
สามารถสร้าง BCR ได้เหมือนกับแอป Android อื่นๆ ส่วนใหญ่โดยใช้ Android Studio หรือบรรทัดคำสั่ง gradle
วิธีสร้าง APK:
./gradlew assembleDebug
หากต้องการสร้างไฟล์ zip ของโมดูล Magisk (ซึ่งจะรันงาน assembleDebug
โดยอัตโนมัติหากจำเป็น):
./gradlew zipDebug
ไฟล์เอาต์พุตถูกเขียนไปที่ app/build/distributions/debug/
APK จะได้รับการลงนามด้วยคีย์การแก้ไขข้อบกพร่องที่สร้างอัตโนมัติตามค่าเริ่มต้น
หากต้องการสร้างบิลด์การเผยแพร่ด้วยคีย์การลงนามเฉพาะ ให้ตั้งค่าตัวแปรสภาพแวดล้อมต่อไปนี้:
export RELEASE_KEYSTORE=/path/to/keystore.jks
export RELEASE_KEY_ALIAS=alias_name
read -r -s RELEASE_KEYSTORE_PASSPHRASE
read -r -s RELEASE_KEY_PASSPHRASE
export RELEASE_KEYSTORE_PASSPHRASE
export RELEASE_KEY_PASSPHRASE
จากนั้นสร้าง zip release:
./gradlew zipRelease
เรายินดีแก้ไขข้อผิดพลาดและขอดึงคำแปลและยินดีเป็นอย่างยิ่ง!
หากคุณสนใจที่จะใช้คุณลักษณะใหม่และต้องการให้รวมอยู่ใน BCR โปรดเปิดประเด็นเพื่อหารือเกี่ยวกับเรื่องนี้ก่อน ฉันตั้งใจให้ BCR เรียบง่ายและมีการบำรุงรักษาต่ำที่สุดเท่าที่จะเป็นไปได้ ดังนั้นฉันจึงไม่อยากเพิ่มคุณสมบัติใหม่ใดๆ มากนัก แต่ฉันก็มั่นใจได้เป็นอย่างอื่น
BCR ได้รับอนุญาตภายใต้ GPLv3 โปรดดู LICENSE
สำหรับข้อความใบอนุญาตฉบับเต็ม