Проблема с загрузкой веб-сайта Android 2.3

I'm using webview to run my web application, In my app I'm allowing the user to upload images to my server, everything is working fine on android > 3, on Android 2.3.3 browser it also working as expected but on the webview the file is not populated in the and my server is getting an empty object. It is happening only when I'm taking the picture from the camera (i.e. regular gallery is working fine). I noticed the the Uri are different one with file:/// and one with content:///

Прилагается мой код: HTML (моя простая тестовая страница):

<!DOCTYPE HTML>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
<form id="fuForm" name="fuForm" action="/questions/upload" method="POST" enctype="multipart/form-data">

    
<input type="file" name="fileToUpload" id="fileToUpload"/> <input type="submit"/> </form> </body> </html>

Код MainActivity:

    webView = (WebView) findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setSavePassword(false);
    webView.getSettings().setSaveFormData(false);
    webView.setWebViewClient(new MyWebViewClient());
    webView.setWebChromeClient(new MyWebChromeViewClient());  
    webView.loadUrl(url);


    private class MyWebViewClient extends WebViewClient {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        }

        private class MyWebChromeViewClient extends WebChromeClient {
            //@Override
            public void openFileChooser(ValueCallback uploadMsg, String acceptType )  {      
                 File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");
               //Create the storage directory if it does not exist
                if (! imageStorageDir.exists()){
                    imageStorageDir.mkdirs();                  
                }
                File file = new File(imageStorageDir + File.separator + "IMG_" + String.valueOf(System.currentTimeMillis()) + ".jpg");  
                imageUri = Uri.fromFile(file); 

                final List cameraIntents = new ArrayList();
                final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                final PackageManager packageManager = getPackageManager();
                final List listCam = packageManager.queryIntentActivities(captureIntent, 0);
                for(ResolveInfo res : listCam) {
                    final String packageName = res.activityInfo.packageName;
                    final Intent intent = new Intent(captureIntent);
                    intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                    intent.setPackage(packageName);
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                    cameraIntents.add(intent);
                }


                uploadMessage = uploadMsg; 
                Intent intent = new Intent(Intent.ACTION_GET_CONTENT);  
                intent.addCategory(Intent.CATEGORY_OPENABLE);  
                intent.setType("image/*"); 
                Intent chooserIntent = Intent.createChooser(intent,"Image Chooser");
                chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
                activity.startActivityForResult(chooserIntent,  FILECHOOSER_RESULTCODE); 
            }

  //For Android < 3.0
        @SuppressWarnings("unused")
        public void openFileChooser(ValueCallback uploadMsg) {
            openFileChooser(uploadMsg, "");
        }

    }

   @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
       //super.onActivityResult(requestCode, resultCode, intent);
        if (resultCode == RESULT_OK && requestCode == FILECHOOSER_RESULTCODE) {
            if (null == uploadMessage)
                return;
            final boolean isCamera;
            if (intent == null) {
                isCamera = true;
            } else {
                final String action = intent.getAction();
                if (action == null) {
                    isCamera = false;
                } else {
                    isCamera = action
                            .equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                }
            }
            Uri result;
            if (isCamera) {
                result = imageUri;
            } else {
                result = intent == null ? null : intent.getData();
            }
            uploadMessage.onReceiveValue(result);
        } else {
            uploadMessage.onReceiveValue(null);
        }
        uploadMessage = null;
    }

Любая помощь будет оценена ...

Джо.

1
nl ja de
Я пытаюсь что-то подобное, но я пропускаю много импорта, не могли бы вы добавить?
добавлено автор diegueus9, источник
Поскольку я не нашел другого решения в сети, я просто конвертирую свои изображения в контент схемы (из файла) с помощью ContentResolver, это решает мои проблемы. Однако я все еще ищу ответ, почему он работает над android> 3, а не в 2.3, и если это более простой способ ???. Благодарю.
добавлено автор Joe S, источник

1 ответы

Я встретил ту же проблему, но я нашел решение самостоятельно после долгого исследования.

На Android 2.3.3 веб-просмотр не поддерживает протокол Uri с файловым протоколом (файл: ///). Мы должны преобразовать Uri изображения в протокол контента Uri (content: ///) перед вызовом uploadMessage.onReceiveValue. Паразитный файл imageFilePath в нижнем коде - это абсолютный путь к файлу изображения, снятому камерой.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
   //super.onActivityResult(requestCode, resultCode, intent);
    if (resultCode == RESULT_OK && requestCode == FILECHOOSER_RESULTCODE) {
        if (null == uploadMessage)
            return;
        final boolean isCamera;
        if (intent == null) {
            isCamera = true;
        } else {
            final String action = intent.getAction();
            if (action == null) {
                isCamera = false;
            } else {
                isCamera = action.equals(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            }
        }
        Uri result;
        if (isCamera) {
            **String mediaUri =MediaStore.Images.Media.insertImage(getContentResolver(),imageFilePath,"","");
            result = Uri.parse(mediaUri);**
        } else {
            result = intent == null ? null : intent.getData();
        }
        uploadMessage.onReceiveValue(result);
    } else {
        uploadMessage.onReceiveValue(null);
    }
    uploadMessage = null;
}
0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)