3

Кажется, не найдено объяснений. В настоящее время я использую Visual Studio 2015 RC. Установил плагин камеры, и я использую пример Кордовы в качестве базы. Однако проблема заключается в том, что я не могу получить доступ к плагину, если этот код находится за пределами страницы index.html.Доступ к плагину Cordova navigator.camera за пределами index.html не указан

Я пробовал ссылаться на Cordova.js на свою вторую страницу, но это не помогает. Как получить доступ к плагину камеры за пределами index.html? Это код, я использую из примеров Кордова:

Index Page:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <title>CordovaApp</title> 

    <!-- CordovaApp references --> 
    <link href="css/index.css" rel="stylesheet" /> 
    <script src="scripts/jquery/jquery-2.1.4.min.js"></script> 
    <script src="scripts/jquery.mobile-1.4.5/jquery.mobile-1.4.5.min.js"></script> 
    <script> 
     $(document).on('pagecreate', function() { 
      $("#submitLogin").on("click", function() { 
       MoveToPage("/test.html"); 
      }); 
      function MoveToPage(page) { 
       var dirPath = dirname(location.href); 
       fullPath = dirPath + page; 
       window.location.href = fullPath; 

       function dirname(path) { 
        return path.replace(/\\/g, '/').replace(/\/[^\/]*$/, ''); 
       } 
      } 
     }); 

     //***For the sake of having it on two pages 
     var pictureSource; 
     var destinationType; 

     document.addEventListener("deviceready", onDeviceReady, false); 

     function onDeviceReady() { 
      pictureSource = navigator.camera.PictureSourceType; 
      destinationType = navigator.camera.DestinationType; 
     } 

     function onPhotoDataSuccess(imageData) { 
      var smallImage = document.getElementById('smallImage'); 
      smallImage.style.display = 'block'; 
      smallImage.src = "data:image/jpeg;base64," + imageData; 
     } 
     function onPhotoURISuccess(imageURI) { 
      var largeImage = document.getElementById('largeImage'); 
      largeImage.style.display = 'block'; 
      largeImage.src = imageURI; 
     } 
     function capturePhoto() { 
      navigator.camera.getPicture(onPhotoDataSuccess, onFail, { 
       quality: 50, 
       destinationType: destinationType.DATA_URL 
      }); 
     } 
     function capturePhotoEdit() { 
      navigator.camera.getPicture(onPhotoDataSuccess, onFail, { 
       quality: 20, allowEdit: true, 
       destinationType: destinationType.DATA_URL 
      }); 
     } 
     function getPhoto(source) { 
      navigator.camera.getPicture(onPhotoURISuccess, onFail, { 
       quality: 50, 
       destinationType: destinationType.FILE_URI, 
       sourceType: source 
      }); 
     } 
     function onFail(message) { 
      alert('Failed because: ' + message); 
     } 
    </script> 
</head> 
<body> 
    <button style="color:white; background-color:dodgerblue;" id="submitLogin">Log In</button> 

    <!-- Cordova reference, this is added to your app when it's built. --> 
    <script src="cordova.js"></script> 
    <script src="scripts/platformOverrides.js"></script> 

    <script src="scripts/index.js"></script> 
</body> 
</html> 

