0

我正在为 kAudioSessionProperty_AudioRouteChange 添加一个音频会话属性侦听器,并且在回调中我想调用 UIImagePickerController 的 takePicture 函数。问题是我无法在回调中访问我的选择器。

我正在 viewDidLoad 中初始化我的选择器。我尝试将选择器声明为私有和公共对象,并使用选择器或 self.picker 进行访问,但它总是给出“使用未声明的标识符”错误。我使用此代码添加侦听器:

AudioSessionInitialize(nil, nil, nil, nil);
AudioSessionSetActive(true);
AudioSessionAddPropertyListener(
                                kAudioSessionProperty_AudioRouteChange,
                                applicationAudioRouteDidChange,
                                self);

这是我的回调:

void applicationVolumeDidChange(void *inClientData,
                                AudioSessionPropertyID inID,
                                UInt32 inDataSize, const void *inData)
{
    NSLog(@"Volume changed");
    //[picker takePicture]; Error

}

我还声明了一个 NSArray 以查看这是否只是 UIImagePickerController 的问题,但该数组也给出了相同的错误。

4

2 回答 2

2

的最后一个参数在AudioSessionAddPropertyListener()那里,所以你可以将任何你喜欢的东西传递给回调。

 OSStatus AudioSessionAddPropertyListener (
       AudioSessionPropertyID         inID,
       AudioSessionPropertyListener   inProc,
       void                           *inClientData
    );

您正在传递self,因此在回调中,void *inClientData参数是指向self对象的指针。

如果 self 是 UIImagePickerController 的一个实例,那么,

UIImagePickerController *picker = inClientData;
[picker takePicture];
于 2011-08-02T11:02:55.077 回答
1

您的回调必须是 C 函数,而不是 Objective-C 方法。这些不兼容。请参阅此链接

于 2011-08-02T09:57:38.807 回答