Подтвердить что ты не робот

Ввод HTML файла в веб-обозревателе Android (андроид 4.4, kitkat)

Я использовал <input type="file"> на веб-обозревателе Android. Я получил работу благодаря этой теме: Загрузка файлов в WebView

Но принятый ответ (или любой другой) больше не работает с веб-просмотром андроида 4.4 kitkat.

Кто-нибудь знает, как это исправить?

Он также не работает с объектом 18.

Я искал исходный код android 4.4, и кажется, что WebChromeClient не изменился, но я думаю, что setWebChromeClient больше не работает в веб-представлении kitkat или, по крайней мере, не в функции openFileChooser.

4b9b3361

Ответ 1

Обновление 2: Существует более простой плагин для использования с телефонной связью/кордорой.

https://github.com/MaginSoft/MFileChooser

Обновление: Пример проекта с плагином Cesidio DiBenedetto

https://github.com/jcesarmobile/FileBrowserAndroidTest

Я открыл issue в проекте с открытым исходным кодом Android, и ответ был:

Статус: WorkingAsIntended

К сожалению, openFileChooser не является общедоступным API. Мы работаем над открытым API в будущих выпусках Android.

Для тех, кто использует phonegap/cordova, это обходное решение было опубликовано на трекере ошибок:

Cesidio DiBenedetto добавил комментарий - 28/Mar/14 01:27

Привет всем, я тоже испытывал эту проблему, поэтому я написал Плагин Cordova FileChooser пока покажет "полосу". В основном, в Android 4.4 (KitKat), как упоминалось в предыдущих комментариях, диалоговое окно файла не открывается. Однако событие onclick по-прежнему, поэтому вы можете вызвать плагин FileChooser для откройте диалоговое окно файла и после выбора вы можете установить переменную, которая содержит полный путь к файлу. На этом этапе вы можете использовать Плагин FileTransfer для загрузки на ваш сервер и onprogress, чтобы показать прогресс. Этот плагин в основном настроен для Android 4.4, поэтому я бы рекомендовал продолжать использовать родной файлов для более ранних версий Android. Могут быть проблемы с плагином, поскольку я не полностью протестировал все возможные сценарии многие устройства, но я установил его на Nexus 5 и работал нормально.

https://github.com/cdibened/filechooser

Не тестировалось, потому что я построил собственное обходное решение

Форма комментария разработчика хрома

Мы добавим публичный API в WebViewClient в следующем крупном релиз для обработки запросов файлов.

Кажется, они считают это ошибкой сейчас, и они собираются ее исправить.

Ответ 2

Мне удалось реализовать упомянутое обходное решение Cesidio DiBenedetto в моем приложении. Он отлично работает, но для тех, кто никогда не использовал PhoneGap/Cordove раньше (как я), это может быть немного сложно. Итак, вот немного, как я собрал, когда я его реализовывал.

Apache Cordova - это платформа, которая позволяет создавать многоплатформенные мобильные приложения только с использованием веб-технологий. Ключевой особенностью является то, что он экспортирует собственный API в JavaScript и, следовательно, обеспечивает способ связи между веб-сайтом и родным приложением. Типичное приложение PhoneGap/Cordova - это статический веб-сайт, который поставляется вместе с слоем Cordova в одном APK. Но вы можете использовать Кордову для отображения удаленного сайта, и это наш случай.

Обходной путь работает следующим образом: вместо стандартного WebView мы используем CordovaWebView для отображения нашего веб-сайта. Когда пользователь нажимает кнопку выбора для выбора файла, мы получаем этот клик, используя стандартный JavaScript (jQuery...), и используя API Кордовы, мы активируем плагин Filejooser Cesidio DiBenedetto на родной стороне, который откроет хороший файловый браузер. Когда пользователь выбирает файл, файл отправляется обратно на сторону JavaScript, откуда мы загружаем его на наш веб-сервер.

Важно знать, что вам нужно добавить поддержку Кордовы на ваш сайт. Хорошо, теперь фактическое howto...