Вторая страница:

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Capture Photo</title> 

    <script type="text/javascript" charset="utf-8" src="cordova.js"></script> 
    <script type="text/javascript" charset="utf-8"> 

    var pictureSource; // picture source 
    var destinationType; // sets the format of returned value 

    // Wait for device API libraries to load 
    // 
    document.addEventListener("deviceready",onDeviceReady,false); 

    // device APIs are available 
    // 
    function onDeviceReady() { 
     pictureSource=navigator.camera.PictureSourceType; 
     destinationType=navigator.camera.DestinationType; 
    } 

    // Called when a photo is successfully retrieved 
    // 
    function onPhotoDataSuccess(imageData) { 
     // Uncomment to view the base64-encoded image data 
     // console.log(imageData); 

     // Get image handle 
     // 
     var smallImage = document.getElementById('smallImage'); 

     // Unhide image elements 
     // 
     smallImage.style.display = 'block'; 

     // Show the captured photo 
     // The in-line CSS rules are used to resize the image 
     // 
     smallImage.src = "data:image/jpeg;base64," + imageData; 
    } 

    // Called when a photo is successfully retrieved 
    // 
    function onPhotoURISuccess(imageURI) { 
     // Uncomment to view the image file URI 
     // console.log(imageURI); 

     // Get image handle 
     // 
     var largeImage = document.getElementById('largeImage'); 

     // Unhide image elements 
     // 
     largeImage.style.display = 'block'; 

     // Show the captured photo 
     // The in-line CSS rules are used to resize the image 
     // 
     largeImage.src = imageURI; 
    } 

    // A button will call this function 
    // 
    function capturePhoto() { 
     // Take picture using device camera and retrieve image as base64-encoded string 
     navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 50, 
     destinationType: destinationType.DATA_URL }); 
    } 

    // A button will call this function 
    // 
    function capturePhotoEdit() { 
     // Take picture using device camera, allow edit, and retrieve image as base64-encoded string 
     navigator.camera.getPicture(onPhotoDataSuccess, onFail, { quality: 20, allowEdit: true, 
     destinationType: destinationType.DATA_URL }); 
    } 

    // A button will call this function 
    // 
    function getPhoto(source) { 
     // Retrieve image file location from specified source 
     navigator.camera.getPicture(onPhotoURISuccess, onFail, { quality: 50, 
     destinationType: destinationType.FILE_URI, 
     sourceType: source }); 
    } 

    // Called if something bad happens. 
    // 
    function onFail(message) { 
     alert('Failed because: ' + message); 
    } 

    </script> 
    </head> 
    <body> 
    <button onclick="capturePhoto();">Capture Photo</button> <br> 
    <button onclick="capturePhotoEdit();">Capture Editable Photo</button> <br> 
    <button onclick="getPhoto(pictureSource.PHOTOLIBRARY);">From Photo Library</button><br> 
    <button onclick="getPhoto(pictureSource.SAVEDPHOTOALBUM);">From Photo Album</button><br> 
    <img style="display:none;width:60px;height:60px;" id="smallImage" src="" /> 
    <img style="display:none;" id="largeImage" src="" /> 
    </body> 
</html> 

EDIT: Я обнаружил, что кнопка я создал на мой индекс страницы использования :

window.location = path; 

Когда я сменил эту кнопку на якорный тег, javascript с индексной страницы остается l oaded, и я могу получить доступ к камере на другой странице. Это все еще проблема для меня, поскольку я хочу иметь возможность использовать событие onclick на странице индекса для проверки моего пользователя, прежде чем он сможет получить доступ к следующей странице и к камере. Это также означало бы, что мне придется загружать весь мой javascript на первую страницу, которую я не хочу делать. Во всяком случае, вокруг?

EDIT: Возможная дополнительная информация, которая может быть полезна. Я установил плагин с помощью Visual Studio 2015 RC. Создал пустую приложение Cordova и установил плагин, дважды щелкнув config.xml> Plugins> Camera> Add. Моя config.xml выглядит так:

