اكتشاف ما إذا تم توصيل سماعات الرأس بـ iPhone
-
01-10-2019 - |
سؤال
هل يعرف أي شخص ما إذا كان يمكنك اكتشاف ما إذا كانت سماعات الرأس موصولة في iPhone ، وإذا لم تكن كذلك - تعطيل الصوت من تطبيقك.
أعتقد أنه يمكنني إدارة تعطيل الصوت ، لكن جزء الكشف الذي لم أجده بعد.
شكرًا
المحلول
http://developer.apple.com/iphone/library/samplecode/speakhere/introduction/intro.html
في هذا المشروع ، يوجد رمز سينمجي حيث يتوقف عن التسجيل إذا تم فصل سماعات الرأس. ربما يمكنك استخدامه لتحقيق النتيجة.
حظا طيبا وفقك الله!
(تعديل)
سيكون عليك دراسة ملف speakhereController.mm.
لقد وجدت هذا الرمز في awakeFromNib
طريقة
// we do not want to allow recording if input is not available
error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);
if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", error);
btn_record.enabled = (inputAvailable) ? YES : NO;
// we also need to listen to see if input availability changes
error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, self);
if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", error);
نصائح أخرى
باستخدام هذا الرمز ، يمكنك اكتشاف التغييرات بين:
- ميكروفون وريد
- سماعة الرأس
- خط
- مكبر الصوت
اكتشاف عندما تم توصيل/موصل جهاز iOS
ملاحظة: نظرًا لأن iOS 5 جزء من السلوك "AudioroutechangelistenerCallback (...)" تم إهماله ولكن يمكنك تحديثه بـ:
// kAudioSession_AudioRouteChangeKey_PreviousRouteDescription -> Previous route
// kAudioSession_AudioRouteChangeKey_CurrentRouteDescription -> Current route
CFDictionaryRef newRouteRef = CFDictionaryGetValue(routeChangeDictionary, kAudioSession_AudioRouteChangeKey_CurrentRouteDescription);
NSDictionary *newRouteDict = (NSDictionary *)newRouteRef;
// RouteDetailedDescription_Outputs -> Output
// RouteDetailedDescription_Outputs -> Input
NSArray * paths = [[newRouteDict objectForKey: @"RouteDetailedDescription_Outputs"] count] ? [newRouteDict objectForKey: @"RouteDetailedDescription_Outputs"] : [newRouteDict objectForKey: @"RouteDetailedDescription_Inputs"];
NSString * newRouteString = [[paths objectAtIndex: 0] objectForKey: @"RouteDetailedDescription_PortType"];
// newRouteString -> MicrophoneWired, Speaker, LineOut, Headphone
تحيات
إليك الحل ، قد يعجبك أو أنه مفيد لك.
قبل استخدام الطريقة أدناه ، يرجى كتابة هذا السطر أيضًا
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
(void)isHeadsetPluggedIn {
UInt32 routeSize = sizeof (CFStringRef); CFStringRef route;
AudioSessionGetProperty (kAudioSessionProperty_AudioRoute, &routeSize, &route);
//NSLog(@"Error >>>>>>>>>> :%@", error);
/* Known values of route:
"Headset"
"Headphone"
"Speaker"
"SpeakerAndMicrophone"
"HeadphonesAndMicrophone"
"HeadsetInOut"
"ReceiverAndMicrophone"
"Lineout" */
NSString* routeStr = (NSString*)route;
NSRange headsetRange = [routeStr rangeOfString : @"Headset"]; NSRange receiverRange = [routeStr rangeOfString : @"Receiver"];
if(headsetRange.location != NSNotFound) {
// Don't change the route if the headset is plugged in.
NSLog(@"headphone is plugged in ");
} else
if (receiverRange.location != NSNotFound) {
// Change to play on the speaker
NSLog(@"play on the speaker");
} else {
NSLog(@"Unknown audio route.");
}
}
لإجراء فحص لمرة واحدة لتحديد ما إذا تم توصيل سماعات الرأس (بدلاً من إعداد رد اتصال عندما يتم فصلهم) ، وجدت الأعمال التالية في iOS5 وما فوق:
- (BOOL) isAudioJackPlugged
{
// initialise the audio session - this should only be done once - so move this line to your AppDelegate
AudioSessionInitialize(NULL, NULL, NULL, NULL);
UInt32 routeSize;
// oddly, without calling this method caused an error.
AudioSessionGetPropertySize(kAudioSessionProperty_AudioRouteDescription, &routeSize);
CFDictionaryRef desc; // this is the dictionary to contain descriptions
// make the call to get the audio description and populate the desc dictionary
AudioSessionGetProperty (kAudioSessionProperty_AudioRouteDescription, &routeSize, &desc);
// the dictionary contains 2 keys, for input and output. Get output array
CFArrayRef outputs = CFDictionaryGetValue(desc, kAudioSession_AudioRouteKey_Outputs);
// the output array contains 1 element - a dictionary
CFDictionaryRef dict = CFArrayGetValueAtIndex(outputs, 0);
// get the output description from the dictionary
CFStringRef output = CFDictionaryGetValue(dict, kAudioSession_AudioRouteKey_Type);
/**
These are the possible output types:
kAudioSessionOutputRoute_LineOut
kAudioSessionOutputRoute_Headphones
kAudioSessionOutputRoute_BluetoothHFP
kAudioSessionOutputRoute_BluetoothA2DP
kAudioSessionOutputRoute_BuiltInReceiver
kAudioSessionOutputRoute_BuiltInSpeaker
kAudioSessionOutputRoute_USBAudio
kAudioSessionOutputRoute_HDMI
kAudioSessionOutputRoute_AirPlay
*/
return CFStringCompare(output, kAudioSessionOutputRoute_Headphones, 0) == kCFCompareEqualTo;
}
بالنسبة لأولئك الذين يحتفظون بالنتيجة في المنزل ، فهذه سلسلة في قاموس في صفيف في قاموس.