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

}

また、これが UIImagePickerController のみの問題であるかどうかを確認するために NSArray を宣言しましたが、配列でも同じエラーが発生します。

4

2 に答える 2

2

の最後のパラメータAudioSessionAddPropertyListener()があるので、好きなものをコールバックに渡すことができます。

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

あなたは自分自身を渡しているので、コールバック内でパラメータは自分自身void *inClientDataがどちらのオブジェクトへのポインタでもあります。

self が UIImagePickerController のインスタンスである場合、

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

コールバックは、Objective-C メソッドではなく、C 関数である必要があります。これらは互換性がありません。このリンクを参照してください。

于 2011-08-02T09:57:38.807 に答える