<?xml version="1.0" encoding="utf-8"?> 
<widget xmlns:cdv="http://cordova.apache.org/ns/1.0" xmlns:vs="http://schemas.microsoft.com/appx/2014/htmlapps" id="io.cordova.myappc768b8113d304787b0649513e48ca2c4" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" defaultlocale="en-US"> 
    <name>CordovaApp2</name> 
    <description>A blank project that uses Apache Cordova to help you build an app that targets multiple mobile platforms: Android, iOS, Windows, and Windows Phone.</description> 
    <author href="http://cordova.io" email="[email protected]">Apache Cordova Team </author> 
    <content src="index.html" /> 
    <access origin="*" /> 
    <vs:features /> 
    <preference name="SplashScreen" value="screen" /> 
    <preference name="windows-target-version" value="8.1" /> 
    <preference name="windows-phone-target-version" value="8.1" /> 
    <platform name="android"> 
    <icon src="res/icons/android/icon-36-ldpi.png" density="ldpi" /> 
    <icon src="res/icons/android/icon-48-mdpi.png" density="mdpi" /> 
    <icon src="res/icons/android/icon-72-hdpi.png" density="hdpi" /> 
    <icon src="res/icons/android/icon-96-xhdpi.png" density="xhdpi" /> 
    </platform> 
    <platform name="ios"> 
    <!-- iOS 8.0+ --> 
    <!-- iPhone 6 Plus --> 
    <icon src="res/icons/ios/icon-60-3x.png" width="180" height="180" /> 
    <!-- iOS 7.0+ --> 
    <!-- iPhone/iPod Touch --> 
    <icon src="res/icons/ios/icon-60.png" width="60" height="60" /> 
    <icon src="res/icons/ios/icon-60-2x.png" width="120" height="120" /> 
    <!-- iPad --> 
    <icon src="res/icons/ios/icon-76.png" width="76" height="76" /> 
    <icon src="res/icons/ios/icon-76-2x.png" width="152" height="152" /> 
    <!-- iOS 6.1 --> 
    <!-- Spotlight Icon --> 
    <icon src="res/icons/ios/icon-40.png" width="40" height="40" /> 
    <icon src="res/icons/ios/icon-40-2x.png" width="80" height="80" /> 
    <!-- iPhone/iPod Touch --> 
    <icon src="res/icons/ios/icon-57.png" width="57" height="57" /> 
    <icon src="res/icons/ios/icon-57-2x.png" width="114" height="114" /> 
    <!-- iPad --> 
    <icon src="res/icons/ios/icon-72.png" width="72" height="72" /> 
    <icon src="res/icons/ios/icon-72-2x.png" width="144" height="144" /> 
    <!-- iPhone Spotlight and Settings Icon --> 
    <icon src="res/icons/ios/icon-small.png" width="29" height="29" /> 
    <icon src="res/icons/ios/icon-small-2x.png" width="58" height="58" /> 
    <!-- iPad Spotlight and Settings Icon --> 
    <icon src="res/icons/ios/icon-50.png" width="50" height="50" /> 
    <icon src="res/icons/ios/icon-50-2x.png" width="100" height="100" /> 
    </platform> 
    <platform name="windows"> 
    <icon src="res/icons/windows/Square150x150Logo.scale-100.png" width="150" height="150" /> 
    <icon src="res/icons/windows/Square150x150Logo.scale-240.png" width="360" height="360" /> 
    <icon src="res/icons/windows/Square30x30Logo.scale-100.png" width="30" height="30" /> 
    <icon src="res/icons/windows/Square310x310Logo.scale-100.png" width="" height="" /> 
    <icon src="res/icons/windows/Square44x44Logo.scale-240.png" width="106" height="106" /> 
    <icon src="res/icons/windows/Square70x70Logo.scale-100.png" width="70" height="70" /> 
    <icon src="res/icons/windows/Square71x71Logo.scale-240.png" width="170" height="170" /> 
    <icon src="res/icons/windows/StoreLogo.scale-100.png" width="50" height="50" /> 
    <icon src="res/icons/windows/StoreLogo.scale-240.png" width="120" height="120" /> 
    <icon src="res/icons/windows/Wide310x150Logo.scale-100.png" width="310" height="150" /> 
    <icon src="res/icons/windows/Wide310x150Logo.scale-240.png" width="744" height="360" /> 
    </platform> 
    <platform name="wp8"> 
    <icon src="res/icons/wp8/ApplicationIcon.png" width="62" height="62" /> 
    <icon src="res/icons/wp8/Background.png" width="173" height="173" /> 
    </platform> 
    <platform name="android"> 
    <splash src="res/screens/android/screen-hdpi-landscape.png" density="land-hdpi" /> 
    <splash src="res/screens/android/screen-ldpi-landscape.png" density="land-ldpi" /> 
    <splash src="res/screens/android/screen-mdpi-landscape.png" density="land-mdpi" /> 
    <splash src="res/screens/android/screen-xhdpi-landscape.png" density="land-xhdpi" /> 
    <splash src="res/screens/android/screen-hdpi-portrait.png" density="port-hdpi" /> 
    <splash src="res/screens/android/screen-ldpi-portrait.png" density="port-ldpi" /> 
    <splash src="res/screens/android/screen-mdpi-portrait.png" density="port-mdpi" /> 
    <splash src="res/screens/android/screen-xhdpi-portrait.png" density="port-xhdpi" /> 
    </platform> 
    <platform name="ios"> 
    <splash src="res/screens/ios/screen-iphone-portrait.png" width="320" height="480" /> 
    <splash src="res/screens/ios/screen-iphone-portrait-2x.png" width="640" height="960" /> 
    <splash src="res/screens/ios/screen-ipad-portrait.png" width="768" height="1024" /> 
    <splash src="res/screens/ios/screen-ipad-portrait-2x.png" width="1536" height="2048" /> 
    <splash src="res/screens/ios/screen-ipad-landscape.png" width="1024" height="768" /> 
    <splash src="res/screens/ios/screen-ipad-landscape-2x.png" width="2048" height="1536" /> 
    <splash src="res/screens/ios/screen-iphone-568h-2x.png" width="640" height="1136" /> 
    <splash src="res/screens/ios/screen-iphone-portrait-667h.png" width="750" height="1334" /> 
    <splash src="res/screens/ios/screen-iphone-portrait-736h.png" width="1242" height="2208" /> 
    <splash src="res/screens/ios/screen-iphone-landscape-736h.png" width="2208" height="1242" /> 
    </platform> 
    <platform name="windows"> 
    <splash src="res/screens/windows/SplashScreen.scale-100.png" width="620" height="300" /> 
    <splash src="res/screens/windows/SplashScreen.scale-240.png" width="1152" height="1920" /> 
    <splash src="res/screens/windows/SplashScreenPhone.scale-240.png" width="1152" height="1920" /> 
    </platform> 
    <platform name="wp8"> 
    <splash src="res/screens/wp8/SplashScreenImage.jpg" width="480" height="800" /> 
    </platform> 
    <vs:plugin name="org.apache.cordova.camera" version="0.3.6" /> 
    <feature name="Camera"> 
    <param name="android-package" value="org.apache.cordova.CameraLauncher" /> 
    </feature> 
