2013-06-13 35 views
18

Tôi đang sử dụng SDK nhà phát triển iOS7 mới và giờ đây, yêu cầu ứng dụng từ người dùng được phép ghi từ mic khi Ứng dụng cố gắng ghi lại lần đầu tiên. enter image description hereLàm cách nào để tôi yêu cầu quyền ghi micrô từ người dùng

Ứng dụng của tôi sẽ ghi lại sau khi đếm ngược, do đó người dùng không thể nhìn thấy yêu cầu này. tôi sử dụng mã này để kiểm tra requestRecordPermission:

[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) { 
      if (granted) { 
       // Microphone enabled code 
      } 
      else { 
       // Microphone disabled code 
      } 
     }]; 

Nhưng làm thế nào tôi có thể kích hoạt các yêu cầu của bản thân mình trước khi tôi bắt đầu để ghi lại?

+0

@OneManCrew Câu hỏi dường như không có bất kỳ nỗ lực nào để giải quyết vấn đề và về cơ bản là yêu cầu hướng dẫn. (Do đó "quá rộng" trong lý do đóng) –

Trả lời

26

Trong iOS7 mới nó rất đơn giản thử điều này:

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission)]) 
{ 
    [[AVAudioSession sharedInstance] requestRecordPermission]; 
} 
+1

Cảm ơn !!! đó là công việc! – user2068793

+6

Thực tế trong iOS7 chức năng này yêu cầu sử dụng với các khối có thể được gọi như sau: [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL response) { NSLog (@ "Cho phép phản hồi sử dụng micrô:% d", phản hồi); }]; – c0d3Junk13

+0

Ngoài ra, bạn có thể cần một #ifdef __IPHONE_7_0 xung quanh mã trên #endif để biên dịch nó trong các phiên bản cũ của xcode. – c0d3Junk13

6

Như "One Man Crew" khẳng định bạn có thể sử dụng requestRecordPermission.

Điều quan trọng cần lưu ý là bạn phải kiểm tra yêu cầuRecordPermission được triển khai. Lý do là nếu ứng dụng của bạn chạy trên phiên bản iOS cũ hơn (ví dụ iOS 6.x), ứng dụng sẽ bị lỗi sau cuộc gọi này. Để ngăn chặn điều đó, bạn phải kiểm tra xem bộ chọn này có được triển khai hay không (đây là một phương pháp hay).

Mã nên một cái gì đó như thế này:

if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]){ 
    [[AVAudioSession sharedInstance] requestRecordPermission]; 
} 

Sử dụng phương pháp này ứng dụng của bạn sẽ hỗ trợ hệ điều hành mới và cũng phiên bản trước của hệ điều hành.

Tôi đang sử dụng phương pháp này mỗi khi Apple thêm nhiều chức năng hơn cho hệ điều hành mới (theo cách đó tôi có thể hỗ trợ các phiên bản cũ hơn khá dễ dàng).

+0

Nó tầm thường! Bằng cách này nếu bạn sử dụng phương pháp này trên các phiên bản iOS cũ hơn, phương pháp sẽ không làm gì cả, bởi vì phương pháp là một phần của ios7 sdk. –

+1

Việc sử dụng phương pháp này với các SDK trước đó là không hợp lý vì bạn sẽ không biên dịch cho iOS 7 và bạn không có gì để làm với nó. Nhưng nếu bạn đang sử dụng SDK mới và nhắm mục tiêu các thiết bị cũ hơn (ví dụ iOS 6.x), Nếu bạn không sử dụng tính năng này, ứng dụng của bạn chắc chắn sẽ bị lỗi!Vì vậy, hãy chú ý đến việc sử dụng kiểm tra siêu quan trọng này. Nó xảy ra mỗi khi Apple thêm một tính năng mới. Nếu nó là một cách khác (Apple loại bỏ tính năng) ứng dụng của bạn sẽ không sụp đổ và bạn sẽ chỉ nhận được một cảnh báo rằng chức năng không được chấp nhận (không có tai nạn). – Idan

+0

Bạn rất sai! Không có kết nối trực tiếp giữa gói SDK được tích hợp sẵn ứng dụng và hệ điều hành được cài đặt trên thiết bị.Bạn có thể tạo ứng dụng hoàn chỉnh với SDK IOS7 và nó sẽ chạy trên hệ điều hành cũ hơn. !! – user2068793

10

Đây là đoạn mã cuối cùng phù hợp với tôi. Nó hỗ trợ cả Xcode 4 và 5, và hoạt động cho iOS5 +.

#ifndef __IPHONE_7_0 
    typedef void (^PermissionBlock)(BOOL granted); 
#endif 

    PermissionBlock permissionBlock = ^(BOOL granted) { 
     if (granted) 
     { 
      [self doActualRecording]; 
     } 
     else 
     { 
      // Warn no access to microphone 
     } 
    }; 

    // iOS7+ 
    if([[AVAudioSession sharedInstance] respondsToSelector:@selector(requestRecordPermission:)]) 
    { 
     [[AVAudioSession sharedInstance] performSelector:@selector(requestRecordPermission:) 
               withObject:permissionBlock]; 
    } 
    else 
    { 
     [self doActualRecording]; 
    } 
2
AVAudioSession.sharedInstance().requestRecordPermission({ (granted) -> Void in 
     if !granted 
     { 
      let microphoneAccessAlert = UIAlertController(title: NSLocalizedString("recording_mic_access",comment:""), message: NSLocalizedString("recording_mic_access_message",comment:""), preferredStyle: UIAlertControllerStyle.Alert) 

      var okAction = UIAlertAction(title: NSLocalizedString("OK",comment:""), style: UIAlertActionStyle.Default, handler: { (alert: UIAlertAction!) -> Void in 
       UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString)!) 
      }) 


      var cancelAction = UIAlertAction(title: NSLocalizedString("Cancel",comment:""), style: UIAlertActionStyle.Cancel, handler: { (alert: UIAlertAction!) -> Void in 

      }) 
      microphoneAccessAlert.addAction(okAction) 
      microphoneAccessAlert.addAction(cancelAction) 
      self.presentViewController(microphoneAccessAlert, animated: true, completion: nil) 
      return 
     } 
     self.performSegueWithIdentifier("segueNewRecording", sender: nil) 
    }); 
1

Dựa trên phản ứng https://stackoverflow.com/users/1071887/idan 's.

AVAudioSession *session = [AVAudioSession sharedInstance]; 

// AZ DEBUG @@ iOS 7+ 
AVAudioSessionRecordPermission sessionRecordPermission = [session recordPermission]; 
switch (sessionRecordPermission) { 
    case AVAudioSessionRecordPermissionUndetermined: 
     NSLog(@"Mic permission indeterminate. Call method for indeterminate stuff."); 
     break; 
    case AVAudioSessionRecordPermissionDenied: 
     NSLog(@"Mic permission denied. Call method for denied stuff."); 
     break; 
    case AVAudioSessionRecordPermissionGranted: 
     NSLog(@"Mic permission granted. Call method for granted stuff."); 
     break; 
    default: 
     break; 
}