Во-первых, вам нужно добавить Кордову в существующее приложение. Я следил за этой документацией. Некоторые шаги были неясны для меня, поэтому я попытаюсь объяснить больше:

  • Загрузите и извлеките Кордову где-нибудь за пределами вашего приложения и создайте cordova-3.4.0.jar, как описано. Вероятно, он будет работать с ошибкой в ​​первый раз, поскольку файл local.properties отсутствует. Вам будет предложено создать его в выводе ошибки; вам просто нужно указать его на SDK, который вы используете для создания своего приложения для Android.

  • Скопируйте скомпилированный файл jar в каталог приложения lib и добавьте банку в качестве библиотеки. Если вы используете Android Studio, как я, просто убедитесь, что у вас есть compile fileTree(dir: 'libs', include: ['*.jar', '*.aar']) в dependencies внутри build.gradle. Затем просто нажмите проект синхронизации с gradle файлами, и все будет в порядке.

  • Вам не нужно создавать файл /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.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', [{}]);

Это должно открыть браузер файлов и позволить вам выбрать файл. Обратите внимание, что это можно сделать только после запуска события deviceready. Чтобы проверить его, просто привяжите этот код к некоторой кнопке с помощью jQuery.

Заключительный шаг - собрать все вместе и получить форму загрузки.. Чтобы достичь этого, вы можете просто следовать инструкциям Cesidio DiBenedetto, описанным в README. Когда пользователь выбирает файл в FileChooser, путь к файлу возвращается обратно на сторону JavaScript, из которого для фактической загрузки используется другой плагин Cordova, FileTransfer. Это означает, что файл загружается с внутренней стороны, а не в CordovaWebView (если я правильно понимаю).

Мне не хотелось добавлять в приложение еще один плагин Cordova, и я также не был уверен, как он будет работать с кукисами (мне нужно отправить файлы 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', [{}]);
    });
}

Ну, это все. Мне потребовалось несколько часов, чтобы добиться этой работы, поэтому я могу поделиться своими знаниями с скромной надеждой, что это может помочь кому-то.

Ответ 3

Если кто-то все еще ищет решение для ввода файлов с помощью webview на kitkat.

openFileChooser не вызывается при нажатии на Android 4.4
https://code.google.com/p/android/issues/detail?id=62220

Для решения этой проблемы можно использовать библиотеку на основе хрома, называемую Crosswalk,
https://crosswalk-project.org/documentation/downloads.html

Steps
1. Импортируйте проект Android xwalk_core_library, загруженный из приведенной выше ссылки в ваш проект в качестве библиотеки
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
  1. Добавить активность Переменные класса

    private ValueCallback mFilePathCallback; частный XWalkView mXwalkView

  2. Теперь появится диалоговое окно ввода файлов. Однако вам нужно будет предоставить обратные вызовы, чтобы получить файл и отправить его на сервер.

  3. Вам нужно будет переопределить 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);
    
    }
    
  4. Класс MediaUtility можно найти в
    Получить реальный путь от URI, новой системы доступа к хранилищу Android KitKat
    См. Ответ Пола Берка.

  5. Чтобы получить объект данных для 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.");
    }
    

    }

  6. Вы все закончили. Теперь файловая загрузка должна работать. Не забудьте добавить разрешения, необходимые для Crosswalk, в ваш манифест.

    use-permission android: name= "android.permission.ACCESS_FINE_LOCATION"
    use-permission android: name= "android.permission.ACCESS_NETWORK_STATE"
    use-permission android: name= "android.permission.ACCESS_WIFI_STATE"
    use-permission android: name= "android.permission.CAMERA"
    use-permission android: name= "android.permission.INTERNET"
    use-permission android: name= "android.permission.MODIFY_AUDIO_SETTINGS"
    use-permission android: name= "android.permission.RECORD_AUDIO"
    use-permission android: name= "android.permission.WAKE_LOCK"
    use-permission android: name= "android.permission.WRITE_EXTERNAL_STORAGE"

Ответ 4

File Chooser в веб-просмотре теперь работает в последней версии Android 4.4.3.

Пробовал сам, используя Nexus 5.

Ответ 5

Несмотря на то, что версия Kitkat не совместима с полем webview type = file form, мы могли бы использовать метод webview addJavascriptInterface для выполнения задачи загрузки файлов. Серверная сторона должна судить о версии для Android, если она меньше, чем 4.4, используйте частные методы t24 > , если 4.4 или выше, позвольте серверу обращаться к методу android для связи друг с другом (например, загружать содержимое файла async)

//код

webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new WebViewJavaScriptInterface(this), "app");


Вот ссылка, которая может помочь...

call-android-methods-from-javascript

Ответ 6

Я создал собственное решение для этой проблемы без использования каких-либо библиотек, плагинов Cordova или пользовательских WebView, и он работает правильно во всех версиях Android.

