PhoneGap 3.3.0 / Cordova iOS 7音频记录许可

时间:2014-02-20 10:47:58

标签: audio cordova permissions

我是PhoneGap / Cordova开发的新手。最近有一个关于iOS的更新,它要求用户在使用麦克风之前授予应用程序权限。

我曾尝试更新“包” - 媒体和媒体捕获,但它仍无法正常工作。 我也尝试了一个名为cordova-phonegap-audio-encode的插件,但它也没有用。

以下是我的代码:

Record.html(这是用户进行交互并触发权限/录制音频的页面/界面)

<html>
    <head>
        <title>System</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
                <script src="../js/cordova-2.3.0.js"></script>
                <script src="../js/config.js"></script>
                <script src="../js/languages.js"></script>
                <script src="beJS.js"></script>
                <link rel="stylesheet" href="../js/jquery.mobile-1.3.0.min.css" />
                <script src="../js/jquery-1.8.2.min.js"></script>
                <script src="../js/jquery.mobile-1.3.0.min.js"></script>
                <script scr="../js/RecordPermission.js"></script>
                </head>

    <body >



        <div data-role="page" id="beRecordPage">
            <div data-role="header" data-theme="c"  data-position="fixed">
                <a href="index.html" id="btnMenu" target="_self" data-icon="home" data-ajax='false'></a>
                <h1 id="be_header_record"></h1>
            </div><!-- /header -->

            <div data-role="content" >
                <div class="content-primary"  id='programContent' >
                    <label for="length" id="be_reocrd_lbl_scriptName"></label>
                    <input type="text"  name='scriptName' id="scriptName" value=""  data-clear-btn="true" maxlength="30"/>
                    <hr/>
                    <div data-role="controlgroup" >
                        <button type="button" data-theme="c" id="be_reocrd_btn_record" onclick='record();'></button>
                        <button type="button" data-theme="c" id="be_reocrd_btn_play" onclick='playRecord();'></button>
                        <button type="button" data-theme="c" id="be_reocrd_btn_delete" onclick='deleteRecord();'></button>
                    </div>
                    <div><!-- /content-primary -->
                        <div><!-- /content -->

                        </div><!-- /page -->

                        <script>

                            var isRecorded = false;
                            var isRecording = false;
                            var isPlaying = false;
                            var recordResult =false;
                            var lastSrc = "";
                            var src = "";
                            var mediaRec;

                            function playRecord(){
                                if(isRecorded && !isRecording){
                                    if(isPlaying){
                                        stopPlaying();
                                    }else{
                                        mediaRec = new Media(lastSrc, stopPlaying,null);
                                        mediaRec.play();
                                        isPlaying = true;
                                        $('#be_reocrd_btn_record').button('disable');
                                        $('#be_reocrd_btn_delete').button('disable');
                                        $('#be_reocrd_btn_play').text(language[langCode].be_reocrd_btn_stop);
                                        $('#be_reocrd_btn_play').button('refresh');
                                    }
                                }else{
                                    alert(language[langCode].be_reocrd_msg_pleaseRecord);
                                }
                            }

                        function deleteRecord(){
                            if(isRecorded && !isRecording && !isPlaying){
                                var confirmation=confirm(language[langCode].be_reocrd_msg_deleteConfirmation);
                                if(confirmation){
                                    performDeleteRecord()
                                }
                            }else{
                                alert(language[langCode].be_reocrd_msg_deleteError);
                            }
                        }


                        var fileRoot;
                        function onFileSystemSuccess(fileSystem) {
                            fileRoot = fileSystem.root;
                            fileRoot.getFile(lastSrc, {create: false}, onGetFileSuccess, onError);
                        }


                        function onGetFileSuccess(entry){
                            entry.remove(function() {
                                         var idx = --localStorage.SYS_RECORDFILEINDEX;
                                         localStorage.removeItem("SYS_RECORD_NAME"+idx);
                                         localStorage.removeItem("SYS_RECORD_PATH"+idx);
                                         alert(language[langCode].be_reocrd_msg_deleteSuccessful);
                                         }, onError
                                         );
                        }


                        function onError() {
                            alert(language[langCode].be_reocrd_msg_deleteFailure);
                        }


                        function onRequestFileSystemSuccess(fileSystem) {

                            src = fileSystem.root.fullPath + '/' + src;
                            fileSystem.root.getFile(src, {create: true}, function() {

                                                    mediaRec = new Media(src, successRecord,failRecord);
                                                    mediaRec.startRecord();
                                                    }, function(err) {
                                                    alert(err.message);
                                                    }
                                                    );
                                                    /*
                                                     var entry=fileSystem.root;
                                                     entry.getDirectory(recordFileFolder, {create: true, exclusive: false}, onGetDirectorySuccess, onGetDirectoryFail);
                                                     */
                        }

                        function onGetDirectorySuccess(dir) {
                            alert("Created dir "+dir.name);
                            mediaRec = new Media(src, successRecord,failRecord);
                            mediaRec.startRecord();
                        }

                        function onGetDirectoryFail(error) {
                            alert("Error creating directory "+error.code);
                        }




                        function performDeleteRecord(){

                            window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, onError);

                            return true;
                        }

                        function successRecord(){

                            isRecorded = true;
                            recordResult = true;
                            lastSrc = src;
                            var idx = localStorage.SYS_RECORDFILEINDEX;
                            localStorage["SYS_RECORD_NAME"+idx] = $('#scriptName').attr('value');
                            localStorage["SYS_RECORD_PATH"+idx] = lastSrc;
                            localStorage.SYS_RECORDFILEINDEX++;
                        }



                        function stopPlaying(){

                            if(mediaRec != null){
                                mediaRec.stop();
                                mediaRec = null;
                            }



                            isPlaying = false;
                            $('#be_reocrd_btn_record').button('enable');
                            $('#be_reocrd_btn_delete').button('enable');
                            $('#be_reocrd_btn_play').text(language[langCode].be_reocrd_btn_play);
                            $('#be_reocrd_btn_play').button('refresh');                     
                        }

                        function failRecord(err){
                            alert(err.message);
                            alert(language[langCode].be_reocrd_msg_recordFailure);  
                            $('#be_reocrd_btn_record').text(language[langCode].be_reocrd_btn_start);    
                            recordResult = false;           
                        }



                        function performRecord(){
                            var result = false;
                            src = recordFileFolder+new Date().getTime()+".wav";
                            window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onRequestFileSystemSuccess, null);
                            //      mediaRec = new Media(src, successRecord,failRecord);
                            //      mediaRec.startRecord();




                        }                       

                        function record(){
                            if($('#scriptName').attr('value') == ''){
                                alert(language[langCode].be_reocrd_msg_pleaseInputName);
                                return;
                            }
                            if(!isPlaying){

                                if(!isRecording){
                                    $('#be_reocrd_btn_record').text(language[langCode].be_reocrd_btn_stop);
                                    $('#be_reocrd_btn_play').button('disable');
                                    $('#be_reocrd_btn_delete').button('disable');
                                    isRecording = true;
                                    performRecord();
                                }else{

                                    mediaRec.stopRecord();
                                    isRecording = false;
                                    $('#be_reocrd_btn_record').text(language[langCode].be_reocrd_btn_start);
                                    $('#be_reocrd_btn_play').button('enable');
                                    $('#be_reocrd_btn_delete').button('enable');

                                }
                                $('#be_reocrd_btn_record').button('refresh');                           
                            }else{
                                alert(language[langCode].be_reocrd_msg_pleaseStopPlaying);                                                              
                            }
                        }           


                        $('#beRecordPage').live('pagecreate',function(event){

                                                checkLoggedIn();

                                                $('#be_header_record').text(language[langCode].be_header_record);
                                                $('#btnMenu').text(language[langCode].menu);
                                                $('#be_reocrd_lbl_scriptName').text(language[langCode].be_reocrd_lbl_scriptName);
                                                $('#be_reocrd_btn_record').text(language[langCode].be_reocrd_btn_start);
                                                $('#be_reocrd_btn_play').text(language[langCode].be_reocrd_btn_play);
                                                $('#be_reocrd_btn_delete').text(language[langCode].be_reocrd_btn_delete);                                                                                               

                                                });

                            </script>

                        </body>