</widget> 
+0

ли плагин установлен должным образом в первое место, это сценарий плагина, загружаемый полностью при доступе к нему в любом месте вашего проекта или вы хотите получить к нему доступ сразу после того, как событие deviceready было запущено он может быть еще не загружен? – Blauharley

+0

Да, плагин установлен правильно. Я попытался начать новый проект и переустановить плагин. Я могу получить доступ к нему на индексной странице, но когда я перехожу на другую страницу, плагин больше не доступен. Я собираюсь добавить некоторую информацию, которую я понял в своем оригинальном посте. – James

+0

@James - я опробовал ваш образец кода в index.html, а также создал вторую страницу, с которой я перешел к использованию window.location = path. Это сработало для меня, пока вторая страница ссылается на cordova.js перед запуском кода, который должен получить доступ к плагину камеры. Когда вы пытаетесь это сделать, вы видите сообщения об ошибках в консоли JavaScript? –

ответ

1

Это не воспроизводит на простой проект с Кордова 4.3.0 и VS 2015 RC при использовании якоря или window.location.href для перехода ко второй странице. Если вы действительно переходите на другую страницу, вам нужно убедиться, что вы добавили ссылку на скрипт cordova.js на эту вторую страницу. Ниже приведены страницы, иллюстрирующие эту работу.