Это решение включает в себя использование очень простого Javascript для связи между вашим сайтом в WebView и приложении для Android, а также для выбора и загрузки файлов непосредственно из приложения Android, удаления всех openFileChooser(), showFileChooser() и onShowFileChooser() Методы WebChromeClient.

Первый шаг: вызвать сообщение консоли javascript с веб-сайта, когда пользователь нажимает на ввод файла, написание уникального кода, который будет использоваться для загрузки файла с уникальным именем или путем. Например, объединяя полное datetime с огромным случайным числом:

<input type="file" name="user_file" onclick="console.log('app.upload=20170405173025_456743538912');">

Затем ваше приложение может читать эти сообщения, переопределяя метод WebChromeClient onConsoleMessage(), обнаруживать это сообщение, читать код и выбор файла триггеров:

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 завершена, и вам нужно работать на стороне сервера, чтобы получить файл, который вы загружаете через приложение AsyncTask для Android и сохраняете его там, где вам нужно.

Вам также придется обработать ваш веб-сайт, когда пользователь отправит его, и сделайте все, что вам нужно, с файлом, загруженным пользователем из приложения. Для этого вы получите код файла в форме (мы завершили это в поле onPostExecute()), и вам нужно использовать этот код файла, чтобы найти файл, который приложение загрузило, чтобы ваш сервер. Для этого вы можете сохранить файл в пути, используя этот код в качестве имени файла, или сохранить код и путь, по которому вы загрузили файл в базу данных.

Это решение основывается только на элементах, которые доступны и совместимы со всеми версиями Android, поэтому они должны работать на любом устройстве (и я больше не жаловался пользователям об этом).

Если на одной странице есть несколько файлов, вы можете отправить номер поля или дополнительный идентификатор вместе с уникальным файловым кодом в исходном сообщении javascript, пройти этот идентификатор во всем коде приложения и использовать его для обновления правильных элементов в onPostExecute().

Я немного изменил фактический код здесь, поэтому, если что-то не удастся, возможно, это будет опечатка или некоторые мелкие детали при переименовании нескольких вещей.

Достаточно много информации для обработки, поэтому, если кто-либо нуждается в каких-либо разъяснениях или у вас есть предложения или исправления, пожалуйста, скажите мне.

Ответ 7

Новый браузер файлов Kitkat в браузере одинаково сумасшедший, так как теперь WebView использует Chromium, это может быть связано с проблемой. Я обнаружил, что загрузка файлов прямо из камеры работает, но не из папки "Изображения". Если вы загрузили из "Галерея", то те же файлы доступны. Г.

Кажется, что исправление готово, но ожидает выхода:

https://code.google.com/p/chromium/issues/detail?id=278640

Ответ 8

если вы собираетесь просто добавить веб-обозреватель вокруг своего веб-сайта и запустить его в качестве приложения, просто не смотрите вокруг с веб-браузером по умолчанию, так или иначе это огромная головная боль.. для меня две вещи сделали 't work out 1. Входной файл 2. Целочисленная проверка целостности (которая использует расширенный JS API)

Что я сделал, чтобы выйти из темноты

Просто создал образец приложения, используя Кордову. Это гораздо проще, чем мы думаем.

  • Установите Кордову со своей официальной страницы, создайте пример приложения.
  • Он предоставит вам файл apk. (Вы получили его)
  • Перейдите в папку www из созданного приложения и откройте index.js, найдите и замените строку onDeviceReady: function() {window.open(' http://yourdomain.com/yourpage')} Запустите приложение еще раз, он откроет сайт

  • Теперь мастер-шаг. До сих пор Кордова не использует ничего, кроме умеренного веб-обзора. В один прекрасный день все должно измениться. Добавьте плагин для пешеходных переходов в приложение Cordova, он заменит вялый webview совершенно новым полноцветным представлением хрома https://crosswalk-project.org/documentation/cordova.html

  • запустите cordova clean, затем cordova build --release, чтобы очистить старую сборку.

  • Откройте файл config.xml внутри каталога приложения, заданного приложением Cordva, и добавьте <allow-navigation href="http://yourdomain.com/*" />
  • Запустите приложение еще раз. Магия!.

Ответ 9

При использовании crosswalk-webview-21.51.546.7 и выберите изображение с помощью камеры. В onActivityResult() the intent.getData() есть null. Это означает, что загрузка изображения камерой невозможна.