</html>

这是RecordPermission.js

 window.recordPermission = function(params) {
     cordova.exec(function(answer){
         if (answer === "True") params.success(true);
         else if (answer === "False") params.success(false);
         else params.error('success called with "'+answer+'". Must be "True" or "False" strings');
     }, params.error,"RecordPermission", "recordPermission");
 };

以下是RecordPermission.m

#import "RecordPermission.h"

@implementation RecordPermission

@synthesize callbackId;

- (void)recordPermission:(CDVInvokedUrlCommand*)command
{
    self.callbackId = command.callbackId;

    // First check to see if we are in ios 7.
    NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];

    if ([[vComp objectAtIndex:0] intValue] < 7) {
        // before iOS7 when this permission was not required or setable by the user
        [self performSelectorOnMainThread:@selector(doSuccessCallback:) withObject:@"True" waitUntilDone:NO];
    } else {

        // run this in a try just in case
        @try {
            [[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {
                // cast this to a string bc I don't know if you can or how to pass a boolean back to javascript.
                //      This is converted back to a javascript boolean in RecordPermission.h.js file
                NSString * grantedString = (granted) ? @"True" : @"False";

                // talking back to javascript must be done in main thread.
                [self performSelectorOnMainThread:@selector(doSuccessCallback:) withObject:grantedString waitUntilDone:NO];
            }];

        } @catch (id exception) {
            NSLog(@"recordPermission try error");
            CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_JSON_EXCEPTION messageAsString:[exception reason]];
            NSString* javaScript = [pluginResult toErrorCallbackString:command.callbackId];
            [self writeJavascript:javaScript];
        }
    }
}

-(void) doSuccessCallback:(NSString*)granted {
    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:granted];
    NSString* javaScript = [pluginResult toSuccessCallbackString:self.callbackId];
    [self writeJavascript:javaScript];
}

@end

这是RecordPermission.h

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
#import <Cordova/CDV.h>

@interface RecordPermission : CDVPlugin{
    NSString* callbackId;
}

@property (nonatomic, retain) NSString* callbackId;

- (void)recordPermission:(NSArray*)arguments ;

@end

到目前为止,我无法触发权限,我选中了“设置”,其中应用未显示在“麦克风”页面上。

请帮忙!谢谢。

0 个答案:

没有答案