Более чем вероятно, что происходит это одна из следующих вещей:

  1. «Одно приложение страницы» JavaScript рамки часто добавлять обработчики событий к элементам, как якоря, так что при нажатии на них они загружают страницу за сцены и выцветать в использовании эффекта перехода. Однако то, что он делает, фактически удерживает вас на одной странице с точки зрения «окна». DOM не разгружается, и вам не нужно перезагружать весь ваш JS-код. Хорошие фреймворки также будут обновлять историю навигации, поэтому будут работать такие вещи, как кнопка «Назад». Я считаю, что jQuery mobile является одной из этих фреймворков. Подобные API-интерфейсы обычно предоставляют какой-то API, чтобы сделать это за кулисами, переход от кода. Тем не менее, явный вызов window.location обойдет вашу инфраструктуру JavaScript и заставит ее сбросить все содержимое DOM, и вам придется перезагрузить весь ваш JavaScript, включая cordova.js. (Не отличается от того, если вы переходите от http://www.microsoft.com к http://www.bing.com. Это критическая функция безопасности.) Чтобы обойти это, вам не следует перемещаться с использованием window.location и вместо этого использовать API-интерфейсы API-интерфейса SPA для перехода на страницу.
  2. Если вы ссылаетесь на cordova.js на второй странице вместе со всем вашим кодом JavaScript, вы могли бы хитать исключение JavaScript ранее в своем коде, что вызывает загрузку cordova.js, которая не возникает, поскольку выполнение остановлено из-за исключение.
  3. Существует проблема, которую мы только что идентифицировали при проверке определенных файлов в исходном элементе управления.Недавно мы обнаружили, что проверка файлов android.json, windows.json, wp8.json или remote_ios.json в папке плагинов может вызвать странное поведение, когда сборка завершается успешно, но плагины не работают. Единственным признаком, что есть проблема, является то, что вы увидите исключение в окне вывода. См. Tools for Apache Cordova - Installed Plugins are skipped in build

Чтобы увидеть это правильно. Добавьте эти файлы в пустой проект, а затем добавьте плагин камеры через конструктор конфигурации, чтобы увидеть, что работает со второй страницы. Камера откроется, и вы сможете сделать снимок. Нажатие на якорь или кнопку переместится на вторую страницу, а затем сделает то же самое.

WWW/index.html:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <title>Second Page Test</title> 
    <link href="css/index.css" rel="stylesheet" /> 
</head> 
<body> 
    <a href="page2.html">Click to go to page 2 via anchor!</a> 
    <button id="gotopage2">Click to go to page 2 via window.location.href</button> 
    <!-- Cordova reference, this is added to your app when it's built. --> 
    <script src="cordova.js"></script> 
    <script src="scripts/platformOverrides.js"></script> 
    <script src="scripts/index.js"></script> 
    <img id="myImage" src="#"/> 
</body> 
</html> 

WWW/page2.html:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <title>Second Page Test</title> 
    <link href="css/index.css" rel="stylesheet" /> 
</head> 
<body> 
    <!-- Cordova reference, this is added to your app when it's built. --> 
    <script src="cordova.js"></script> 
    <script src="scripts/platformOverrides.js"></script> 
    <script src="scripts/index.js"></script> 
    <img id="myImage" src="#" /> 
</body> 
</html> 

WWW/скрипты/index.js:

(function() { 
    "use strict"; 

    document.addEventListener('deviceready', onDeviceReady.bind(this), false); 

    function onDeviceReady() { 
     // Handle the Cordova pause and resume events 
     document.addEventListener('pause', onPause.bind(this), false); 
     document.addEventListener('resume', onResume.bind(this), false); 

     var page2button = document.getElementById("gotopage2") 
     if (page2button) { 
      page2button.addEventListener("click", function() { 
       window.location.href = "page2.html"; 
      }); 
     } 
     navigator.camera.getPicture(onSuccess, onFail, { 
      quality: 50, 
      destinationType: Camera.DestinationType.DATA_URL 
     }); 

     function onSuccess(imageData) { 
      var image = document.getElementById('myImage'); 
      image.src = "data:image/jpeg;base64," + imageData; 
     } 

     function onFail(message) { 
      alert('Failed because: ' + message); 
     } 
    }; 

    function onPause() { 
     // TODO: This application has been suspended. Save application state here. 
    }; 

    function onResume() { 
     // TODO: This application has been reactivated. Restore application state here. 
    }; 
})(); 
+0

Извините за поздний ответ, я смог исправить свои проблемы с помощью jQuery mobile до этого сообщения, но причиной вашего номера было «1». Благодаря! – James

Смежные вопросы