Как получить доступ к API телефонных разговоров с удаленной страницы

У меня есть следующая ситуация: у меня есть уже существующая удаленная веб-страница, и я хочу разработать приложение, которое использует эту страницу. Все идет нормально. Когда я запускаю приложение, загружается локальный index.html и перенаправляет ( window.open target: _self ) на внешний веб-сайт. Этот веб-сайт открывается в веб-просмотре phonegap. На внешнем веб-сайте я добавил cordova.js , чтобы получить доступ к родному API-интерфейсу. Но это работает неправильно. Событие deviceReady запускается правильно, но у меня нет доступа к API phonegap, например navigator.camera.

Как я могу это сделать, чтобы получить доступ к API?

Пожалуйста, не комментируйте, что AppStore будет отклонен и т. Д.

Спасибо за помощь!

Ну, для меня решение было смесью нескольких источников, но большая часть решения была найдена здесь .

Вы должны сделать следующее:

  1. Определите свой config.xml чтобы указать прямо на удаленный index.html .

     <content src="http://your-remote-location/index.html" /> 
  2. В вашей index.html любая ссылка на локальный ресурс устройства Android добавляется с некоторым уникальным префиксом типа **injection** . Например, для cordova.js вы придумаете что-то вроде:

     <script type="text/javascript" src="**injection**www/cordova.js"></script> 
  3. Найдите SystemWebViewClient.java в следующем расположении: your-project-location\platforms\android\CordovaLib\src\org\apache\cordova\engine .

  4. Добавьте следующую декларацию enum в раздел частных членов класса вверху:

     private enum WebExtension { PNG, MP3, MP4, TTF, SVG, JS, ICO, HTML, CSS, EOT, WOFF, JSON; } 
  5. Найдите метод shouldInterceptRequest и добавьте следующее после try { line:

     if(url != null && url.contains(INJECTION_TOKEN)) { String assetPath = url.substring(url.indexOf(INJECTION_TOKEN) + INJECTION_TOKEN.length(), url.length()); try { String mimeType = "text/plain"; String ext = assetPath.substring(assetPath.lastIndexOf(".") + 1, assetPath.length()); WebExtension extension = WebExtension.valueOf(ext.toUpperCase()); switch(extension) { case PNG: mimeType = "image/png"; break; case MP3: mimeType = "audio/mpeg"; break; case MP4: mimeType = "video/mp4"; break; case TTF: mimeType = "application/x-font-ttf"; break; case SVG: mimeType = "image/svg+xml"; break; case JS: mimeType = "application/javascript"; break; case ICO: mimeType = "image/x-icon"; break; case HTML: mimeType = "text/html"; break; case CSS: mimeType = "text/css"; break; case EOT: mimeType = "application/vnd.ms-fontobject"; break; case WOFF: mimeType = "application/x-font-woff"; break; case JSON: mimeType = "application/json"; break; } WebResourceResponse response = new WebResourceResponse( mimeType, "UTF-8", parentEngine.webView.getContext().getAssets().open(assetPath) ); return response; } catch (IOException e) { e.printStackTrace(); // Failed to load asset file } } 

Результатом всего этого будет перехват каждого запроса ресурса, и в случае, если в нем будет содержаться строка **injection** , он сократит местоположение ресурса и запросит его из локального местоположения устройства, в котором работает приложение , MimeType необходим для правильного загрузки ресурса браузером приложения.

Надеюсь, это поможет кому-то.

Включение скрипта cordova.js в удаленный сайт будет сложным, потому что для каждой платформы есть разные кордова.js. Вы можете изменить сервер так, чтобы он вернул правильный cordova.js на основе пользовательского агента, но это также сложно, потому что он будет включать этот скрипт при просмотре сайта из мобильного браузера, и это нежелательно, потому что ошибки JavaScript могут быть Показанному пользователю. Такая же история при просмотре сайта с настольного компьютера, cordova.js не должна включаться.

Мне кажется, что у вас есть локальная веб-страница (включая скрипт cordova), и оттуда вы переходите на удаленную страницу (в том числе скрипт). Я не уверен, что смена этой страницы будет работать. Если это сработает, вам придется подождать второго события deviceready.

Но вы можете просто установить страницу удаленного сайта в качестве корневой страницы в приложении cordova, без необходимости промежуточной страницы «загрузчика». Просто установите его в файле config.xml:

 <content src="http://your.website.fake/index.html" /> 

Вам нужно убедиться, что вы разрешаете загружать свой сайт в приложение. В этом же файле вы должны добавить:

 <access origin="http://your.website.fake" subdomains="true"/> 

У меня тоже была эта проблема, и изменения в файлах config.xml (теги контента и доступа) не сработали. Я проверил приложение, когда он работал по телефону, и я обнаружил, что когда я загружал удаленный сайт, некоторые файлы отсутствовали.

Прежде всего это файл cordova_plugins.js, который вы можете найти для каждой платформы в папке платформы. Тогда вам также понадобятся некоторые файлы с плагинами. Вы можете найти их, выполнив сборку и извлекая их оттуда. Для android путь следующий: APK / assets / www / plugins. Просто скопируйте содержимое на свой сервер, и вам хорошо идти.

ПРИМЕЧАНИЕ . Вы также можете найти файлы с плагинами в папке платформы, но они неполны, так как они отсутствуют. Cordova.define («… в начале. Это приводит к необходимости, а модуль не определен, поэтому просто выполните сборку И получить их оттуда.

Этот плагин решает проблему без необходимости кодировать себе решение для Android.

https://www.npmjs.com/package/cordova-plugin-remote-injection

https://github.com/TruckMovers/cordova-plugin-remote-injection

Удаленный инъекционный плагин позволяет удаленному сайту взаимодействовать с API-интерфейсом кордовой javascript при загрузке в ваше приложение cordova.

  • Внедряет кордову и установил плагин JS в веб-просмотр для любой удаленной страницы, позволяя им одинаковый доступ к объекту cordova и его плагинам в виде упакованного приложения cordova.

  • Поддержка платформ iOS и Android.

Я тестировал его, и он работает нормально. Единственное, что вам нужно запомнить, это то, что вам нужно подождать, пока кордова будет готова, например:

 <html> <head> </head> <body> <script> document.addEventListener("deviceready", function() { document.write("Now you can use plugins"); }, false); </script> </body> </html> 

Это ограничение Cordova / PhoneGap здесь :

  if (startFilePath == nil) { loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage]; NSLog(@"%@", loadErr); self.loadFromString = YES; appURL = nil; } 

Я отключил эту проверку в прошлом, чтобы позволить Кордове работать с нелокальными файловыми адресами.

Я работал над тем, чтобы он работал очень долго для быстрой отладки phoneGap, но не смог найти способ заставить API работать без наличия cordova.js вместе с приложением (а не на удаленном месте).

Я точно не знаю, почему это не работает. Если вы знаете внутреннюю работу, я с нетерпением жду ее услышать …

Последнее, что я пробовал, – поставить 100% на 100% iframe в основной html и загрузить локальный cordova.js в том же документе. Затем я смог использовать API, но в iOS были некоторые проблемы с масштабированием, что является еще одним вопросом …

Я не помню, как именно я реализовал и структурировал это, но я отредактирую, если найду его.

Intereting Posts
Как определить ориентацию обоев в android Java.util.zip.ZipException: повторная запись: android / support / v4 / accessibilityservice / AccessibilityServiceInfoCompatJellyBeanMr2.class Использование ksop2 для отправки больших файлов в веб-службу На Android сделайте запрос POST с данными URL-кодированной формы без использования UrlEncodedFormEntity Режим запуска «single top» для Android и onNewIntent Извлечение версии программного обеспечения Android Что убивается в потоке Android UI Facebook screenshot-tests-for-android thow NullPointer сделать снимок экрана Как изменить цвет определенной области на карте Google api v2 в андроиде Android-библиотека собирается с Gradle, но «пакет R не существует» при создании ошибки Используя запрос Sqlite, получите дату из хранимых миллисекунд Моя служба всегда получает Waited достаточно долго для: Ошибка ServiceRecord в Kitkat Андроидные фрагменты должны быть статическими ANR сбой через несколько секунд при остановке в точке останова в основной нити (поле AOSP – RK3288) Запустите приложение Phonegap в определенное время (будильник)