Ввод HTML-файла в Android WebView (Android 4.4, KitKat)
Я использовал <input type="file">
на андроиде. Я получил это работает благодаря этой теме: Загрузка файла в WebView
Но принятый ответ (или любой другой) больше не работает с Android 4.4 KitKat WebView.
Кто-нибудь знает, как это исправить?
Это не работает с целью 18 либо.
Я искал исходный код Android 4.4, и кажется, что WebChromeClient не изменился, но я думаю, setWebChromeClient
больше не работает на веб-просмотре Kitkat, или, по крайней мере, не openFileChooser
функция.
9 ответов
Обновление 2: есть более простой плагин для использования с phonegap / cordova
https://github.com/MaginSoft/MFileChooser
Обновление: пример проекта с плагином Cesidio DiBenedetto
https://github.com/jcesarmobile/FileBrowserAndroidTest
Я открыл вопрос о проекте Android с открытым исходным кодом, и ответ был:
Статус: WorkingAsIntended
к сожалению, openFileChooser не является публичным API. Мы работаем над публичным API в будущих версиях Android.
Для тех, кто использует phonegap / cordova, этот обходной путь был размещен на трекере ошибок:
Сесидио ДиБенедетто добавил комментарий - 28 марта /14 01:27
Привет всем, я тоже сталкивался с этой проблемой, поэтому я написал плагин Cordova FileChooser для "лейкопластыря" в настоящее время. Как правило, в Android 4.4(KitKat), как упоминалось в предыдущих комментариях, диалоговое окно файла не открывается. Однако событие onclick все еще запускается, поэтому вы можете вызвать плагин FileChooser, чтобы открыть диалоговое окно файла, и при выборе вы можете установить переменную, которая содержит полный путь к файлу. На этом этапе вы можете использовать плагин FileTransfer для загрузки на ваш сервер и подключиться к событию onprogress, чтобы показать прогресс. Этот плагин в основном настроен для Android 4.4, поэтому я бы порекомендовал продолжать использовать родные файловые диалоги для более ранних версий Android. Могут быть проблемы с плагином, так как я не полностью протестировал все возможные сценарии на многих устройствах, но я установил его на Nexus 5, и он работал нормально.
Не проверено, потому что я построил свой собственный обходной путь
Комментарий от разработчика хрома
В следующем основном выпуске мы добавим публичный API к WebViewClient для обработки запросов к файлам.
Кажется, они считают это сейчас ошибкой и собираются исправить
Мне удалось реализовать упомянутый обходной путь Cesidio DiBenedetto в моем приложении. Это работает отлично, но для тех, кто никогда не использовал PhoneGap/Cordove прежде (как я), это может быть немного сложно. Итак, вот небольшое руководство, которое я собрал во время его реализации.
Apache Cordova - это платформа, которая позволяет создавать многоплатформенные мобильные приложения, используя только веб-технологии. Ключевой особенностью является то, что он экспортирует нативный API в JavaScript и, следовательно, обеспечивает способ связи между веб-сайтом и нативным приложением. Типичное приложение PhoneGap/Cordova - это статический веб-сайт, который объединен со слоем Cordova в одном APK. Но вы можете использовать Cordova для отображения удаленного веб-сайта, и это наш случай.
Обходной путь работает следующим образом: вместо стандартного WebView
мы используем CordovaWebView
для отображения нашего сайта. Когда пользователь нажимает кнопку обзора, чтобы выбрать файл, мы ловим этот щелчок, используя стандартный JavaScript (jQuery...), и используя Cordova API, мы активируем плагин Chesidio DiBenedetto filechooser на нативной стороне, который открывает красивый файловый браузер. Когда пользователь выбирает файл, файл отправляется обратно на сторону JavaScript, откуда мы загружаем его на наш веб-сервер.
Важно знать, что вам нужно добавить поддержку Cordova на ваш сайт. Хорошо, теперь фактическое Howto...
Во-первых, вы должны добавить Cordova в ваше существующее приложение. Я следовал этой документации. Некоторые шаги были неясны для меня, поэтому я попытаюсь объяснить больше:
Загрузите и извлеките Cordova где-нибудь за пределами вашего приложения и соберите cordova-3.4.0.jar, как описано. Вероятно, в первый раз произойдет сбой, так как файл local.properties отсутствует. Вы будете проинструктированы, как создать это в выводе ошибки; вам просто нужно указать его на SDK, который вы используете для создания своего приложения для Android.
Скопируйте скомпилированный файл jar в каталог lib вашего приложения и добавьте jar в качестве библиотеки. Если вы используете Android Studio, как я, просто убедитесь, что у вас есть
compile fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
вdependencies
внутри build.gradle. Затем просто нажмите кнопку " Синхронизировать проект" с помощью кнопки gradle files, и все будет в порядке.Вам не нужно создавать файл /res/xml/main.xml. Вы можете обращаться с CordovaWebView так же, как со стандартным WebView, так что вы можете поместить его непосредственно в файл макета.
Теперь просто выполните шаги 5-7 в оригинальной документации, чтобы собрать свои собственные
Activity
гдеCordobaWebView
будет работать Это хорошая идея, чтобы проверить/framework/src/org/apache/cordova/CordovaActivity.java
в пакете Cordova, который вы скачали. Вы можете просто скопировать большинство методов, необходимых для реализации. Шаг 6. действительно важен для нашей цели, так как позволяет использовать плагин filechooser.Не копируйте файлы HTML и JavaScript в любом месте, мы добавим их на ваш сайт позже.
Не забудьте скопировать файл config.xml (вам не нужно его менять).
Чтобы загрузить ваш сайт в CordovaWebView
Просто передайте свой URL cwv.loadUrl()
вместо Config.getStartUrl()
,
Во-вторых, вы должны добавить плагин FileChooser в ваше приложение. Поскольку мы не используем стандартную настройку Cordova, мы не можем просто нажать cordova plugin add
как указано в файле readme, мы должны добавить его вручную.
Загрузите репозиторий и скопируйте исходные файлы в свое приложение. Убедитесь, что содержимое папки res идет в папку res вашего приложения. Вы можете игнорировать файл JavaScript на данный момент.
добавлять
READ_EXTERNAL_STORAGE
разрешение на ваше приложение.Добавьте следующий код в /res/xml/config.xml:
<feature name="FileChooser">
<param name="android-package" value="com.cesidiodibenedetto.filechooser.FileChooser" />
</feature>
Сейчас самое время добавить поддержку Cordova на ваш сайт. Это проще, чем кажется, вам просто нужно связать cordova.js с вашим сайтом, однако есть две вещи, о которых нужно знать.
Во-первых, каждая платформа (Android, iOS, WP) имеет свой собственный cordova.js, поэтому убедитесь, что вы используете версию Android (вы можете найти ее в пакете Cordova, который вы скачали в / Framework / assets / www).
Во-вторых, если ваш сайт будет доступен с обоих CordovaWebView
и стандартные браузеры (настольные или мобильные), как правило, рекомендуется загружать cordova.js только тогда, когда страница отображается в CordovaWebView
, Я нашел несколько способов обнаружить CordovaWebView
но следующий работал для меня. Вот полный код вашего сайта:
function getAndroidVersion(ua) {
var ua = ua || navigator.userAgent;
var match = ua.match(/Android\s([0-9\.]*)/);
return match ? parseFloat(match[1]) : false;
};
if (window._cordovaNative && getAndroidVersion() >= 4.4) {
// We have to use this ugly way to get cordova working
document.write('<script src="/js/cordova.js" type="text/javascript"></script>');
}
Обратите внимание, что мы также проверяем версию Android. Этот обходной путь требуется только для KitKat.
На этом этапе вы сможете вручную запустить плагин FileChooser со своего веб-сайта.
var cordova = window.PhoneGap || window.Cordova || window.cordova;
cordova.exec(function(data) {}, function(data) {}, 'FileChooser', 'open', [{}]);
Это должно открыть браузер файлов и позволит вам выбрать файл. Обратите внимание, что это можно сделать только после запуска устройства события. Чтобы проверить это, просто привяжите этот код к некоторой кнопке, используя jQuery.
Последний шаг - собрать все вместе и заставить работать форму загрузки. Чтобы достичь этого, вы можете просто следовать инструкциям Сезидио ДиБенедетто, описанным в README. Когда пользователь выбирает файл в FileChooser, путь к файлу возвращается обратно на сторону JavaScript, откуда другой плагин Cordova, FileTransfer, используется для фактической загрузки. Это означает, что файл загружен на родной стороне, а не в CordovaWebView
(если я правильно понимаю).
Мне не хотелось добавлять другой плагин Cordova в свое приложение, и я также не был уверен, как он будет работать с cookie-файлами (мне нужно отправлять cookie-файлы с запросом, потому что только авторизованные пользователи могут загружать файлы), поэтому я решил сделать это это мой путь. Я изменил плагин FileChooser, чтобы он не возвращал путь, а весь файл. Поэтому, когда пользователь выбирает файл, я читаю его содержимое, кодирую его, используя base64
передать его как JSON клиентской стороне, где я декодирую его и отправляю на сервер с помощью JavaScript. Это работает, но есть очевидный недостаток, так как base64 довольно требователен к процессору, поэтому приложение может немного зависнуть при загрузке больших файлов.
Для этого, возможно, сначала добавьте этот метод в FileUtils:
public static byte[] readFile(final Context context, final Uri uri) throws IOException {
File file = FileUtils.getFile(context, uri);
return org.apache.commons.io.FileUtils.readFileToByteArray(file);
}
Обратите внимание, что она использует библиотеку Apache Commons, поэтому не забудьте включить ее или реализовать чтение файлов другим способом, который не требует внешней библиотеки.
Затем измените метод FileChooser.onActivityResult, чтобы он возвращал содержимое файла вместо его пути:
// Get the URI of the selected file
final Uri uri = data.getData();
Log.i(TAG, "Uri = " + uri.toString());
JSONObject obj = new JSONObject();
try {
obj.put("filepath", FileUtils.getPath(this.cordova.getActivity(), uri));
obj.put("name", FileUtils.getFile(this.cordova.getActivity(), uri).getName());
obj.put("type", FileUtils.getMimeType(this.cordova.getActivity(), uri));
// attach the actual file content as base64 encoded string
byte[] content = FileUtils.readFile(this.cordova.getActivity(), uri);
String base64Content = Base64.encodeToString(content, Base64.DEFAULT);
obj.put("content", base64Content);
this.callbackContext.success(obj);
} catch (Exception e) {
Log.e("FileChooser", "File select error", e);
this.callbackContext.error(e.getMessage());
}
И, наконец, это код, который вы будете использовать на своем сайте (требуется jQuery):
var cordova = window.PhoneGap || window.Cordova || window.cordova;
if (cordova) {
$('form.fileupload input[type="file"]', context).on("click", function(e) {
cordova.exec(
function(data) {
var url = $('form.fileupload', context).attr("action");
// decode file from base64 (remove traling = first and whitespaces)
var content = atob(data.content.replace(/\s/g, "").replace(/=+$/, ""));
// convert string of bytes into actual byte array
var byteNumbers = new Array(content.length);
for (var i = 0; i < content.length; i++) {
byteNumbers[i] = content.charCodeAt(i);
}
var byteContent = new Uint8Array(byteNumbers);
var formData = new FormData();
var blob = new Blob([byteContent], {type: data.type});
formData.append('file', blob, data.name);
$.ajax({
url: url,
data: formData,
processData: false,
contentType: false,
type: 'POST',
success: function(data, statusText, xhr){
// do whatever you need
}
});
},
function(data) {
console.log(data);
alert("error");
},
'FileChooser', 'open', [{}]);
});
}
Ну вот и все. Мне потребовалось несколько часов, чтобы заставить это работать, поэтому я делюсь своими знаниями со скромной надеждой, что это может кому-то помочь.
Если кто-то все еще ищет решение для ввода файлов с помощью веб-просмотра на Kitkat.
openFileChooser не вызывается при нажатии на Android 4.4
https://code.google.com/p/android/issues/detail?id=62220
Для решения этой проблемы можно использовать библиотеку на основе хрома Crosswalk.
https://crosswalk-project.org/documentation/downloads.html
меры
1. Импортируйте проект xwalk_core_library android, загруженный по вышеуказанной ссылке, в ваш проект в виде библиотеки.
2. В свой макет XML добавьте следующее
<org.xwalk.core.XWalkView
android:id="@+id/webpage_wv"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
3. В методе onCreate вашей деятельности сделайте следующее
mXwalkView = (XWalkView) context.findViewById(R.id.webpage_wv);
mXwalkView.setUIClient(new UIClient(mXwalkView));
mXwalkView.load(navigateUrl, null); //navigate url is your page URL
Добавить переменные класса активности
private ValueCallback mFilePathCallback; частный XWalkView mXwalkView
Теперь должен появиться диалог ввода файла. Однако вам нужно будет предоставить обратные вызовы, чтобы получить файл и отправить его на сервер.
Вам нужно переопределить onActivityResult вашей активности
public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); if (mXwalkView != null) { if (mFilePathCallback != null) { Uri result = intent == null || resultCode != Activity.RESULT_OK ? null : intent.getData(); if (result != null) { String path = MediaUtility.getPath(getActivity(), result); Uri uri = Uri.fromFile(new File(path)); mFilePathCallback.onReceiveValue(uri); } else { mFilePathCallback.onReceiveValue(null); } } mFilePathCallback = null; } mXwalkView.onActivityResult(requestCode, resultCode, intent); }
Класс MediaUtility можно найти по адресу
Получить реальный путь от URI, Android KitKat новая структура доступа к хранилищу
Смотрите ответ Пола БёркаЧтобы получить объект данных для mFilePathCallback, создайте подкласс в своей деятельности.
class UIClient extends XWalkUIClient { public UIClient(XWalkView xwalkView) { super(xwalkView); } public void openFileChooser(XWalkView view, ValueCallback<Uri> uploadFile, String acceptType, String capture) { super.openFileChooser(view, uploadFile, acceptType, capture); mFilePathCallback = uploadFile; Log.d("fchooser", "Opened file chooser."); }
}
Вы все сделали. Загрузка файла теперь должна работать. Не забудьте добавить разрешения, необходимые для Crosswalk, в свой манифест.
использует-разрешение android:name="android.permission.ACCESS_FINE_LOCATION"
использует разрешение android:name="android.permission.ACCESS_NETWORK_STATE"
использует-разрешение android:name="android.permission.ACCESS_WIFI_STATE"
использует разрешение android:name="android.permission.CAMERA"
использует разрешение android:name="android.permission.INTERNET"
использование-разрешение android:name="android.permission.MODIFY_AUDIO_SETTINGS"
использует-разрешение android:name="android.permission.RECORD_AUDIO"
использует разрешение android:name="android.permission.WAKE_LOCK"
использует-разрешение android:name="android.permission.WRITE_EXTERNAL_STORAGE"
File Chooser в веб-браузере теперь работает в последней версии Android 4.4.3.
Пробовал сам, используя Nexus 5.
Несмотря на то, что Kitkat
версия не совместима с webview
тип = поле формы файла, мы могли бы использовать веб-представления addJavascriptInterface
метод для выполнения задачи загрузки файла. Серверная сторона должна судить версию Android, если она ниже, чем 4.4
используйте WebViewChromeClient
закрытые методы, если 4.4 или выше, позволяют серверу вызывать метод Android для связи друг с другом (например, асинхронный контент для загрузки файла)
// код
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new WebViewJavaScriptInterface(this), "app");
Вот ссылка, которая может помочь...
Я построил собственное решение этой проблемы, не используя библиотеки, плагины Cordova или пользовательские WebView, и оно работает должным образом во всех версиях Android.
Это решение включает в себя использование некоторого очень простого Javascript для связи между вашим веб-сайтом в WebView и приложении Android, а также выбор файлов и их загрузку непосредственно из приложения Android, удаление всех методов WebChromeClient openFileChooser(), showFileChooser() и onShowFileChooser ().
Первый шаг - вызвать консольное сообщение javascript с веб-сайта, когда пользователь нажимает на ввод файла и пишет уникальный код, который будет использоваться для загрузки файла с уникальным именем или путем. Например, объединение полной даты и времени с огромным случайным числом:
<input type="file" name="user_file" onclick="console.log('app.upload=20170405173025_456743538912');">
Затем ваше приложение может прочитать эти сообщения, переопределяя метод onCsoleMessage () WebChromeClient, обнаружить это сообщение, прочитать код и инициировать выбор файла:
webview.setWebChromeClient(new WebChromeClient() {
// Overriding this method you can read messages from JS console.
public boolean onConsoleMessage(ConsoleMessage message){
String messageText = message.message();
// Check if received message is a file upload and get the unique code
if(messageText.length()>11 && messageText.substring(0,11).equals("app.upload=")) {
String code = messageText.substring(11);
triggerFileUploadSelection(code);
return true;
}
return false;
}
});
Для выбора файла вы можете просто использовать простое намерение Android ACTION_PICK, например:
public void triggerFileUploadSelection(String code){
// For Android 6.0+ you must check for permissions in runtime to read from external storage
checkOrRequestReadPermission();
// Store code received from Javascript to use it later (code could also be added to the intent as an extra)
fileUploadCode = code;
// Build a simple intent to pick any file, you can replace "*/*" for "image/*" to upload only images if needed
Intent filePickerIntent = new Intent(Intent.ACTION_PICK);
filePickerIntent.setType("*/*");
// FILE_UPLOAD_CODE is just any unique integer request code to identify the activity result when the user selects the file
startActivityForResult( Intent.createChooser(filePickerIntent, getString(R.string.chooseFileToUpload) ), FILE_UPLOAD_CODE );
}
После того, как пользователь выбирает файл (или нет), вы можете получить файл Uri и преобразовать его в реальный путь к файлу с помощью:
@Override
public void onActivityResult (int requestCode, int resultCode, Intent data) {
if(requestCode==FILE_UPLOAD_CODE) {
if(data != null && resultCode == RESULT_OK){
// user selected a file
try{
Uri selectedFileUri = data.getData();
if(selectedFileUri!=null) {
// convert file URI to a real file path with an auxiliary function (below)
String filePath = getPath(selectedFileUri);
if(filePath!=null) {
// I got the file path, I can upload the file to the server (I pass webview as an argument to be able to update it when upload is completed)
uploadSelectedFile(getApplicationContext(), filePath, fileUploadCode, webview);
}else{
showToastFileUploadError();
}
}else{
showToastFileUploadError();
}
}catch (Exception e){
e.printStackTrace();
showToastFileUploadError();
}
}else{
// user didn't select anything
}
}
}
// I used this method for images, and it uses MediaStore.Images so you should probably
// use another method to get the path from the Uri if you are working with any kind of file
public String getPath(Uri uri) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
if(cursor==null)return null;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
Метод uploadSelectedFile просто создает объект со всей информацией внутри (filePath, fileUploadCode и WebView) и запускает AsyncTask, который загружает файл с использованием этой информации, и обновляет WebView, когда это будет сделано:
public static void uploadSelectedFile(Context c, String filePath, String code, WebView webView){
// YOU CAN SHOW A SPINNER IN THE WEB VIEW EXECUTING ANY JAVASCRIPT YOU WANT LIKE THIS:
webView.loadUrl("javascript: Element.show('my_upload_spinner');void 0");
// void 0 avoids at the end avoids some browser redirection problems when executing javascript commands like this
// CREATE A REQUEST OBJECT (you must also define this class with those three fields and a response field that we will use later):
FileUploadRequest request = new FileUploadRequest(filePath, code, webView);
// Trigger an async task to upload the file, and pass on the request object with all needed data
FileUploadAsyncTask task = new FileUploadAsyncTask();
task.execute(request);
}
AsyncTask получает объект запроса со всей информацией и использует MultipartUtility для создания многокомпонентного запроса и простой отправки его на сервер. Вы можете получить множество Java Multipart Utilities из разных мест, одно из них здесь: http://www.codejava.net/java-se/networking/upload-files-by-sending-multipart-request-programmatically
public class FileUploadAsyncTask extends AsyncTask<FileUploadRequest, Void, FileUploadRequest> {
@Override
protected FileUploadRequest doInBackground(FileUploadRequest... requests) {
FileUploadRequest request = requests[0];
try {
// Generate a multipart request pointing to the URL where you will receive uploaded file
MultipartUtility multipart = new MultipartUtility("http://www.example.com/file_upload.php", "UTF-8");
// Add a field called file_code, to send the code to the server script
multipart.addFormField("file_code", request.code);
// Add the file to the request
multipart.addFilePart("file_path", new File(request.filePath));
// Send the request to the server and get the response and save it back in the request object
request.response = multipart.finish(); // response from server.
} catch (IOException e) {
request.response = "FAILED";
e.printStackTrace();
}
return request;
}
Теперь мы загрузили файл на сервер и можем снова обновить наш веб-сайт, используя Javascript из нашего метода onPostExecute в нашей AsyncTask. Самое главное - установить код файла в скрытом поле в вашей форме, чтобы вы могли получить этот код, когда пользователь отправляет форму. Вы также можете показать сообщение на сайте или даже легко показать загруженное изображение (если это изображение):
@Override
protected void onPostExecute(FileUploadRequest request) {
super.onPostExecute(request);
// check for a response telling everything if upload was successful or failed
if(request.response.equals("OK")){
// set uploaded file code field in a hidden field in your site form (ESSENTIAL TO ASSOCIATE THE UPLOADED FILE WHEN THE USER SENDS THE WEBSITE FORM)
request.webView.loadUrl("javascript: document.getElementById('app_upload_code_hidden').value = '"+request.code+"';void 0");
// Hide spinner (optional)
//request.webView.loadUrl("javascript: Element.hide('my_upload_spinner');void 0");
// show a message in the website, or the uploaded image in an image tag setting the src attribute
// to the URL of the image you just uploaded to your server.
// (you must implement your own fullUrl method in your FileUploadRequest class)
// request.webView.loadUrl("javascript: document.getElementById('app_uploaded_image').src = '"+request.fullUrl()+"';void 0");
// request.webView.loadUrl("javascript: Element.show('app_uploaded_image');void 0");
}
}
Теперь часть Android закончена, и вам нужно работать на стороне сервера, чтобы получить файл, который вы загружаете через приложение Android AsyncTask, и сохранить его там, где вам нужно.
Вам также придется обрабатывать форму вашего веб-сайта, когда пользователь отправляет ее, и делать все, что вам нужно, с файлом, загруженным пользователем из приложения. Для этого вы получите код файла в форме (мы завершили его в поле в onPostExecute()), и вы должны использовать этот код файла, чтобы найти файл, загруженный приложением на ваш сервер. Для этого вы можете сохранить файл по пути, используя этот код в качестве имени файла, или сохранить код и путь, по которому вы загрузили файл, в базу данных.
Это решение опирается только на элементы, которые доступны и совместимы со всеми версиями Android, поэтому оно должно работать на любом устройстве (и я больше не получаю жалоб пользователей по этому поводу).
Если у вас есть несколько файловых входов на одной странице, вы можете отправить номер поля или дополнительный идентификатор вместе с уникальным кодом файла в исходном сообщении javascript, передать этот идентификатор во всем коде приложения и использовать его для обновления нужных элементов. в onPostExecute().
Здесь я немного изменил реальный код, так что если что-то не получится, возможно, это будет опечатка или какая-то незначительная деталь при переименовании нескольких вещей.
Это довольно много информации для обработки, поэтому, если кому-то нужны какие-либо разъяснения или предложения или исправления, пожалуйста, сообщите мне.
Новый файловый браузер Kitkat сходит с ума по Chrome, видя, что WebView теперь использует Chromium, это может быть связанной проблемой. Я обнаружил, что загрузка файлов прямо с камеры работает, но не из папки "Изображения". Если вместо этого вы должны были загрузить из "Галерея", те же файлы доступны. Гах.
Похоже, исправление готово, но в ожидании релиза:
Если вы собираетесь просто добавить обертку веб-просмотра вокруг своего веб-сайта и запустить ее как приложение, просто не оглядывайтесь по умолчанию с веб-просмотром Android по умолчанию, так или иначе, это огромная головная боль... для меня две вещи не сработали out 1. Входной файл 2. Целочисленная проверка извлечения (которая использует расширенный JS API)
Что я сделал, чтобы выйти из тьмы
Только что создал образец приложения с использованием Cordova. Намного проще, чем мы думаем.
- Установите Cordova со своей официальной страницы, создайте пример приложения.
- Это даст вам файл apk. (Ты понял)
Перейдите в папку www из созданного приложения и откройте index.js, найдите и замените строку на onDeviceReady: function () {window.open (' http://yourdomain.com/yourpage')} Запустите приложение еще раз, оно откроет сайт
Теперь мастер шаг. Пока что Кордова использует только умеренное веб-обозрение. Все должно измениться за один день. Добавьте плагин crosswalk в ваше приложение Cordova, оно заменит медленное веб-представление новым полноценным представлением хрома https://crosswalk-project.org/documentation/cordova.html
бежать
cordova clean
, затемcordova build --release
очистить старую сборку.- Откройте файл config.xml внутри каталога приложения, предоставленного приложением Cordva, и добавьте
<allow-navigation href="http://yourdomain.com/*" />
- Запустите приложение еще раз. Магия!.
При использовании crosswalk-webview-21.51.546.7 и выберите изображение через камеру. В onActivityResult() the intent.getData()
является null
, Это означает, что загрузка изображения камерой не может работать.